一、list相关集合
ArrayList
基于动态数组实现,数组默认大小为10.当数组容量不够用是,会自动进行扩容,扩容的大小为原来的1.5倍
线程不安全
创建
ArrayList<变量类型> 变量名称 = new ArrayList<>();
API
插入数据
.add()
在指定下标插入数据 [0~size]
.add(index,数据)
一次添加一个集合进去
.addAll(ArrayList)
.addAll(Arrays.asList("a","b")) Arrays.asList("a","b")将数组转换为list类型
获取数据
.get(index) index[0,size)
是否包含某个对象
.contains("a");
返回数据在集合中的下标位置不存在则为-1
.indexOf("a")
是否为空
.isEmpty()
删除对象
删除对应的对象 删除第一个
.remove("1")
根据下标位置删除
list1.remove(index)
修改对应下标位置的值
list1.set(index,"b")
排序
调用list.sort()参数为比较器(需要自己创建一个对应类并继承Comparator接口)
StringComparator stringComparator = new StringComparator();
list1.sort(stringComparator);
使用集合工具类进行排序
Collections.shuffle(list1); .shuffle(集合对象) 打乱集合顺序
Collections.sort(list1);
匿名内部类 (若创建类只需自己调用则可使用匿名内部类进行创建)
Collections.sort(list2, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.getName().length()-o2.getName().length();
}
});
遍历
通过for循环遍历
for (int i = 0; i < list1.size(); i++) {
String s2 = list1.get(i);
}
加强for循环 不能在遍历时删除数据
for (String s2 : list1) {
System.out.println(s2);
}
迭代器
Iterator<String> iterator = list1.iterator();
while (iterator.hasNext()){
System.out.println(iterator.hasNext());
}
LinkedList
基于双向链表来实现的只能够顺序访问(从前到后,从后到前)数据的添加删除效率高,数据的查询效率低
线程不安全
创建
LinkedList<String> linkedList = new LinkedList<>();
API
获取元素
获取第一个元素
.element();
获取元素 原集合不变
.peek();
.peekLast() 最后一个
取出并移出
.poll()
.pollLast()
添加元素
.offer("X") 将元素添加到末尾
.offerFirst("M") 将元素添加到最前
遍历
同ArrayList
vector 线程安全的list集合实现与ArrayList类似,都通过动态数组来实现,因为线程安全效率较低基本不使用
扩容机制 扩容为原来两倍
代替方法
CopyOnWriteArrayList:线程安全,读写分离集合,读的性能比较高。适合用于读多写少的场景
使用Collections的工具类,将ArrayList转换为线程安全的
List syncList=Collections.synchronizedList(list)
二、Map的相关集合
HashMap
创建
HashMap<String, String> map = new HashMap<>()
同一key值存储多个元素可以将value设置成集合
添加
.put(key,value)
取值
根据key值取value值 若get不存在的key返回null
get(key)
是否包含某个key值,通常在添加之前做判断,以防止覆盖。多次put同一个key会将原来的key值覆盖
containsKey(key)
删除map中的内容 返回key对应的value值
remove(key)
替换map中的内容
replace(key,value)
取map中所有的value
.values()
获取map中所有的key值
.keySet()
map的遍历
获取所有的key根据key获取value
for (String key : map.keySet()) {
System.out.println(key+"\t"+map.get(key));
}
获取keyvalue的键值对然后遍历(推荐)
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey()+"\t"+entry.getValue());
}
hashMap存储数据大致流程
map.put(key,value)
1 根据key的hashcode值计算该数据应存储的下标位置
2 如果该下标位置没有内容,则直接将数据存入该位置
3 如果该下表位置有内容(hash冲突)将对象的key与改下标的链表中的对象进行equals比较
4 如果equals方法返回true则将内容替换掉该位置的链表中该节点的内容
5 如果equals方法返回false创建新的node节点并添加到链表的后面
LinkHashMap
在hashmap基础之上内部维护了一个链表,用来保存数据的插入顺序
可以称之为有序的hashmap(存储顺序和迭代顺序相同)
treemap
基于红黑树实现可以根据key的自然顺序进行排序
在创建treemap对象的时候也可以传入一个比较器,treeMap会根据比较器进行排序
判断key值是否相等是根据比较器的compare方法或compare able接口中的compareto方法
进行判断如果返回0则为重复
HashMap LinkedHashMap TreeMap等都是线程不安全的
如果需要使用线程安全的情况有
HashTable 线程安全的实现上与hashmap相同,但因为性能问题基本不使用,其key值和value值均不允许为null
替代方式 Collections.syncharonizedMap()和concurrentHashMap
oncurrentHashMap 与HashMap实现方法类似oncurrentHashMap为线程安全的,效率比hashtable高。在需要线程安全的时候推荐使用该类
三、set的相关集合
无序 不可重复的集合 底层通过Map来实现的。set的数据实际上是存储在map的key当中
hashset
创建:HashSet<String > set = new HashSet<>();
API
.add() 添加
.size() 长度
.remove() 删除
.contains() 是否包含
遍历
for (String s : set) {
System.out.println(s);
}
linkedhashset
插入和遍历时顺序相同,底层基于linkedhashmap
treeset
treeset是一个有序set类