菜鸟先飞之JAVA_集合

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Happy_cloudlife/article/details/77504542
集合框架

集合的由来
数组长度是固定,当添加的元素超过了数组的长度时需要对数组重新定义。java内部给我们提供了集合类,能存储任意对象,长度是可以改变的,随着元素的增加而增加,随着元素的减少而减少。

数组和集合的区别
区别1 :
数组既可以存储基本数据类型,又可以存储引用数据类型,基本数据类型存储的是值,引用数据类型存储的是地址值
集合只能存储引用数据类型(对象)集合中也可以存储基本数据类型,但是在存储的时候会自动装箱变成对象
区别2:
数组长度是固定的,不能自动增长
集合的长度的是可变的,可以根据元素的增加而增长

数组和集合什么时候用
1,如果元素个数是固定的推荐用数组
2,如果元素个数不是固定的推荐用集合

Collection集合

Collection集合的概述
Collection 层次结构 中的根接口。Collection 表示一组对象,这些对象也称为 collection 的元素。JDK 不提供此接口的任何直接 实现:它提供更具体的子接口(如 Set 和 List)实现。

Collection集合的方法
boolean add(E e)
确保此 collection 包含指定的元素(可选操作)。如果此 collection 由于调用而发生更改,则返回 true。(如果此 collection 不允许有重复元素,并且已经包含了指定的元素,则返回 false。)
boolean remove(Object o)
从此 collection 中移除指定元素的单个实例。底层依赖equals方法进行比较。
void clear()
移除此 collection 中的所有元素(可选操作)。
boolean contains(Object o)
如果此 collection 包含指定的元素,则返回 true。底层依赖equals方法进行比较。
boolean isEmpty()
如果此 collection 不包含元素,则返回 true。
int size()
返回此 collection 中的元素数。
Object[] toArray()
返回包含此 collection 中所有元素的数组。
boolean addAll(Collection c)
将指定 collection 中的所有元素都添加到此 collection 中(可选操作)。
boolean removeAll(Collection c)
移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。
boolean containsAll(Collection c)
如果此 collection 包含指定 collection 中的所有元素,则返回 true。
boolean retainAll(Collection c)
仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。

迭代器

迭代器概述
集合是用来存储元素,存储的元素需要查看,那么就需要迭代(遍历)

迭代器原理
迭代器原理:迭代器是对集合进行遍历,而每一个集合内部的存储结构都是不同的,所以每一个集合存和取都是不一样,那么就需要在每一个类中定义hasNext()和next()方法,这样做是可以的,但是会让整个集合体系过于臃肿,迭代器是将这样的方法向上抽取出接口,然后在每个类的内部,定义自己迭代方式,这样做的好处有二,第一规定了整个集合体系的遍历方式都是hasNext()和next()方法,第二,代码有底层内部实现,使用者不用管怎么实现的,会用即可

LIst集合

List集合的概述
有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。

List集合的特有功能概述
void add(int index,E element)
在列表的指定位置插入指定元素(可选操作)。将当前处于该位置的元素(如果有的话)和所有后续元素向右移动(在其索引中加 1)。
E remove(int index)
移除列表中指定位置的元素(可选操作)。将所有的后续元素向左移动(将其索引减 1)。返回从列表中移除的元素。
E get(int index)
返回列表中指定位置的元素。
E set(int index,E element)
用指定元素替换列表中指定位置的元素(可选操作)。

List的三个子类的特点
ArrayList:
底层数据结构是数组,查询快,增删慢。线程不安全,效率高。
Vector:
底层数据结构是数组,查询快,增删慢。线程安全,效率低。
LinkedList:
底层数据结构是链表,查询慢,增删快。 线程不安全,效率高。
Vector和ArrayList的区别
Vector是线程安全的,效率低
ArrayList是线程不安全的,效率高
共同点:都是数组实现的
ArrayList和LinkedList的区别
ArrayList底层是数组结果,查询和修改快
LinkedList底层是链表结构的,增和删比较快,查询和修改比较慢
共同点:都是线程不安全的
List有三个子类,我们到底使用谁呢?
Vector相对ArrayList查询慢(线程安全的),Vector相对LinkedList增删慢(数组结构)。查询多用 ArrayList、增删多用LinkedList、如果都多ArrayList。

