java的三大集合list(列表),set(集),map(映射)
其中list和set实现了collection
collection是最基本的集合接口,声明了适用于java集合(只包括set和list)的通用方法。set和list都集成了collection,map没有
set(集合)
set是最简单的一种集合。集合中的对象是无序的,并且不能重复。
set主要实现了俩个实现类:
hashset:HashSet类按照哈希算法来存取集合中的对象,存取速度比较快
HashSet实现了set接口,他不允许集合中出现重复元素。当我们提到HashSet时,第一件事就是在将对象存储在HashSet之前,要确保重写HashCode()方法和equals()方法,这样才能比较对象的值是否相等,确保集合中没有存储相同的对象。如果不重写上述俩个方法,那么将执行hashSet中的默认实现方法:
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
HashSet的底层是用HashMap实现的在添加时使用HashMap进行判断
TreeSet:TreeSet类实现了SortedSet接口,能够对集合中的对象进行排序。
public boolean add(E e) {
return m.put(e, PRESENT)==null;
}
它的添加同样底层是使用map进行添加的
TreeSet实现的是NavigableSet接口,但是他的方法实现使用的却是NavigableMap;
List(列表):
List的特征是其元素以线性方式存储,集合中可以存放重复对象。
List接口主要实现类包括:
ArrayList():长度可以改变的数组。可以对元素进行随机访问。
向Arraylist()中插入与删除元素的速度慢
List list=new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
//普通的循环
for (int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
//迭代器
Iterator iterator = list.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
//foreach循环遍历
for (Object s: list) {
System.out.println(s);
}
LinkedList():在实现中采用链表数据结构。插入和删除速度忙,访问速度慢
private LinkedList<String> linkedList = new LinkedList<String>();
/**
* 将元素加入LinkedList容器
* (即插入到链表的第一个位置)
*/
public void push(String name){
linkedList.addFirst(name);
}
/**
* 取出堆栈中最上面的元素
* (即取出链表linkedList的第一个元素)
* @return
*/
public String getTop(){
return linkedList.getFirst();
}
/**
* 取出并删除最上面的元素
* (即移出linkedList的第一个元素)
* @return
*/
public String pop(){
return linkedList.removeFirst();
}
/**
* 获取元素个数
* @return
*/
public int size(){
return linkedList.size();
}
/**
* 判断堆栈是否为空
* (即判断 linkedList是否为空)
* @return
*/
public boolean isEmpty(){
return linkedList.isEmpty();
}
public void add(String name){
linkedList.add(name);
}
//测试
public static void main(String[] args) {
LinkedListTest stack = new LinkedListTest();
stack.add("123");
stack.add("aaa");
stack.add("bbb");
stack.push("yulon");
stack.push("xiaoyun");
stack.push("羽龙共舞");
System.out.print("第一个元素是:\t");
System.out.println(stack.getTop());
System.out.println();
System.out.println("全部元素:");
while(!stack.isEmpty()){
System.out.println("\t"+stack.pop());
}
}
Vector():它是一个队列,支持相关的添加删除修改遍历等功能。
Vector中的操作是线程安全的。
Vector的默认容量大小是10
当Vector的容量不足以容纳全部元素时,Vector的容量会增加。若容量增加系数>0,则将容量的值增加“容量增加系数”;否则,将容量大小增加一倍。
map(映射):(map不想list和set它没有继承collection)
Map集合是双列集合,Map中的集合是成对存在的,每个元素由建和值组成,通过建可以找到对应的值。
注意:Map中的集合不能包含重复的键,值可以重复。每个键只能对应一个值。
Map集合不能直接使用迭代器或者foreach进行遍历,当时转成set之后就可以使用了。
Map接口主要的实现类:
HashMap:存储数据采用哈希表结构,元素的存取顺序不能保持一致。由于要保证键的唯一,不重复,需要重写键的hashcode()方法,equals方法。HashMap只支持一条记录的键为null;允许多条记录的值为null。
LinkeHashMap:HashMap下有个子类LinkeHashMap。
存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的取值顺序一致;
通过哈希表结构可以保证键的唯一,不重复,需要重写hashcode()方法和equals()方法
HashTable:与HashMap类似,不同的是:键和值的值不允许为null;
它支持线程的同步,既任一时刻只有一个线程能写HashTable,因此也导致了HashTable在写入是会比较慢
TreeMap:能够把它保存的记录根据键排序,默认是按升序排序,也可以指定排序的比较器(Comparator),当用iterator便利TreeMap是,得到的记录是排序过的。TreeMap不允许键的值为null。