java集合笔记

news/2024/4/19 17:46:29/文章来源:https://blog.csdn.net/qq_45789558/article/details/130330056

集合分为两大类:List Set

1.Collection是单例集合的顶层接口,所有方法被List和Set集合共享

2.常见成员方法:

 Add clear remove contains isEmpty size

LIst:有索引 有序 可重复

set:无索引 无序 不可重复

Collection的遍历方式

迭代器遍历

Iterator<String> it = coll.iterator();//3.利用循环不断的去获取集合中的每一个元素while (it.hasNext()){//4.next方法的两件事情:获取元素并移动指针String str = it.next();System.out.println(str);}

细节注意

1.报错NoSuchElementException 移动到最后一位还移动就会报错

2.迭代器遍历完毕,指针不会复位(需要复位 重新获取迭代去对象)

3.循环中只能用一次next方法

4.迭代器遍历时,不能用集合的方法进行增加或者删除

5.迭代器在遍历集合的时候是不依赖索引的

增强for遍历

增强for的底层就是迭代器,为了简化迭代器的代码书写的

它是jdk5之后出现的,其内部原理就是一个iterator迭代器

所有的单例集合和数组才能用增强for进行遍历

格式

for (String s : coll) {System.out.println();}

细节

修改增强for变量,不会改变集合中原本的数据

Lambda表达式遍历

得益于jdk8开始的新技术Lambda表达式、提供了一种更简单、更直接的遍历集合的方式

格式直接遍历

coll.forEach(s -> System.out.println(s));

List中常见的方法和五种遍历方式

List得特点:

1.有序:存和取得元素一直

2.有索引:可以通过索引操作元素

3.可重复:存储的元素可以重复

4.Collection的方法List都继承了

方法名称说明
void add(int index,E element)在此集合中的指定位置插入指定的元素
E remove(index)删除指定位置的元素i
E Set(int index,e element)修改索引处的元素,返回修改元素
E Get(int index)

返回指定索引处的元素

List集合的遍历方式

1.迭代器遍历  

2.列表迭代器遍历 可以添加元素

3.增强for遍历

4Lambda表达式遍历

5普通for循环(因为List中集合存在集合)想要操作索引

