深入解析Java集合框架:Collection接口、List接口及其实现类详解
大家好,我们又见面了,我是你们的朋友全战军。

一、征集大纲
1.集合和数组的区别:
2.收藏收集方式:
3、常用集合分类:
Collection接口是接口对象的集合(单列集合) ├——-List接口:元素按照条目顺序保存,可重复 │——————-├ LinkedList接口实现类,链表、插入和删除、无同步、线程不安全│——————-├ ArrayList接口实现类、数组、随机访问、无同步、线程不安全│——————-└ Vector接口实现类数组、同步、线程安全│ ——————-└ 堆栈是Vector类的实现类└——-Set接口:只接收一次,不可重复,内部排序├—————— -└HashSet使用哈希表(数组)来存储元素│———— ————└LinkedHashSet链表维护元素的插入顺序└——————-TreeSet底层实现是二叉树,元素是排序的
Map接口键值对集合(双列集合) ├———Hashtable接口实现类,同步,线程安全 ├———HashMap接口实现类,无同步,线程不安全- │—————— –├ LinkedHashMap 双向链表和哈希表实现│——————–└ WeakHashMap ├——–TreeMap 红黑树对所有键进行排序└——IdentifyHashMap
二、List和Set详解: 1、List和Set的区别:
2.清单:
(1)ArrayList:底层数据结构是数组,查询快,增删改慢,线程不安全,效率高。它可以存储重复的元素(2)LinkedList。底层数据结构是链表,查询慢,增删快,线程不安全,效率高。 ,可以存储重复元素(3)Vector:底层数据结构是数组,查询快,增删改慢,线程安全,效率低,可以存储重复元素
(4总结:
3.设置:
(1)HashSet的底层数据结构是使用哈希表实现的。这些元素是无序且唯一的、线程安全且高效的。它可以存储空元素。元素的唯一性取决于存储的元素类型是否重写了hashCode()和equals()方法,以确保如果不重写这两个方法,则无法保证元素的唯一性。实现唯一性的具体比较过程:存储元素时,首先使用hash()算法函数生成一个int类型的hashCode哈希值,然后对存储的元素的hashCode值进行比较。如果hashCode值不相等,则存储的两个元素一定不相等。此时,存储的是当前新的hashCode值处的元素对象;如果hashCode相等,则存储该元素的对象仍然不一定相等。这时就会调用equals()方法来判断两个对象的内容是否相等。如果内容相等,则为同一个对象,不需要存储;如果比较的内容不相等,则需要存储不同的对象。这时就必须使用解决地址冲突的哈希算法。当前的hashCode值类似于一个新的链表。将不同的对象存储在同一个hashCode值后面,从而保证元素的唯一性。 Set实现类的集合对象中不能有重复的元素。对于HashSet也是如此。它使用标识符来确定元素的不重复。 HashSet使用一种算法来确保HashSet中的元素不重复。 HashSet使用Ha哈希算法,底层使用数组来存储数据。默认初始化容量为16,加载因子为0.75。 Object类中的hashCode()方法是所有子类都会继承该方法。该方法会使用Hash算法计算出一个Hash(散列)码值并返回。 HashSet会使用Hash码值对数组长度取模(这个模就是对象在数组中要存储的位置)。只有相同时才会判断数组中的元素和要添加的对象的内容是否相同。如果不同,将会添加。哈希算法是一种散列算法。设置 hs=new HashSet();
hs.add(o); | o.hashCode(); |当前总容量的 o% (0–15) | |没有冲突。是否发生冲突—————直接存储| |冲突发生 | False(不等于)o1.equals(o2)---------------------找个空格添加| |是(等于) 不添加和重写hashCode()方法的原则: 1、我们必须让那些我们认为相同的对象返回相同的hashCode值。 2.尽量让那些我们认为不同的对象返回不同的hashCode值。否则,就会增加发生冲突的概率。 3、尽量对hashCode值进行散列(对两个值使用异或运算可以使结果的范围更广) HashSet的实现比较简单。 HashSet相关的操作基本上都是直接调用底层HashMap的相关方法来完成。对于保存在 HashSet 中的对象,我们应该重写 hashCode() 和 equals(),因为这些对象随后会被添加到 HashSet 中。时,首先调用hashCode方法计算对象的哈希值,然后根据这个哈希值调用HashMap中的hash方法,得到的值 &(length-1) 得到存储位置的索引hashMap的transient Entry[]表中的对象,然后找到数组中索引位置保存的对象,调用equals方法比较两个对象是否相等。如果它们相等,那么它们就不相等。补充一下,注意:因此,HashSet的集合对象中要存储的自定义类必须覆盖hashCode()和equals()方法,以保证集合中的元素不重复。重写equals()和hashCode()方法时,让同一个对象的hashCode()方法返回相同的值,重写equals()方法,然后确定其内容。为了保证效率,重写hashCode()方法时,尽量让不同的对象返回不同的Hash code值。
如果数组中的元素和要添加的对象的hashCode()返回相同的哈希值(同一个对象),则会使用equals()方法来判断两个对象的内容是否相同。
(2)LinkedHashSet底层数据结构是由链表和哈希表实现的。链表保证元素的顺序与存储顺序一致,哈希表保证元素的唯一性。线程不安全且高效。 (3)TreeSet底层数据结构是使用二叉树实现的。元素是唯一的且已排序。唯一性还需要重写 hashCode 和 equals() 方法。二叉树结构保证了元素的有序性。根据构造方式不同,分为自然排序(无参数构造)和比较器排序(有参数构造)。自然排序要求元素必须实现Compareable接口并重写内部的compareTo()方法。元素通过比较返回 int 值。确定排序顺序,返回0表示两个对象相同,不需要存储;比较器需要在TreeSet初始化时传入一个实现Comparator接口的比较器对象,或者使用匿名内部类创建一个新的Comparator对象并在里面重写compare()方法; (4)总结:Set与Collection有完全相同的接口,因此它没有任何额外的功能,不像前面两种不同的List。其实Set就是Collection,只是行为不同。 (这是继承和多态性的典型应用:表现出不同的行为。)Set不保存重复元素。 Set Set 中存储的每个元素都必须是唯一的,因为 Set 不存储重复的元素。添加到Set中的元素必须定义equals()方法以保证对象的唯一性。 Set 和 Collection 具有完全相同的接口。 Set 接口不保证元素的顺序得到维护。
4.列表和设置摘要:
(1)List和Set都是继承自Collection接口,但Map不是。 (2)List的特点:元素按顺序排列,元素可以重复。 Set的特点:元素不按顺序排列,元素不能重复,重复的元素会覆盖它,(注:虽然元素不按顺序排列,但元素在Set中的位置是由HashCode决定的)元素,并且它的位置实际上是固定的。添加到Set中的对象必须定义equals()方法,另外,列表支持for循环,即遍历下标,也可以使用迭代器。设定只能使用迭代,因为它是无序的,无法使用下标来获取想要的Value。) (3)Set和List的比较: Set:检索元素效率低,删除和插入高效,插入和删除不会造成位置的影响要改变的元素。 List:与数组类似,List 可以动态增长,并且查找元素的效率很高。插入和删除元素效率很低,因为它会导致其他元素的位置发生变化。 (4)ArrayList和LinkedList的区别及适用场景 ArrayList: 优点:ArrayList实现了一种基于动态数组的数据结构。因为地址是连续的,一旦存储了数据,查询操作效率就会比较高(在内存中是连续放的)。缺点:由于地址连续,而且ArrayList需要移动数据,所以插入和删除操作效率相对较低。
LinkedList:优点:LinkedList是基于链表的数据结构,而且地址是任意的,所以在开辟内存空间时不需要等待连续的地址。对于新增和删除操作add和remove来说,LinedList更有优势。 LinkedList适合需要头尾操作或者插入指定位置的场景。缺点:由于LinkedList需要移动指针,所以查询操作性能比较低。适用场景分析:需要访问数据时使用ArrayList,需要多次增删改查数据时使用LinkedList。
ArrayList和Vector的区别及适用场景 ArrayList有三种构造方法:
代码语言:javascript
复制
public ArrayList(int initialCapacity)//构造一个具有指定初始容量的空列表。
public ArrayList() //默认构造一个初始容量为10的空列表。
public ArrayList(Collection extends E> c)//构造一个包含指定 collection 的元素的列表
Vector有四种构造方法:
代码语言:javascript
复制
public Vector()//使用指定的初始容量和等于0的容量增量构造一个空向量。
public Vector(int initialCapacity)//构造一个空向量,使其内部数据数组的大小,其标准容量增量为零。
public Vector(Collection extends E> c)//构造一个包含指定 collection 中的元素的向量
public Vector(int initialCapacity,int capacityIncrement)//使用指定的初始容量和容量增量构造一个空的向量
ArrayList和Vector都是使用数组实现的。主要有以下三个区别: (1) Vector 是多线程安全的。线程安全是指多个线程访问相同的代码,不会产生不确定的结果。 ArrayList 不是。这一点从源码中就可以看出。 Vector类中很多方法都用synchronized修饰,导致Vector在效率上无法与ArrayList相比; (2) 均采用线性连续空间存储。元素,但是当空间不足时,两个类的添加方式不同。 *(3)*Vector可以设置增长因子,但ArrayList不能。 *(4)*Vector是一种古老的动态数组,它是线程同步的,效率很低。一般不推荐使用它。适用场景分析: 1、Vector是线程同步的,所以也是线程安全的,而ArrayList是线程异步的,不安全。如果不考虑线程安全因素,一般使用ArrayList效率更高。 2、如果集合中的元素数量大于当前集合数组的长度,则使用集合中数据量比较大的Vector有一定的优势。
.TreeSet是通过二差树(红黑树的树数据结构)实现的。 Treeset中的数据是自动排序的,不允许有空值2.HashSet。它是通过哈希表实现的。 HashSet中的数据是无序的。可以输入空值,但只能输入一个空值。两者中的值不能重复,就像数据库中唯一的约束3.HashSet要求对象必须实现HashCode()方法。插入的对象由 hashcode 代码标识。内容相同的String对象具有相同的hashcode,因此插入的内容不能重复。但同一个类的对象可以放入不同的实例中
适用场景分析:HashSet是基于Hash算法实现的,其性能通常优于TreeSet。对于为快速搜索而设计的Set,我们通常应该使用HashSet。只有当我们需要排序的功能时,我们才使用TreeSet。 (5) 何时使用:
3. 地图详细说明:
Map用于保存具有映射关系的数据。 Map保存两组数据:key和value。它们可以是任何引用类型的数据,但键不能重复。因此,通过指定key就可以检索到对应的value。
(一)、请注意! ! ! ,Map没有继承Collection接口,Map提供了key到value的映射,可以通过“key”来搜索“value”。一个Map不能包含相同的key,并且每个key只能映射一个value。 Map 界面提供了三种集合视图。 Map的内容可以看成是一组键集,一组值集,或者一组键值映射。 (2)地图:
(3)HashMap和HashTable的比较:
(4)树形图:
(5)Map的其他类:IdentityHashMap和HashMap的具体区别。 IdentityHashMap使用==来判断两个键是否相等,而HashMap使用equals方法来比较键值。有什么区别?对于==来说,如果作用于基本数据类型的变量,则直接比较存储的“值”是否相等;如果作用于引用类型的变量,则比较所指向对象的地址。对于equals方法,注意:equals方法不能作用于基本数据类型的变量。如果没有重写equals方法,则比较引用类型变量指向的对象的地址;类,例如 String、Date 等。如果被覆盖,则会比较所指向对象的内容。
(6)总结:HashMap非线程安全 HashMap:基于哈希表实现。使用HashMap要求添加的键类明确定义hashCode()和equals()[hashCode()和equals()可以被重写]。为了优化HashMap空间的使用,可以调整初始容量和负载因子。
TreeMap:基于红黑树的非线程安全实现。 TreeMap 没有调整选项,因为树始终是平衡的。
适用场景分析:HashMap和HashTable:HashMap去掉了HashTable的contains方法,但增加了containsValue()和containsKey()方法。 HashTable是同步的,而HashMap是异步的,并且比HashTable更高效。 HashMap 允许空键值,但 HashTable 不允许。
HashMap:适合Map中元素的插入、删除和定位。 Treemap:适合按自然顺序或自定义顺序遍历键。
5、线程安全集合类和非线程安全集合类LinkedList、ArrayList、HashSet是非线程安全的,Vector是线程安全的; HashMap是非线程安全的,HashTable是线程安全的; StringBuilder是非线程安全的,而StringBuffer是线程安全的。的。
数据结构ArrayXxx:底层数据结构是数组,查询快,增删改慢。 LinkedXxx:底层数据结构是链表,查询慢,增删快。 HashXxx:底层数据结构是哈希表。取决于两个方法:hashCode() 和 equals() TreeXxx:底层数据结构是二叉树。排序的两种方式:自然排序和比较器排序
java中collection,java中collection和collections
Java线程池详解:ExecutorService接口及其实现类的创建与使用
java集合框架中的map,java中的集合分为collection和map两大类
java外面的Arrays Array 是什么相关 Collection和Collections (java外面try catch 里面也try catch)
是什么相关 java外面的Arrays Collection和Collections Array (是什么相关部门在管工厂老板的)