单列集合 collection
ArrayList
可变数组,默认容量10。插入元素后自动移动后面的元素
不是线程安全的
Vector
和ArrayList的主要区别是,Vector的线程是安全的,其他使用方法和ArrayList一致
LinkedList
底层使用双向链表实现,内存空间不需要连续。一个元素两端的两个地址引用分别指向上一个和下一个元素,元素中间是值。
给链表的开头和末尾添加袁旭只需要链表中一个元素的相关引用地址。
中间插入元素也只需要修改两个元素的引用地址
LinkedList对元素的增删改操作速度非常快,但是随机访问速度比较慢,因为LinkedList需要从第一个索引开始寻找
什么是随机访问?
获取列表中的指定索引位置的元素
LinkedList的一些特殊API
list.addFirst()//给第一个添加元素
list.addLast()//给最后一个添加元素
list.removeFirst()//移除第一个元素
list.removeLast()//移除最后一个元素
list.pollFirst()//弹出第一个元素,即将第一个元素从集合中去除,返回值是第一个元素
list.polllast()//弹出最后一个元素
list.pop()//弹出链表表头元素
list.pop()
Set集合
HashSet
底层使用HashMap实现,一个不重复的Set集合
HashSet set=new HashSet();
set.add(1);
set.add(2);
sout(set);
//相同的元素无法加入集合
HashSet遍历:
1、for each遍历
for(Object obj:set){ sout(obj); }
2、迭代器
//得到一个迭代器对象 //迭代器中的两个方法:
//1、hasnext() 判断是否有下一个元素,有返回true,没有返回false
//2、next() 获取下一个元素 Iterator iterator = set.iterator();
while(tierator.hasnext())
{
Object obj=iterator.next();
sout(next);
}
TreeSet
是一个不重复,而且有顺序的set
TreeSet是如何保持有序的
TreeSet内部进行强制类型转换,转换成Comparable(接口)类型,通过这个比较器来比较两个元素大小,所以放在TreeSet中的元素必须有实现的方法,才可以实现Comparable接口,通过这个比较器进行排序
TreeSet在创建时可以指定一个比较器
这个时候就不需要继承comparable接口
public class TeacherComparator implements Comparator<Teacher>{//泛型要指定为Teacher
public int compare(Teacher t1,Teacher t2){
//code
}
}
//创建集合的时候传入一个比较器对象
TreeSet set = new TreeSet(new TeacherComparator);
LinkedHashSet
一个可以维护元素插入顺序的HashSet,不按照规则进行排序,但是插入元素时原来的顺序保持不变
双列集合
以键值对的方式在内存中存储数据
什么是键值对?
一个ID对应一个值
规则:
key不能重复,但是value可以重复
HashMap
- 实现了map接口中的所有方法
- 线程不同步
//创建HsahMap对像
HashMap map=new HashMap();
map.put(1,"第一个元素");//put()方法给对象赋值
map.put(2,"第二个元素");
工作原理:
掉用new HashMap()时并不会产生新数组,而是开辟了一段空间(HashMap数组容量扩容时是空间翻倍扩容),添加第一个元素是才会创建新的数组。
添加元素时会首先根据元素的key,计算出hashcode,并根据这个hashcode决定这个元素在数组中的元素。
添加元素时如果链表超过了8个,分为两种情况
1、链表元素超过了8个,但是整个数组长度没有超过64,此时JVM会对数组进行翻倍扩充,然后重新计算元素地址
2、如果链表元素超过了8个,且长度超过64,此时会将整个链表树化(红黑树),当某个红黑树上的元素少于6个时,又会自动转换为链表
3、当数组达到了负载因子(0.75)规定的大小时,会进行翻倍扩容,最大容量为:2^30。
HashMap的注意点:
- key不能重复,如果是key相同,value会被新的覆盖
- key可以是任何类型,但是这个类型需要重写equals和hashCode,一般用String和int,不会使用自定义类型
- 如果key是基本类型,必须是包装类
HashMap的遍历
提供了API对Hash Map集合遍历
1、entrySet
Set<map.Entry> set=map.entrySet();
for(Map.Entry entry:set){
sout(entry.getKey()+":"+map.get(key));
}
2、keySet
Set<Integer> keys = map.keySet();
for(Integer key:keys){
sout(key+":"+map.get(key));
}
3、如果只遍历value,使用values()
Collection value=map.values();
for(Object obj:values){
sout(obj);
}
TreeMap
有顺序的map,排序方式按照key的比较器进行排序。常用String或基本类型,这些类型都实现了Comparable接口
LinkedHashMap
一个可以维护插入顺序的Map,内部使用一个双向链表,实现元素的顺序保存
Hashtable
和HashMap几乎一直,但是线程是安全的,效率比较低。
ConcurrentHashMap
线程安全,但是不使用synchronized锁,使用分段锁、自选锁,效率相对于HashMap更高。