容器类
容器可以存储任意类型数据,可以存储多个数据,但是只能存储引用数据类型,因此存储基本数据类型时,会发生自动装箱。
collection接口
collection接口是容器类的父接口,一些collection允许重复的元素,一些不允许重复的元素。
set子接口的特点是无序不可重复。
list子接口的特点是有序可重复。
常用方法:
- void clear() 移除此 collection 中的所有元素(可选操作)。
- boolean contains(Object o ) 判断是否包含。
- boolean isEmpty()判断是否为空。
- boolean remove(Object o) 移除指定数据元素。
- boolean removeAll(Collection<?> c) 移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。
- boolean retainAll(Collection<?> c) 求交集,保存两个容器都有的数据。
- int size() 返回此 collection 中的元素数。
- Object[] toArray()转换为数组。
遍历方法:
- 增强for|for…each
- 迭代器
//迭代器
/*
* 1.获取迭代某一个容器的迭代器对象
* 2.判断是否存在下一个可迭代的元素 hasNext() ->true,false
* 3.返回下一个元素 next() ->下一个元素
*/
Iterator<String> it=coll.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
泛型:
- 泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。
- 泛型提高稳定性和可读性,规定容器中所有数据的数据类型。
list接口
list接口的特点:有序可重复,有索引。新增了一些根据索引操作的方法。
常用方法:
- void add(int index, E element) 在列表的指定位置插入指定元素(可选操作)。
- E get(int index) 返回列表中指定位置的元素。
- int indexOf(Object o) 返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1。
- int lastIndexOf(Object o) 返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1。
- ListIterator listIterator() 返回此列表元素的列表迭代器(按适当顺序)。
- ListIterator listIterator(int index) 返回列表中元素的列表迭代器(按适当顺序),从列表的指定位置开始。
- E remove(int index) 移除列表中指定位置的元素(可选操作)。
- List subList(int fromIndex, int toIndex)返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分视图。
遍历方法:
- 1.普通for
- 2.for…each
- 3.iterator
- 4.ListIterator
容器类之一ArrayList(重要)
是List的实现类,因此有序且可重复。线程不安全的容器类。
底层: 数组(可变数组),数组在内存中是连续的内存空间。
优点: 查询,随机访问效率高。
缺点: 增删效率低(改变容量涉及到数组的拷贝)。
动态扩容:通过调用Arrays.copyOf()方法进行动态扩容,扩容后新容器的大小是原容量的1.5倍。
第一次添加数据初始容量为10,加载因子(0~1):1 。
新增方法:使用List定义的方法。
Vector 向量
底层实现和特点与ArrayList类似,和ArrayList的区别主要是:
- 1)Vector线层安全的容器类|同步的,效率较低。
- 2)扩容原容量的2倍。
LinkedList容器类
底层:双向链表实现。
优点:增删效率较高。
缺点:查询或者随机获取效率较低。
新增方法:新增加了一些链头和链表尾的操作的方法(都具有见名知意)。
常用方法:
- void addFirst(E e) 将指定元素插入此列表的开头。
- void addLast(E e) 将指定元素添加到此列表的结尾。
- E getFirst() 返回此列表的第一个元素。
- E getLast() 返回此列表的最后一个元素。
- boolean offerFirst(E e) 在此列表的开头插入指定的元素。
- boolean offerLast(E e) 在此列表末尾插入指定的元素。
Set接口
数据是无序的不可重复的,允许null,但是null值只能存在一个。没有新增方法,与Collection中功能相同
遍历方法:
- 1.增强for
- 2.迭代器
HashSet容器类
底层:由哈希表结构存储(数组+链表+红黑树)。
优点:查询,增加,删除效率较高。
缺点:无序。
扩容:默认初始容量16,加载因子0.75 ,扩容是原容量的2倍。
HashSet存储引用数据类型去重:
- 需要重写hashCode()方法和equals()方法进行自定义类型去重。如果不重写hashCode(),可以遇到没有equals方法这一步就医过滤掉不是相同的对象了,直接存储,不会equals方法比较。hashCode()相同的对象有可能相同可以不相同,进一步比较equals()。hashCode()不相同的对象肯定不相同,过滤掉一写不相同的对象,不需要进一步比较equals方法效率较高。
哈希底层存储数据:
- 对数据进行hash算法算出存放(数组)的位置。位置=数据%9;
- 把当期那数据存放在对应的桶中,存放之前先判断桶中是否存在数据,如果没有直接存放数据,如果存在数据,拿桶中的数据和该数据比较是否相同,如果相同就去重不存放,如果不相同就存放。
- 桶中多个数据用链表结构链接。
- 如果桶中数据超过八个,用红黑树存放。
Comparable接口
内部比较器|自然排序,重写compareTo()方法,方法中自定义比较规则。一般内部比较器都会指定泛型,因为能够确定比较的是什么类型的数据。
Comparator接口
外部比较器|自定义比较器|自定义排序:重写compare()方法,方法中自定义比较规则。
TreeSet容器类
是由TreeMap维护的。
底层:红黑树结构实现。
优点:默认升序排序(默认自然排序|指定排序)。
缺点:么有HashSet效率高。
注意:
存储引用数据类型的时候(引用数据类型对象的排序,引用数据类型对象的去重):
引用数据类型
- 1)实现内部比较器
- 2)自定义外部比较器