容器Collection
一、List类
List存储的数据特点:有序的、允许重复
遍历Set容器的方式:
1、foreach 增强for
2、普通for循环
3、Iterator<> 迭代器
1、ArrayList
优点:底层实现是通过数组、所以根据索引查找数据的效率很高
缺点:添加、删除,大量操作数据时不适用,效率比较低
初始容量为10,扩容机制每次是原容量的1.5倍
2、Vector
和ArrayList类类似唯一区别:
1.vector线程安全、ArrayList线程不安全
2.每次扩容原容量的2倍,ArrayList是1.5倍,更有效的节省内存
3、LinkedList
优点:增删效率高。
LinkedList底层是通过双向链表的方式现实存储数据的,链表结构中的元素是一节点为单位,一个节点中储存当前数据和下一节点的地址
二、Set
Set存储的数据特点无序的,不可重复
遍历Set容器的方式:
1、foreach 增强for
2、Iterator<> 迭代器
1、TreeSet
有默认排序,去重
底层: 红黑树(二叉树的一种),是由TreeMap维护
特点: 有序的,默认升序排序 ,查询等效率高
注意:存储自定义的引用数据类型的数据: 必须实现内部比较器|外部比较器–>去重+排序
2、HashSet
无序、去重
底层: 有哈希表结构实现的(数组+链表+红黑树), 内部是由HashMap维护
优点: 查询,增加,删除效率高
缺点: 无序,去重
存储数据过程:
1、使用hash算法对数据计算,决定储存在数组中的位置: 位置=数组%9 对于的方法是: hashCode()
2、通过hash算法找到对应数组储存的位置后调用 euqals()方法判断当前位置是否有重复的数据,没有则存入,否则去重。
特点:
1、自定义类型对象去重: 需要重写hashCode()和equals()方法,不重写无法进入equals()比较内容的这一部,因为对象地址都是不同的算出来的hash值也不同。
2、如果数组一个索引中存储了8个以上数据,转为使用红黑树的结构存储数据
三、Map
Map存储键值对的形式数据: Key-Value,Key和Value之间存在映射关系
Key: 无序的,不可重复。决定去重的条件,如果key相同,value会覆盖
Value:无序的,可以重复
2、HashMap
如果key是对象类型时去重需要重写hashCode()和equals()
认初始容量 (16):可以根据要存储数据设置 和默认加载因子 (0.75)
遍历:
1.获取所有的key Set keySet()
Map<Integer,String> map=new HashMap();
map.put(01, "哪吒");
map.put(02, "烈火英雄");
Set<Integer> keys=map.keySet();
for(Integer i:keys){
System.out.println(i+"---->"+map.get(i)); //1,2
}
2.获取所有的值 Collection values()
Collection<String> col=map.values();
Iterator<String> it=col.iterator();
while(it.hasNext()){
System.out.println(it.next());//哪吒,烈火英雄
}
3.Set<Map.Entry<K,V>> entrySet()
Set<Map.Entry<Integer,String>> set=map.entrySet();
for(Map.Entry i:set){
System.out.println(i.getKey()+"---->"+i.getValue());
}//[{1,哪吒} ,{2,烈火英雄}]
1、TreeMap
红黑树的结构默认升序排序
key是自定义引用数据类型: 内部比较器|外部比较器(在创建TreeMap构造器中指定)
四、比较器
1、内部比较器|自然排序
实现 Comparable接口,重写compareTo()方法定义比较规则
2、外部比较器
实现Comparator接口,重写compare()方法定义比较规则