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的排序算法
相关文章推荐
- quartz在web项目中的应用(不使用spring)
- 四大常用排序算法实现-JAVA版
- Eclipse项目导入Android Studio出现中文乱码
- 关于struts2 中result type="stream"
- Spring4.0 构造函数配置bean
- spring mvc+ELK从头开始搭建日志平台
- Spring中事务的Propagation(传播性)的取值
- pdf-renderer 把 pdf 转换成图片时报:java.io.IOException: Unknown CMap: UniGB-UCS2-H 的解决办法
- RxJava基础练习(3)
- Java类集 _Map接口
- RxJava基础练习(2)
- Java Thread多线程全面解析
- JAVA日期字符串转化,日期加减
- JAVA字符串转日期或日期转字符串
- testng报错"java.net.SocketException: Software caused connection abort: socket write error"
- java找不到或无法加载主类
- Java客户端操作HBase代码
- eclipse中alt+/失效的几种解决方法
- Struts2的声明式异常处理
- Java堆内存