Vector类

Vector类的概述
Vector 类可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。但是,Vector 的大小可以根据需要增大或缩小,以适应创建 Vector 后进行添加或移除项的操作。Vector跟ArrayList是类似的,内部实现也是动态数组,随机访问效率高。Vector是线程安全的。

Vector类特有功能
public void addElement(E obj)
将指定的组件添加到此向量的末尾,将其大小增加 1。如果向量的大小比容量大,则增大其容量。
public E elementAt(int index)
返回指定索引处的组件。
public Enumeration elements()
返回此向量的组件的枚举。返回的 Enumeration 对象将生成此向量中的所有项。

ArrayList类

ArrayList类的概述
List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。(此类大致上等同于 Vector 类,除了此类是不同步的。)ArrayList内部实现采用动态数组,当容量不够时,自动扩容至(当前容量1.5+1)。元素的顺序按照插入的顺序排列。默认初始容量为10。 contains复杂度为O(n),add复杂度为分摊的常数,即添加n个元素需要O(n)时间,remove为O(n),get复杂度为O(1) 随机访问效率高,随机插入、删除效率低。ArrayList是非线程安全的。

LinkedList类

LinkedList类的概述
List 接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括 null)。除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列或双端队列。LinkedList内部使用双向链表实现,随机访问效率低,随机插入、删除效率高。可以当作堆栈、队列、双向队列来使用。LinkedList也是非线程安全的。

LinkedList类的特有方法
public void addFirst(E e)
将指定元素插入此列表的开头。
public void addLast(E e)
将指定元素添加到此列表的结尾。
public E getFirst()
返回此列表的第一个元素。
public E getLast()
返回此列表的最后一个元素。
public E removeFirst()
移除并返回此列表的第一个元素。
public E removeLast()
移除并返回此列表的最后一个元素。
public E get(int index);
返回此列表中指定位置处的元素。

set集合

set集合的概述
一个不包含重复元素的 collection。并且可以包含一个 null 元素。无索引,不可以重复,无序(存取不一致)。其实现类有HashSet,继承于它的接口有SortedSet接口等。Set中提供了加、减、和交等集合操作函数。Set不能按照索引随机访问元素,这是它与List的一个重要区别。

HashSet类

HashSet类的概述
此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。HashSet内部是使用HashMap实现的,HashSet的key值是不允许重复的,如果放入的对象是自定义对象,那么最好能够同时重写hashCode与equals函数,这样就能自定义添加的对象在什么样的情况下是一样的,即能保证在业务逻辑下能添加对象到HashSet中,保证业务逻辑的正确性。另外,HashSet里的元素不是按照顺序存储的。HashSet是非线程安全的。

HashSet保证元素唯一性的原理
我们使用Set集合都是需要去掉重复元素的,如果在存储一个新的元素的时候逐个equals()比较。效率较低、哈希算法提高了去重复的效率,降低了使用equals()方法的次数。当HashSet调用add()方法存储对象的时候, 先调用对象的hashCode()方法得到一个哈希值, 然后在集合中查找是否有哈希值相同的对象。如果没有哈希值相同的对象就直接存入集合。如果有哈希值相同的对象, 就和哈希值相同的对象逐个进行equals()比较,比较结果为false就存入, true则不存。

HashSet存储自定义对象的注意事项
1、类中必须重写hashCode()和equals()方法。
2、hashCode(): 属性相同的对象返回值必须相同, 属性不同的返回值尽量不同(提高效率)
3、equals(): 属性相同返回true, 属性不同返回false,返回false的时候存储。

LinkedHashSet类

LinkedHashSet的概述
可预知迭代顺序的 Set 接口的哈希表和链接列表实现。LinkedHashSet可以保证怎么存就怎么取。底层是链表实现的,是set集合中唯一一个能保证怎么存就怎么取的集合对象。因为是HashSet的子类,所以也是保证元素唯一的,与HashSet的原理一样。LinkedHashSet继承自HashSet,它与HashSet不同的是,LinkedHashSet存储元素的顺序是按照元素的插入顺序存储的。LinkedHashSet也是非线程安全的。

TreeSet类

TreeSet类的概述
使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。如果是存储的元素是自定义对象,那么需要实现Comparable接口。TreeSet也是非线程安全的。

TreeSet类的特点
TreeSet是用来排序的, 可以指定一个顺序, 对象存入之后会按照指定的顺序排列

TreeSet保证元素唯一和自然排序的原理
1、自然顺序(Comparable)
1)TreeSet类的add()方法中会把存入的对象提升为Comparable类型
2)调用对象的compareTo()方法和集合中的对象比较
3)根据compareTo()方法返回的结果进行存储,底层是二叉树结构,返回0不存储、返回负数存储左边、整数存储右边。
2、比较器顺序(Comparator)
1)创建TreeSet的时候可以制定 一个Comparator
2)如果传入了Comparator的子类对象, 那么TreeSet就会按照比较器中的顺序排序
3)add()方法内部会自动调用Comparator接口中compare()方法排序
4)调用的对象是compare方法的第一个参数,集合中的对象是compare方法的第二个参数
3、两种方式的区别
1)TreeSet构造函数什么都不传, 默认按照类中Comparable的顺序(没有就报错ClassCastException)
2)TreeSet如果传入Comparator, 就优先按照Comparator


Map集合

Map集合的概述
将键映射到值的对象。Map集合提供了按照“键值对”存储元素的方法,一个键唯一映射一个值。集合中“键值对”整体作为一个实体元素时,类似List集合,但是如果分开来年,Map是一个两列元素的集合:键是一列,值是一列。与Set集合一样,Map也没有提供随机访问的能力,只能通过键来访问对应的值。Map的每一个元素都是一个Map.Entry,这个实体的结构是< Key, Value >样式。

Map集合的功能
添加功能
V put(K key,V value):添加元素。
如果键是第一次存储,就直接存储元素,返回null;如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值。
删除功能
void clear():移除所有的键值对元素
V remove(Object key):根据键删除键值对元素,并把值返回
判断功能
boolean containsKey(Object key):判断集合是否包含指定的键
boolean containsValue(Object value):判断集合是否包含指定的值
boolean isEmpty():判断集合是否为空
获取功能
Set<Map.Entry<K,V>> entrySet();将map集合的键值对看作为一个对象存储在Set集合中。
V get(Object key):根据键获取值
Set<K> keySet():获取集合中所有键的集合
Collection<V> values():获取集合中所有值的集合
int size():返回集合中的键值对的个数

HashMap接口的概述
基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。但它是非线程安全的。

Hashtable的概述
Hashtable也是Map的实现类,继承自Dictionary类。它与HashMap不同的是,它是线程安全的。而且它不允许key为null,value也不能为null。由于它是线程安全的,在效率上稍差于HashMap。

HashMap和Hashtable的区别
Hashtable是JDK1.0版本出现的,是线程安全的,效率低。HashMap是JDK1.2版本出现,是线程不安全的,效率高。
Hashtable不可以存储null键和null值,HashMap可以存储null键和null值。

LinkedHashMap的概述
Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序。底层是链表实现的可以保证怎么存就怎么取。

TreeMap类的概述
基于红黑树(Red-Black tree)的 NavigableMap 实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。

集合框架图

猜你喜欢

转载自blog.csdn.net/Happy_cloudlife/article/details/77504542