package mylist;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;public class A02_collectionDemo {public static void main(String[] args) {/*1.迭代器遍历2.列表迭代器遍历3.增强for遍历4Lambda表达式遍历5普通for循环(因为List中集合存在集合)*///创建集合并添加元素List<String> list=new ArrayList<>();list.add("aaa");list.add("bbb");list.add("ccc");list.add("ddd");list.add("eee");/*Iterator<String> it = list.iterator();while (it.hasNext()){String s = it.next();System.out.println(s);}*///增强forfor (String s : list) {System.out.println(s);}System.out.println("===================");list.forEach((String s)->{System.out.println(s);});//普通for方法/*for (int i = 0; i < list.size(); i++) {String s=list.get(i);System.out.println(s);}*/System.out.println("===================");//列表迭代器//在遍历的过程中,可以添加元素ListIterator<String> it=list.listIterator();while (it.hasNext()){String next = it.next();System.out.println(next);}}
}

数据结构

1.栈 :后进先出,先进后出

2.队列:先进先出,后进后出

3.数组:查询快 删除低 添加效率低

4.链表:查询慢 无论查找都是从头开始  增删快(相对数组比)

5.二叉树:

6.二叉查找树

7.平衡二叉树

8.红黑树

ArrayList集合底层原理

1.ArrayList底层是数组结构的

2.利用空参创建的集合,在底层创建一个默认长度为0的数组(elementDdata)

3.添加第一个元素时,底层会创建一个新的长度为10的数组

4.size 元素个数 下次存入的位置

5.存满时,会扩容1.5倍

6.如果一次添加多个元素,1.5倍都不能放下,则新创建数组长度以实际为准

LinkedList集合

1.底层数据结构是双链表,查询慢,增删快,但是如果操作的是首尾元素,速度也是极快的

2.有特有的API 

特有方法说明
addFirst在该列开头插入指定的元素
addLast将指定的元素追加到此列表的末尾
getFirst返回此列表的第一个元素
getLast返回此列表中的最后一个元素
removeFirst从列表中删除并返回第一个元素
removeLast从列表中删除并返回最后一个元素

ArrayList和LinkedList的区别如下:

1. ArrayList的实现是基于数组,LinkedList的实现是基于双向链表。

2. 对于随机访问,ArrayList优于LinkedList,ArrayList可以根据下标以O(1)时间复杂度对元素进行随机访问。而LinkedList的每一个元素都依靠地址指针和它后一个元素连接在一起,在这种情况下,查找某个元素的时间复杂度是O(n)

3. 对于插入和删除操作,LinkedList优于ArrayList,因为当元素被添加到LinkedList任意位置的时候,不需要像ArrayList那样重新计算大小或者是更新索引。

4. LinkedList比ArrayList更占内存,因为LinkedList的节点除了存储数据,还存储了两个引用,一个指向前一个元素,一个指向后一个元素。

集合进阶

泛型

是Jdk5中引入的特性,可以在编译阶段约束操作的数据类型,并进行检查

格式:<数据类型>

注意:泛型只能支持引用数据类型。

好处:统一数据类型

把运行时期的问题提到了编译期间 避免了强制类型转换可能出现的异常,因为在编译阶段类型就能确定下来

Java中的泛型是伪泛型

泛型细节

泛型中不能写基本数据类型

指定泛型的具体类型后,传入数据时,可以传入该类型或者子类类型

如果不写泛型,类型默认是Object

泛型可以在

泛型类

当一个类中,,某个变量的数据类型不确定时,就可以定义带有泛型的类

public class ArrayList<E>{ }

public class MyArrayList<E> {Object[] obj=new Object[10];int size;public boolean add(E e){obj[size] = e;size++;return true;}
}

泛型方法

方法中形参类型不确定时

方案1:使用类名后面定义的泛型  所有方法都能用

方案2:在方法申明上定义自己的泛型

格式 public <T>  void show(){}

泛型接口

如何使用一个带泛型的接口

方式1:实现类给出的具体类型

方式2:实现类延续泛型,创建对象时再确定

泛型的通配符和综合练习

数据结构—>树

Set系列集合

:添加的元素是无序,不重复,无索引 不能使用普通for循环遍历

Set实现类
HashSet:无序、不重复、无索引

LinkedHashSet:有序、不重复,无索引

TreeSet:可排序、不重复、无索引

利用Set系列的集合 添加字符串 并使用多种方式进行遍历

1.迭代器

2.增强for

3.Lambda表达式

 public static void main(String[] args) {//创建一个Set集合HashSet<String> s = new HashSet<>();//2.添加元素boolean aa = s.add("aa");boolean aa1 = s.add("aa");System.out.println(aa);//trueSystem.out.println(aa1);//falseSystem.out.println(s);//aa}

迭代器遍历Set

s.add("zhansan");s.add("wangwu");s.add("lisi");s.add("laoqi");Iterator<String> in = s.iterator();while (in.hasNext()){String next = in.next();System.out.println(next);}//增强for循环for (String s1 : s) {System.out.println(s1);}//lamdba表达式s.forEach((String str)-> System.out.println(str));}

Hash底层原理

HashSet集合底层采取哈希表存储数据

哈希表是一种对于增删查改数据性能都比较好的结构

哈希表组成:

JDK8之前:数组+链表

JDK8开始:数组+链表+红黑树

JDK8以后,当链表长度超过8,而且长度大于等于64时,自动转换成红黑树

如果集合中存储的是自定义对象,必须要重写hashCode和equals方法

哈希值:

  1. 根据hashCode方法计算出来的int类型的整数
  2. 该方法定义在Object类中,所有对象都可以调用,默认使用的地址值进行计算
  3. 一般情况下,会重写hashCode方法,利用对象内部的属性值计算哈希值

对象的哈希值特点

  1. 如果没有重写hashCode方法,不同对象计算出来的哈希值是不同的
  2. 如果重写了hashCode方法,不同的对象只要属性值相同,计算出来的哈希值是一样的
  3. 小部分情况下 不同的属性值或者不同的地址计算出来的哈希值也有可能一样 哈希碰撞

HashSet

1.hashset为什么存和取的顺序不一样?

2.hashSet为什么没有索引?

3.HashSet是利用什么机制保证数据去重的  HashCode equals 

4.HashSet集合的底层数据结构是什么样的?

5.HashSet添加元素过程

LinkedHashSet

1.有序、无重复、无索引

2.这里有序是指保证数据存储和取出的元素顺序一致

3.原理:底层数据结构依然是哈希表,只是每一个元素又额外的多了一个双链表的机制纪录存储的顺序

4.如果要求去重且存取有序,才能使用LinkedHashSet

TreeSet

综合案例 使用场景

原码分析

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_103346.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv1代码复现2:数据加载器构建

YOLOv1代码复现2&#xff1a;数据加载器构建 前言 ​ 在经历了Faster-RCNN代码解读的摧残后&#xff0c;下决心要搞点简单的&#xff0c;于是便有了本系列的博客。如果你苦于没有博客详细告诉你如何自己去实现YOLOv1&#xff0c;那么可以看看本系列的博客&#xff0c;也许可以帮…

【Java实战篇】Day13.在线教育网课平台--生成支付二维码与完成支付

文章目录 一、需求&#xff1a;生成支付二维码1、需求分析2、表设计3、接口定义4、接口实现5、完善controller 二、需求&#xff1a;查询支付结果1、需求分析2、表设计与模型类3、接口定义4、接口实现步骤一&#xff1a;查询支付结果步骤二&#xff1a;保存支付结果&#xff08…

VUE3如何定义less全局变量

默认已经安装好了less&#xff0c;这里不过多讲。 &#xff08;1&#xff09;首先我们需要下载一个插件依赖&#xff1a; npm i style-resources-loader --save-dev &#xff08;2&#xff09;VUE3里配置vue.config.js文件内容 代码&#xff1a; const path require("p…

HashMap如何解决哈希冲突

HashMap如何解决哈希冲突 Hash算法和Hash表Hash冲突解决哈希冲突的方法开放地址法链式寻址法再hash法建立公共溢出区 Hash算法和Hash表 Hash算法就是把任意长度的输入通过散列算法编程固定长度的输出。这个输出结果就是一个散列值。 Hash表又称为“散列表”&#xff0c;它是通…

SpringBoot中一个注解优雅实现重试Retry框架

目录: 1、简介2、实现步骤 1、简介 重试&#xff0c;在项目需求中是非常常见的&#xff0c;例如遇到网络波动等&#xff0c;要求某个接口或者是方法可以最多/最少调用几次&#xff1b;实现重试机制&#xff0c;非得用Retry这个重试框架吗&#xff1f;那肯定不是&#xff0c;相信…

Mysql 查询同类数据中某一数字最大的所有数据

方法一、将时间进行排序后再分组 该表表名为customer, park_id表示园区id&#xff0c;joined_at表示用户的加入时间&#xff0c;created_at表示用户的创建时间。 需求&#xff1a;查出每个园区中&#xff0c;最早加入园区的第一位用户 select * from (select * from custome…

数据库课设--基于Python+MySQL的餐厅点餐系统(表的设计)

文章目录 一、系统需求分析二、系统设计1. 功能结构设计2、概念设计2.2.1 bill_food表E-R图2.2.2 bills表E-R图2.2.3 categories E-R图2.2.4 discounts表 E-R图2.2.5 emp表E-R图2.2.6 food 表E-R图2.2.7 member表E-R图2.2.8 member_point_bill表E-R图2.2.9 servers表E-R图2.2.1…

操作系统考试复习—第二章 2.1 2.2程序和进程的描述

第二章 进程的描述与控制 程序&#xff1a;有序的指令集合 程序顺序执行的特征&#xff1a;1.顺序性 2.封闭性 3.可再现性(确定性) 在多道程序环境下&#xff0c;允许多个程序并发执行&#xff0c;此时他们将失去封闭性&#xff0c;并具有间断性和不可再现性的特征。为此引…

基于SGM431的电路设计问题分析

本案例中,采用SGM431芯片设计了一个过压保护电路。 这个电路初次设计,有很多的问题,下面逐一分析 1.当输入24V,测得Vref=1.59V。Vout为1.15V;,mos管关断 2。经过多次测量发现,临界值在10V到10.5之间; 当输入10.5V时,测量Vref=1.69V。vout=1.15V;mos管关断 当输入1…

智慧物联网边缘协同感知(EICS)技术方案: 低功耗无线扫描唤醒技术

物联网的传感器或控制节点通常有体积限制&#xff0c;只能使用钮扣电池、小型电池&#xff0c;甚至使用能量收集源进行运作。在许多工业应用中&#xff0c;需要人工更换电池的成本&#xff0c;特别是在难以接近地方更换所需的成本&#xff0c;使得人们更加重视降低平均电流消耗…

深度学习入门到实践:相关基础概述

绪论 深度学习&#xff08;Deep Learning&#xff09;是近年来发展十分迅速的研究领域&#xff0c;并且在人工智能的很多子领域都取得了巨大的成功。从根源来讲&#xff0c;深度学习是机器学习的一个分支&#xff0c;是指一类问题以及解决这类问题的方法。     深度学习问题…

halcon灰度积分投影/垂直积分投影

简介:关于灰度投影积分可以用到的场合很多,例如分割字符,分割尺子上的刻度等,适用于有规律的变化这些内容的检测。本文复现了论文《基于深度学习和灰度纹理特征的铁路接触网绝缘子状态检测》中灰度积分投影实现了对绝缘子缺陷位置的检测。见(图1)灰度积分垂直方向投影获得…

AI智能智能课程第四讲 -数据库领域专家

使用chatGPT让你成为数据库领域专家 作业 现在要测试电商的下单功能&#xff1a;测试员张三在公司的电商平台上下了几个单&#xff0c;现在需要验证&#xff1a;张三这个客户下单的所有订单信息&#xff0c;包含订单编号&#xff0c;商品名称&#xff0c;商品价格&#xff0c;…

分支和循环语句(2)

文章目录 3.2 for循环3.2.1 for语句的语法3.2.2 for循环中的break和continue3.2.3 for语句的循环控制变量3.2.4 一些for循环的变种3.2.5 一道笔试题 3.3 do while循环3.3.1 do语句的语法3.3.2 do语句的特点3.3.3 do while循环中的break和continue 3.4 练习3.4.1 计算 n的阶乘3.…

Compiler- 尾调用

我们还是用例子来引入本次要探讨的问题--尾调用 #include <stdio.h>int fib(int a) {return a < 2 ? 1 : fib(a - 1) fib(a - 2); }int main() {int n,result;scanf("%d",&n);result fib(n);printf("result is %d.\n",result);return 0; …

创建路由React router(使用react-router dom V6版本)

React路由 隔了很长一段时间&#xff0c;重新捡起来React学习。 发现React的路由从原来的 Switch改成了Routes。nice&#xff0c;nice&#xff0c;nice&#xff01;&#xff01;&#xff01;&#xff01; 刚开始接触确实还是有一点生疏的。之前的关于【传参】【js跳转】【跳转模…

矿井下无人值守变电所电力监控系统的探讨与产品选型

摘要&#xff1a;为了探讨井下无人值守变电所的电力监控系统技术&#xff0c;以西山煤电马兰矿为背景&#xff0c;详细阐述了井下无人值守变电所电力监控系统技术的各项基本参数&#xff0c;如额定工作电压及整机输入视在功率、交换机或监控分站的传输口、高压配电装置的传输口…

下载VMWare

1、首先登录到vmware官网 官网&#xff1a;https://www.vmware.com/ 2、点击Resource 3、找到Product Downloads 4、找到我们要下载的产品&#xff0c;点击download product 5、选择自己要下载的版本和对应的系统 6、点击去下载 7、点击download now

国云筑基“翼”气风发,天翼云以科技创新绘就数字中国蓝图

科技云报道原创。 全球新一轮技术革命方兴未艾&#xff0c;特别是以数字技术为核心的信息技术革命&#xff0c;正在实现群体突破和加快广泛深度应用。 从2017年的“促进数字经济加快成长”&#xff0c;到2019年的“壮大数字经济”&#xff0c;到2020年的“全面推进‘互联网&am…

SpringBoot的配置和日志

1.配置文件的作用和意义 配置文件中配置整个项目中所有重要的数据&#xff0c;比如&#xff1a; 1.数据库的连接信息&#xff08;包含用户名和密码的设置&#xff09;&#xff1b; 2.项目的启动端口&#xff1b; 3.第三方系统的调用秘钥等信息&#xff1b; 4.用于发现和定位问…