Collection接口常用方法
方法 | 描述 |
---|---|
add(Object obj) | 添加元素 |
addAll(Collection coll) | 添加一个集合 |
int size() | 获取有效元素个数 |
void clear() | 清空集合 |
boolean isEmpty() | 是否为空集合 |
boolean contains(Object obj) | 是否包含某个元素,是通过元素的equals方法来判断是否是同一个对象 |
boolean containsAll(Collection c) | 是否包含某个元素,也是调用元素的equals方法来比较的。用两个两个集合的元素逐一比较 |
boolean remove(Object obj) | 删除,通过元素的equals方法判断是否是要删除的那个元素。只会删除找到的第一个元素 |
boolean removeAll(Collection coll) | 删除,取当前集合的差集 |
boolean retainAll(Collection c) | 取两个集合的交集,把交集的结果存在当前的集合中,不影响c |
boolean equals(Object obj) | 集合是否相等 |
Object [] toArray() | 转换成对象数组 |
hashCode() | 获取集合对象的哈希值 |
List接口常用方法
特点:可重复,允许null
方法 | 描述 |
---|---|
void add(int index, Object ele) | 在index位置插入ele元素 |
boolean addAll(int index, Collection eles) | 从index位置开始将eles中的所有元素添加进来 |
Object get(int index) | 获取指定index位置的元素 |
int indexOf(Object obj) | 返回obj在集合中首次出现的位置 |
int lastIndexOf(Object obj) | 返回obj在当前集合中末次出现的位置 |
Object remove(int index) | 移除指定index位置(0是第一个元素)的元素,并返回此元素 |
Object set(int index, Object ele) | 设置指定index位置的元素为ele |
List subList(int fromIndex, int toIndex) | 返回从fromIndex到toIndex位置的子集合 |
三种遍历方式
public void test(){
public statis void main(String[] args){
ArrayList list = new ArrayList();
list.add(123);
list.add(456);
list.add("AA");
//方式一:Iterator迭代器方式
Iterator iterator = list.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
//方式二:增强for循环,底层就是Iterator迭代器
for(Object obj : list){
System.out.println(obj);
}
//方式三:普通for循环
for(int i = 0;i < list.size();i++){
System.out.println(list.get(i));
}
}
}
List实现类之ArrayList
- 可重复,允许null,添加顺序和输出顺序一致
- ArrayList是List接口的典型实现类、主要实现类
- 本质上,ArrayList是对象引用的一个”变长”数组
- Array Listi的JDK 1.8之前与之后的实现区别?
JDK 1.7:ArrayList像饿汉式,直接创建一个初始容量为10的数组
JDK 1.8:ArrayList像懒汉式,一开始创建一个长度为0的数组,当添加第一个元素时再创建一个始容量为10的数组 - 线程不安全,查询速度快,增删较慢
- 扩容机制
每次按照原来容量的1.5倍扩容
List实现类之LinkedList
新增方法:
方法 | 描述 |
---|---|
void addFirst(Object obj) | 在链表头部插入一个元素 |
void addLast(Object obj) | 在链表尾部添加一个元素 |
Object getFirst() | 获取第一个元素 |
Object getlast)(), | 获取最后一个元素 |
Object removeFirst() | 删除头,获取元素并删除 |
Object removeLast() | 删除尾 |
- 可重复,允许null,添加顺序和输出顺序不一致,可以当双向队列使用
- 对与对于频繁的插入和删除元素操作,建议使用LinkedList类,效率更高
- Linkedlist:双向链表,内部没有声明数组,而是定义了Node类型的frst和last,用于记录首末元素。同时,定义内部类Node,作为 Linkedlist中保存数据的基本结构。Node除了保存数据,还定义了两个变量:
prev变量记录前一个元素的位置
next变量记录下一个元素的位置 - LinkedList 是非线程安全的,并发环境下,多个线程同时操作 LinkedList,会引发不可预知的错误
List实现类之Vector
- Vector大多数操作与ArrayList相同,区别在于Vector是线程安全的,性能比ArrayList低
- 在各种list中,最好把ArrayList作为默认选择。当插入、删除频繁时,使用LinkedList;Vector总是比ArrayList慢,所以尽量避免选择使用。
- JDK 7.0和JDK 8.0中通过Vector()构造器创建对象时,底层都创建了长度为10的数组。
- 扩容机制
默认扩容为原来的数组长度的2倍。
Set
特点:无序,不可重复,有且仅有添加一个null,不能通过索引遍历
遍历:
两种方式:
方式一:迭代器
方式二:增强for
Set实现类之HashSet
底层实际是HashMap,由于使用的是Map,那么map键值对中的key是存储的数据,而map中的value值始终是PRESENT(共享)
HashSet
的底层结构:哈希表=数组+链表+红黑树
从JDK1.8开始,如果链表的长度超过8且数组长度大于64,链表会自动转换成红黑树,小于6时转换为链表
当链表长度为8时,数组长度小于64时,会对数组进行原来的两倍扩容
HashSet
存储的原理:
- 在向
HashSet
中存储对象时,会先调用这个对象的hashCode()
((h = key.hashCode())^(h>>>16)
来获取它的哈希值,如果集合中没有任何一个对象的哈希值与这个要存储的对象的哈希值相同,则直接存储新元素- 如果这个对象的哈希值与集合中的某个对象的哈希值相同,就会调用
equals()
来比较内容,如果结果为true
,则不存储;反之,则存储
HashSet
的扩容:
- 在创建
HashSet
会获取一个加载因子DEFAULT_LOAD_FACTOR
是0.75- 在添加第一个元素时,会创建一个长度为16的数组,并设 置临界值为12(16 * 0.75),在添加第12个元素后,会将数组的大小和临界值都扩大到原来的两倍
Set实现类之LinkedHashSet
同时也是HashSet的子类
底层是一个LinkedHashMap,数据结构是依然哈希表,只是每个元素又额外的多了一个双链表的机制记录存储的顺序。由于LinkedHashSet维持了一个双向链表所以输入和输出一致(有序)
不允许添加重复元素,有序,无索引
Set实现类值TreeSet
不允许添加重复元素、无索引、可排序
可排序:按照元素的大小默认升序(有小到大)排序。
TreeSet集合底层是基于红黑树的数据结构实现排序的,增删改查性能都较好。
注意:TreeSet集合是一定要排序的,可以将元素按照指定的规则进行排序。
默认排序规则:
1、数值类型:Integer , Double,官方默认按照大小进行升序排序。
2、字符串类型:默认按照首字符的编号升序排序。
3、自定义类型:TreeSet无法直接排序, 需要制定排序规则:1、实现
Comparable
接口, 并重写compareTo
方法来定制比较规则
2、有参数构造器Comparator<>()
自带比较器对象,来进行定制比较规则, 并且该方法如果和方法1同时出现, 会优先使用此方法的比较规则(就近)。
Collections工具类
Collections是一个操作
Set
、List
、Map
等集合的工具类
Collections中提供了一个一系列静态的方法对集合元素进行排序、查询和修改等操作
常用方法:
- 排序:
方法 | 描述 |
---|---|
reverse(List) | 反转List中的元素 |
shuffle(List) | 对List中的元素进行随机排序 |
sort(List) | 按照元素的自然排序对指定List集合按升序排序 |
sort(List,Comparator) | 根据指定的Comparator产生的顺序对List集合进行排序 |
swap(List l,int i, int j) | 将指定List集合中的i 处元素和j 处元素进行交换 |
- 查找、替换
方法 | 描述 |
---|---|
Object max/min(Collecton) | 根据元素的自然排序,返回给指定集合中的最大/小元素 |
Object max/min(Coolection,Comparator) | 根据Comparator指定的排序规则,返回给指定集合中的最大/小元素 |
int frequency(Collection,Object) | 返回指定集合中指定元素出现的次数 |
boolean replaceAll(List list, T oldVal, T newVal) | 使用新值替换掉List对象的所有旧值 |
void copy(List dest,List src) | 将src 中的内容复制到dest 中 |
- 添加
方法 | 描述 |
---|---|
addAll(Collection c, E…e) | 将所有元素E 加入到集合c 中 |