Java集合总结
collection
- collection实现子类可以存放多个元素,每个元素可以是Object
- 有些collection的实现类,可以存放重复的元素,有些不可以
- 有些Collection的实现类,有些是有序的(List),有些不是有序(Set)
- Collection接口没有直接的实现子类,是通过它的子接口Set 和 List来实现的
指令
Collections
命令 | 解释 |
---|---|
add | 添加单个元素 |
remove | 删除指定元素 |
contains | 查找元素是否存在 |
size | 获取元素个数 |
isEmpty | 判断是否为空 |
clear | 清空 |
addAll | 添加多个元素 |
containsAll | 查找多个元素是否都存在 |
removeAll | 删除多个元素 |
List
命令 | 解释 |
---|---|
get | 获取指定index位置的元素 |
indexOf | 返回obj在集合中首次出现的位置 |
lastIndexOf | 返回obj在当前集合中末次出现的位置 |
set(int index Object ele) | 设置指定index位置的元素为ele,相当于替换 |
List.subList(int fromIndex,int tolndex) | 返回从fromIndex到tolndex位置的子集合 |
Map
命令 | 解释 |
---|---|
put | 添加 |
remove | 根据键删除映射关系 |
get | 根据键获取值 |
size | 获取元素个数 |
isEmpty | 判断个数是否为空 |
clear | 清楚 |
containsKey | 查找键是否存在 |
Collection工具类
命令 | 解释 |
---|---|
reverse(List) | 反转List中元素的顺序 |
shuffle(List) | 对List集合元素进行随机排序 |
sort(List) | 根据元素的自然顺序对指定List集合元素按升序排序 |
sort(List,Comparator) | 根据指定的Comparator产生的顺序对List集合元素进行排序 |
swap(List,int,int) | 将指定list集合中的i处元素和j处元素进行交换 |
Object max(Collection) | 根据元素的自然顺序,返回给定集合中的最大元素 |
Object max(Collection,Comparator) | 根据Comparator指定的顺序,返回给定集合的最大元素 |
Object min(Collection) | 返回最小值 |
Object min(Collection,Comparator) | 根据Comparator指定的顺序,返回给定集合的最大元素 |
int frequency(Collection,Object) | 返回指定集合中指定元素的出现次数 |
void copy(List dest,List src) | 将src中的内容复制到dest中 |
boolean replaceAll(List list,Object oldVal,Object newVal) | 使用新值替换List对象的所有旧值 |
List
1、ArrayList
- ArrayList可以加入null,并且多个
- ArrayList是由数组来实现数据存储的
- ArrayList基本等同于Vector,除了ArrayList是线程不安全(执行效率高)在多线程情况下,不建议使用ArrayList
- ArrayList中维护了一个Object类型的数组elementData,
transient Object[] elementData;
//,表示该属性不会被序列号 - 当创建ArrayList对象时,如果使用的是无参构造器,则初始elementData容量为0,第1次添加,则扩容elementData为10,如需要再次扩容,则扩容elementData为1.5倍。
- 如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如果需要扩容,则直接扩容elementData为1.5倍。
2、Vector
- Vector底层也是一个对象数组,
protected Object[] elementData;
- Vector是线程同步的,即线程安全, Vector类的操作方法带有synchronized
- 在开发中,需要线程同步安全时,考虑使用Vector
3、LinkedList
- LinkedList底层实现了双向链表和双端队列特点
- 可以添加任意元素(元素可以重复),包括null
- 线程不安全,没有实现同步
如何选择ArrayList和LinkedList:
- 如果我们改查的操作多,选择ArrayList
- 如果我们增删的操作多,选择LinkedList
- 一般来说,在程序中,80%-90%都是查询,因此大部分情况下会选择ArrayList
List遍历
- iterator
- 增强for
- 普通for
Set实现类
- 无序(添加称取出的顺序不一致),没有索引
- 不允许重复元素,所以最多包含一个null
Set接口的常用方法
和List接口一样,Set接口也是Collection的子接口,因此,常用方法和Collection接口一样
Set接口的遍历方式
同Collection的遍历方式一样,因为Set接口是Collection接口的子接口。
- 可以使用迭代器
- 增强for
- 不能使用索引的方式来获取
HashSet
- set接口的实现类的对象(Set接口对象),不能存放重复的元素,可以添加一个null
- set接口对象存放数据是无序(即添加的顺序和取出的顺序不一致)
- 注意:取出的顺序的顺序虽然不是添加的顺序,但是他是固定
- 在执行add方法后,会返回一个boolean值
- 如果添加成功,返回 true,否则返回false
- 可以通过remove指定删除哪个对象
HashSet存储过程
1.HashSet底层是 HashMap
2.添加一个元素时,先得到hash值-会转成->索引值
3.找到存储数据表table,看这个索引位置是否已经存放的有元素
4.如果没有,直接加入
5.如果有,调用equals比较,如果相同,就放弃添加,如果不相同,则添加到最后
6.在Java8中,如果一条链表的元素个数到达TREEIFY_ THHRESHOLD(默认是8),并且table的大小>=
MIN TREEIFY CAPACITY(默认64),就会进行树化(红黑树)
TreeSet
TreeSet<String> treeSet = new TreeSet<String>(new Comparator<String>() {//使用匿名内部类
@Override
public int compare(String o1, String o2) {
return 0;
}
});
}
Map
- Map与Collection并列存在。用于保存具有映射关系的数据:Key-Value
- Map中的key和value可以是任何引用类型的数据,会封装到HashMap$Node对象中
- Map 中的key不允许重复,原因和HashSet一样(HashSet底层实现就是HashMap,HashSet用key保存数据,value默认为空)
- Map中的value可以重复
- Map 的key可以为null, value 也可以为null,注意key为null,只能有一个,value为null ,可以多个
- 常用String类作为Map的key
- key 和 value之间存在单向一对一关系,即通过指定的key总能找到对应的value
遍历
public class Test {
public static void main(String[] args) throws Exception {
HashMap<String, String> map = new HashMap<>();
Set<String> keys = map.keySet(); //遍历,得到所有key
Collection<String> values = map.values(); //遍历,得到所有value
//增强for,获得key与对应的value
Set<Map.Entry<String, String>> entries = map.entrySet();
for (Map.Entry<String, String> entry : entries) {
entry.getKey();
entry.getValue();
}
//迭代器,获得key与对应的value
Iterator<Map.Entry<String, String>> iterator = entries.iterator();
while (iterator.hasNext()){
Map.Entry<String, String> next = iterator.next();
next.getValue();
next.getKey();
}
}
}
HashTable
1)存放的元素是键值对:即K-V
2) hashtable的键和值都不能为null,否则会抛出NullPointerExceptior
3)hashTable使用方法基本上和HashMap一样
4) hashTable是线程安全的,hashMap是线程不安全的
TreeMap
TreeMap<String, String> treeMap = new TreeMap<>(new Comparator<String>() { //比较器
@Override
public int compare(String o1, String o2) {
return 0;
}
});
List实现类
1.ArrayList
2. Vector
3. LinkList
List遍历方式
Set实现类
1. HashSet
HashSet存储过程
存储过程
LinkedHashSet
2. TreeSet
Map实现类
遍历方式
1. HashMap
2. HashTable
3. TreeMap
Colletions工具类