单列集合的根接口:Collection
主要有两类:1 List 特点:元素存取有序,可重复。
2 Set 特点:元素存取无序,不可重复。
============================================================
List总结:
List其中的两个实现类:ArrayList和LinkedList
ArrayList底层是使用一个Object数组实现的,因为数组的特点,其在查找时速度快,增删时速度慢,因为要复制数组元素。
LinkedList底层是使用链表的数据结构实现的,所以在查找时速度慢,增删时速度快。
所以在选择时,根据需求分析,查找操作较多的使用ArrayList,增删操作较多的使用LinkedList
=============================================================
Set详解:
主要总结两个Set的实现类:HashSet和TreeSet
HashSet底层使用哈希表进行存储,所以在存储自定义对象时,都要重写其hashCode方法和equals方法,由hashCode方法计算出元素的存储位置,若该存储位置上已经存在元素,则调用equals方法,比较是否是相同元素,若不是,才可以存储。下面从具体代码可以看出这一存储规则:
class Person{
int id;
String name;
@Override
public int hashCode() {
System.out.println("hashCode方法被调用");
return id;
}
@Override
public boolean equals(Object obj) {
System.out.println("equals方法被调用");
Person p = (Person)obj;
return this.id==p.id;
}
public Person(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return id+"-"+name;
}
}
public class Demo1 {
public static void main(String[] args) {
Set<Person> set = new HashSet<Person>();
set.add(new Person(1,"jack"));
set.add(new Person(2,"tom"));
set.add(new Person(1,"marry"));
System.out.println(set);
}
}
可以看出hashCode被调用了3次,而只有在hashCode得到2个元素的hash值一样时,才会去调用equals方法判断是否为相同元素。
TreeSet底层使用红黑树(二叉树)数据结构实现,能根据元素的自然顺序或自定义比较顺序,在添加的时候进行排序。因为基本数据类型和String都实现Comparable接口,且都定义了排序规则,所以添加元素时会完成排序。
要想添加自定义对象,方法一:该类要实现Comparable接口,在该接口的唯一方法compareTo的实现内定义排序规则,
方法二:在创建TreeSet时,传入Comparator接口的实现类,该实现类重写Compare方法定义排序规则。
若两者同时使用,调用的是方法二
TreeSet判断是否为重复元素的规则与HashSet不同,他的规则就是compareTo方法或Compare方法返回的值是否为0,为0就视为重复元素。
===========================================================================================
双列集合的根接口:Map
双列集合存储键值对(key-value)的元素,根据键存储/获取值。特点:key不可重复,value可以重复。在添加重复key的value值时,调用put方法会返回该key上一次对应的value值
System.out.println(map.put("1", "jack"));
System.out.println(map.put("1", "tom"));
返回值:
null
jack
Map接口其中的3个实现类:HashMap,TreeMap
HashMap在存储时和上面的HashSet的存储规则一样,用key去进行hashCode和equals计算,判断是否为重复元素,当key为自定义元素时,需重写hashCode和equals方法
TreeMap也和TreeSet的存储规则相同,对key的排序规则进行排序,当key为自定义元素时,该元素的类需要实现Comparable接口,或在创建TreeMap时,传入Comparator实现类。
HashTable(与HashMap类似,线程安全的实现类)
Map迭代的方法:方式1:KeySet():将map的所有key转成set集合,遍历set集合,根据key可以获取value,达到map的遍历。//缺点:只能获取key的集合,获取value还需调用其他方法。
方式2:values(): 将map的所有value转成Collection集合,遍历该集合,获取所有value//缺点:只能获取value值
方式3:entrySet():将map的key和value封装成一个个对象entry<K,T>,将封装的对象们存入set集合,遍历set集合,得到一个个entry,调用entry.getkey()和entry.getValue()获取键值。
一般使用方式3.
======================================================================================
最后介绍Collections的工具类,可以对集合进行排序,二分法查找等操作,一个重要的方法是可以把线程不安全的集合转成线程安全的
static <T> List<T> synchronizedList(List<T> list)
static <K,V> Map<K,V> synchronizedMap(Map<K,V> map)
static <T> Set<T> synchronizedSet(Set<T> set)