</pre><pre name="code" class="java">
Lits接口年三种常用实现类:
Vector ArrayList LinkedListList
接口中的元素可以重复,而且有顺序Vector和ArrayList几乎使用了相同的算法,它们唯一的区别可以认为是对多线程的支持,ArrayList中没有对任何一个方法做线程同步,ArrayList不是线程安全的,Vector中大部分方法都做了线程同步,是一种线程安全的实现。因此,ArrayList和Vector几乎性能特性相差无几。从理论上来说,没有实现线程同步的ArrayList集合稍好于Vector,但是实际表现并不是非常明显。
LinkedList:使用了双向循环链表的数据结构。不不是线程安全的,对于ArrayList这些基于数组的实现来说,随机访问的速度是很快的,在遍历这些List对象时,可以优先访问随机访问,但对于等基于链表的实现,随机访问的性能是非常差的,应该避免使用。
RandomAccess接口:
1.是一个标志接口,本省没有提供任何方法,任何实现RandomAccess接口的对象都可以认为是支持快速访问的对象。
2.在jdk中,任何基于数组的List实现都实现了RandomAccess接口,而基于链表的实现则没有。
使用:list instanceof RandomAccess 若是,则进行随机访问get(),否则,迭代器访问iterator。对未实现RandomAccess得到List而言其随机访问速度特别慢
/*
* 关于实现List接口的类的使用
* */
public class ListClass {
public static void main(String [] args){
// List<String> arrayList =new ArrayList<String>();
// List<String> arrayList =new Vector<String>();
List<String> arrayList =new LinkedList<String>();
arrayList.add("王");
arrayList.add("李");
arrayList.add("张");
arrayList.add("宫");
arrayList.add("王");
arrayList.addAll(arrayList);
//list的遍历
//foreach遍历
for(String i:arrayList){
System.out.print(i+"\t");
}
System.out.println();
//迭代器遍历
Iterator i = arrayList.iterator();
while(i.hasNext()){
System.out.print(i.next()+"\t");
}
System.out.println();
//for循环遍历
for(int j = 0;j<arrayList.size();j++){
System.out.print(arrayList.get(j) + "\t");
}
//三次均按顺序输出
// 王 李 张 宫 王 王 李 张 宫 王
// 王 李 张 宫 王 王 李 张 宫 王
// 王 李 张 宫 王 王 李 张 宫 王
//List可以存储null
//Java中,null是一个关键字,用来标识一个不确定的对象。因此可以将null赋给引用类型变量,但不可以将null赋给基本类型变量。
//null本身虽然能代表一个不确定的对象,但就null本身来说,它不是对象,也不知道什么类型,也不是java.lang.Object的实例。
List<Object> listObject = new Vector<Object>();
//List<Object> listObject = new ArrayList<Object>();
//List<Object> listObject = new LinkedList<Object>();
listObject.add(null);
listObject.add("说话");
System.out.println(listObject);//[null, 说话]
}
}
Map接口
HashTable HashMap(LinkedHashMap) TreeMapHashTable和HashMap的区别:
1.HashTable中对大部分的方法做了同步,而 HashMap没有,因此,HashMap不是线程安全的。
2.HashTable中不允许key值或者Value值为空,而HashMap可以。
3.在年内不算法中,它们对key值hash算法和hash值到内存索引的映射方法不同。
但是,hashmap和hashtable这两套实现的性能相差不大
HashTable:数组
HashMap:一个链表的数组
1.简单的说,HashMap就是将key做hash算法,然后将hash值映射到地址内存,直接取得key值所对应的数据,在hashmap中,底层数据结构使用的是数组,所谓的内存映射即是数组的下标索引。数组内的元素并不是一个简单的值,而是一个entry对象。
3.hashmap的性能在一定程度上取决于hashCode()的实现,一个好的hashCode()算法可以尽可能减少冲突,从而提高hashmap访问速度。
LinkedHashMap:
1.克服hashmap的无序性的缺点,保留元素的输入顺序。
2.提供两种类型的顺序:插入顺序,最近访问顺序
TreeMap:红黑树
1.从功能上讲,TreeMap拥有比HashMap更强大的功能,它实现了SortedMap接口,可以对元素进行排序。
2.根据元素的key进行排序,在构造函数中注入Comparator接口,或者使用一个实现了comparator接口的key。
3.基于红黑树,红黑树是一种平衡查找树,其统计性能优于平衡二叉树。
private static void aboutTraverse() {
Map<String,String> map = new HashMap<String,String>();
//输出:0:111 1:131 2:111 3:111 4:111 5:111
//Map<String,String> map = new LinkedHashMap<String,String>();
//输出:1:131 2:111 3:111 4:111 5:111 0:111(先进先出)
//Map<String,String> map = new Hashtable<String,String>();
//输出:5:111 4:111 3:111 2:111 1:131 0:111(随机)
//Map<String,String> map = new TreeMap<String,String>();
//输出:0:111 1:131 2:111 3:111 4:111 5:111(键值排序)
//注意键值不能重复
map.put("1", "111");
map.put("2", "111");
map.put("1", "121");
map.put("3", "111");
map.put("4", "111");
map.put("5", "111");
map.put("1", "131");
map.put("0", "111");
//遍历
/*
Iterator iterator = map.entrySet().iterator();
while(iterator.hasNext()){
Map.Entry<String, String> entry = (Map.Entry<String, String>)iterator.next();
System.out.print(entry.getKey() + ":" + entry.getValue() + "\t");
}*/
for (Entry<String, String> entry : map.entrySet()) {
System.out.print(entry.getKey() + ":" + entry.getValue() + "\t");
}
}
public static void aboutNull(){
Map<String,String> map = new HashMap<String,String>();
//输出:{null=a, a=a, b=a}
//Map<String,String> map = new LinkedHashMap<String,String>();
//输出:{null=a, a=a, b=a}
//Map<String,String> map = new Hashtable<String,String>();
//报错 其键和值均不能为null
//Map<String,String> map = new TreeMap<String,String>();
//报错 其键和值均不能为null
map.put(null, null);
map.put("a", null);
map.put(null, "a");
map.put("a", "a");
map.put("b", "a");
System.out.println(map);
}
Set接口:
Set接口中元素是不能重复的HashSet LinkedHashSet TreeSet 分别是对应的 HashMap LinkedHashMap TreeMap的封装
HashSet:基于hash的快速元素插入,元素间无顺序
LinkedHashSet:基于hash的快速元素插入,同时,维护着元素插入集合时的先后顺序,遍历集合时,总是按照先进先出的顺序进行
TreeSet:基于红黑树实现,有着基于元素key的排序算法