容器
1)Collection 接口是一组允许重复的对象。
- Set 接口继承 Collection,无序不允许重复,使用自己内部的一个排列机制。
- List 接口继承 Collection,有序允许重复,以元素安插的次序来放置元素,不会重新排列。
2)Map 接口是一组成对的键值对象,即所持有的是 key-value pairs。Map 中不能有重复的 key。拥有自己的内部排列机制。
3)容器中的元素类型都为引用类型,不能放置原生数据类型(使用装箱即可),使用泛型保留类型
4)容器特点: 可变长,可有存储任意类型的数据,必须是引用数据类型
只能存储字符串类型的数据
容器的关系图:
List 接口
list的实现类
ArrayList
- 底层实现: 是由可变数组实现的,通过数组的拷贝实现
- 优点: 查询效率高
- 缺点: 添加,删除效率低,需要大量的使用数组的拷贝,效率较低
- 使用: 大量做查询的时候使用
- 扩容机制: int newCapacity = oldCapacity + (oldCapacity >> 1); 新容量每次扩容原来的1.5倍,使用copyOf方法进行
存储自定义的引用数据类型的数据,使用任何比较数据是否相等的方 法,需要手动重写equals方法
public class ListDemo01 {
public static void main(String[] args) {
//泛型可以规范容器中存放的所有数据的类型
List<Integer> list=new ArrayList<Integer>();
list.add(11);
list.add(22);
list.add(33);
list.add(44);
//void add(int index, E element)
list.add(0,2);
System.out.println(list);
//E get(int index)
System.out.println(list.get(2));
//remove(index|obj) 如果内容和索引有相同情况,以索引为主
System.out.println(list.remove(2));
System.out.println(list);
// E set(int index, E element) 用指定元素替换列表中指定位置的元素(可选操作)。
list.set(3, 333);
System.out.println(list);
//lis的遍历方式:
//普通for
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
//for each
for(Integer i: list){
System.out.println(i);
}
//iterator
//1) 获取一个迭代器对象
for(Iterator<Integer> it=list.iterator();it.hasNext();){
System.out.println(it.next());
}
}
}
Vector 向量
- 区别:
- 1.ArrayList线程不安全的 Vector同步的线程安全的
- 2.ArrayList扩容原容量的1.5倍 Vector扩容原容量的2倍
LinkedList
- 底层: 使用双向链表结构实现
- 优点: 做增删效率高
- 缺点: 查询效率低
- 使用: 大量做增删的时候使用
- 新增: 新增了一些操作于链表头尾的方法
Set
Set 无序 不可重复
- 新增方法: 无
- 遍历方式: 1)for each 2)迭代器
- HashSet
- HashSet:*** -->HashMap维护的
- 底层结构:底层是由哈希表存储的 (数组+链表+红黑树组成)
- 优点:添加,查询,删除效率高
- 缺点:无序
- HashSet存储自定义引用数据类型去重问题:我们认为内容相同就是一个对象
HashSet存储自定义引用数据类型去重问题:我们认为内容相同就是一个对象
需要重写这个类型的hashcode和equals方法,如果hashcode不相同,不会比较两个对象的equals,hashcode相等才会比较equals方法进一步比价内容
TreeSet
-
底层结构: 红黑树
-
优点:查询效率快,有序(默认升序,自定义排序方式)
-
缺点:但是ArrayList,HashSet快
-
存储自定义引用数据类型的去重+排序:存储person类型的对象数据的排序和去重问题
比较器
内部比较器|自然比较器:默认的比较方式
- 类实现java.lang.Comparable接口,重写compareTo(T o) 方法,在方法中定义比较规则
- 内部比较器,每次修改都要修改源码,其他类不能使用
外部比较器|自定义比较器
- 对Comparator接口的方法compare方法进行重写,定义比较规则
- 以外部比较规则优先,没有外部比较规则默认使用自然排序
Map
- 每一个数据都是一个键值对形式的数据 k—v
- key是唯一的,不可重复 —所有的key,set集合
- value可以是任意类型的数据,value不唯一,可重复 ----所有的value,Collection集合
- 只按照key值计算位置|去重|排序
- 一个key只能对应一个value(一对多可以对应value是一个集合)
- 如果key相同的数据,value会覆盖
Map 的遍历
-
1.keySet() 根据key获取value
-
2.values() 直接获取所有的value值
-
3.Set<Map.Entry<K,V>> entrySet()
System.out.println("-------keySet()------"); /*Set<String> keys=map.keySet(); for(String s: keys){ System.out.println(s+"-->"+map.get(s)); }*/ System.out.println("------- values()--------"); Collection col=map.values(); /*Iterator it=col.iterator(); while(it.hasNext()){ System.out.println(it.next()); }*/ System.out.println("-----entrySet()--------"); Set<Map.Entry<String, Boolean>> set=map.entrySet(); for(Map.Entry<String, Boolean> entry : set){ System.out.println(entry.getKey()+"==>"+entry.getValue()); }