您的位置:首页 > 编程语言 > Java开发

java基础-容器

2016-06-17 17:14 381 查看
</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)  TreeMap

HashTable和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
9685
(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的排序算法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: