集合
JAVA(集合)
一,集合框架
集合:容器,存放数据的一个容器
使用集合目的:更方便得存储和操作数据。CRUD(增删改查)
二,集合继承结构
- Collection<E>:存放单值最大父接口
List<>(E)(列表)线性表,可以动态增长,查找效率高,插入删除效率低
set<E> 也是线性表,检索元素效率高,插入删除效率高,插入删除涉及元素移位
- Map<K , V>:存放对值得最大父接口
Map<K,V> 用户保存具有映射关系的数据,Map保存两组数据,key和value,key和value可以是任意数据类型,key不能重复
三,List
初始化尽量指定初始化容量,不确定,默认16
使用泛型,数据类型,尽量使用数据类型
数组转List
int a[] = new int[]{1};
List<int[]> ints = Arrays.asList(a);//存放的是一个数组放到List第一位
System.out.println(ints.get(0)[0]);//List第一个是数组,在获取数组的值
LinkedList<String> list = new LinkedList<String>();

//我们创建的是多态
//只能用父类和子类都有的方法
//Collection和Map的区别
//存储单值, 存储 值对的
//ArrayList和LinkedList的区别
//ArrayList 和Vector的区别、
// 线程异步,不安全 线程同步,安全,有sychronized
// 效率高 效率低
三,Set
Collection接口
List和set的区别
list:有顺序,元素可以重复,添加的先后顺序
set:无顺序,元素不可以重复,添加的先后顺序(添加一样的,new 引用数据类型)
set的无序不是随机,无序是没有按照添加顺序排序,但内部有自己的排序算法
如何保证数据不能重复,重写equals方法和hashCode方法
treeset
排序规则
要排序的对象的类必须实现Comparable接口
LinkedHashSet
添加数据的同时,会维护数据的添加顺序,效率比HsahSet略低
比较接口
Comparable接口:自然排序,排序规则固定
Comparator接口:临时排序
四,Map
1.存储对值 K - V key - value
2.key不能重复,value可以重复
3.没有顺序(添加的先后顺序)
HashMap内部存储结构
JDK1.7之前:链表 + 二叉树
JDK1.7之后:链表 + 数组 + 红黑树
Hashtable和HashMap区别
Hashtable有sychronized
HashMap线程异步,不安全;Hashtable线程同步,安全
HashMap的key可以为null;Hashtable不可以为null
结构区别:HashMap是由数组+链表形成,在JDK1.8之后链表长度大于8时转化为红黑树;而HashTable一直都是数组+链表;
继承关系:HashTable继承自Dictionary类;而HashMap继承自AbstractMap类;
LinkedHashMap,内部加了链表
Properties
属性,Hashtable的子类 ,更多的是来操作属性文件
(db.properties)
五,集合的遍历
list
List<Integer> list = new ArrayList(16);
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.add(6);
// for循环
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
//foreach
for (Object o : list) {
System.out.println(o);
}
//迭代器(接口)
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()){
Integer next = iterator.next();
System.out.println(next);
}
set
Set<Integer> set = new HashSet<>();
set.add(1);
set.add(1);
set.add(30);
set.add(15);
set.add(40);
//foreach
for (Integer integer : set) {
System.out.println(integer);
}
//迭代器
Iterator<Integer> iterator = set.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
map

Map<String,String> map = new HashMap();
map.put("1","1");
map.put("2","2");
map.put("3","3");
map.put("1","1");
// System.out.println(map);
// System.out.println(map.get("3"));
// System.out.println(map.keySet());
// System.out.println(map.values());
//foreach
Set<String> strings = map.keySet();
for (String string : strings) {
System.out.println(strings);
}
//Entry是hashMap的一个内部类
//每一组键值对都是一个Entry
Set<Map.Entry<String, String>> entries = map.entrySet();
for (Map.Entry<String, String> entry : entries) {
System.out.println(entry.getKey());
System.out.println(entry.getValue());
}
六,HashSet,TreeSet和LinkSet的区别
1.SET接口
set不允许包含相同的元素,如果把两个相同的元素加入同一个集合中,add方法返回false
set判断两个对象相同不是用 == 运算符,而是用equals方法,也就是两个对象用equals方法比较返回true,set就不会就受这两个对象
2.HashSet
- 不能保证元素的排列顺序,顺序可能发生变化
- 不是同步的,集合元素可以是null
当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode方法来得到该对象的hashCode值,然后根据hashCode值来决定该对象在HashSet中存储位置。
HashSet集合判断两个元素想的标准时两个对象通过equals方法比较相等,并且两个对象的hashCode方法返回值相同
3.LinkHashSet
LinkHashSet与HashSet的不同在于,LinkHashSet维护着一个运行于所有条目的双重链接列表,此链接列表定义了迭代顺序,该迭代顺序可为插入顺序或是访问顺序
LinkHashSet集合同样是根据元素的hashCode值来决定元素的存储位置
4.TreeSet
TreeSet是SortSet接口的唯一实现类,TreeSet可以确保集合的元素处于排序状态
TreeSet支持两种排序方式,自然排序和定制排序,其中自然排序为默认的排序方式,向TreeSet中加入的应是同一个类的对象
TreeSet判断两个对象不相等的方式是两个对象通过equals方法返回false,或通过CompareTo方法比较返回有没有0
5.线程安全
Set三个实现类HashSet,TreeSet,EnumSet都是线程不安全的
七,HashMap,LinkHashMap和TreeMap的区别
map主要存储键值对,根据键得到值,因此不允许键的重复,但允许值重复
1.HashMap
HashMap是一个常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取他的值,具有很快的访问速度,遍历时,获取数据的顺序完全是随机的
HashMap最多只允许一条记录的键为null,允许多条记录的值为null
HashMap不支持线程的同步(非线程安全),即任一时刻可以有多条线程同时写HashMap,可能会导致数据的不一致
同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。
在Map中插入,删除和定位,HashMap是最好的选择
2.Hashtable
Hashtable与HashMap类似,它不允许记录的键或者值为空
支持线程同步(线程安全),任一时刻只有线程能写Hashtable,导致Hashtable写入比较慢
3.LinkHashMap
LinkHashMap是HashMap的一个子类
LinkHashMap保存了记录的插入顺序,在用Iterator遍历LinkHashMap时,先得到的记录肯定是先插入的
在遍历的时候回比HashMao慢,但当HashMao容量很大时,实际数据少,遍历起来可能会比LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。
4.TreeMap
TreeMap实现SortMap接口,能够把保存的记录根据键排序,默认是按键值的升序排序
TreeMap取出来的是排序后的键值对
TreeMap基于红黑树实现,TreeMap没有调优,因为该树总处于平衡状态
非线程安全
5.总结
HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的,只是Set用的是Map的key
Map的key和Set都有一个共同特性就是集合的唯一性,TreeMap多了一个排序的功能
hashCode和equals,HashMap因为无需排序,只需要关注定位和唯一性
hashCode是用来计算hash值,hash值是用来确定hash表索引的
hash表中的一个索引处存放的是一张链表,通过equals方法循环比较链表上每一个每一个对象才能定位到键值对应的Entry
put时,如果hash表中没定位到,就在链表前加一个Entry;如果定位到了,则更换Entry中的value,并返回旧value。
Collection没有get方法获取某个元素,只能通过iterator遍历元素

浙公网安备 33010602011771号