网站友情链接作用,微信网站开放,阳江做网站,济南网站制作软件java中这几个东西是比较常用的#xff0c;虽然我用的不多#xff0c;也正是因为用的不多#xff0c;所以我一直搞不清楚他们之间的具体用法以及相互之间的关系#xff0c;现在特单独作为一个东西来总结一下。 本文参考一下资料#xff1a; 1.《java编程思想》一书第11章 2…java中这几个东西是比较常用的虽然我用的不多也正是因为用的不多所以我一直搞不清楚他们之间的具体用法以及相互之间的关系现在特单独作为一个东西来总结一下。 本文参考一下资料 1.《java编程思想》一书第11章 2.http://blog.sina.com.cn/s/blog_a345a8960101k9vx.html 3.http://f51889920.iteye.com/blog/1884810 4.http://blog.csdn.net/speedme/article/details/22398395 5.http://www.tuicool.com/articles/qeEzym 6.http://blog.csdn.net/hguisu/article/details/7644395 在《java编程思想》一书中这几个东西放到一章里面讲的是在第11章。分了好多的小节去讲的看了一会看的头疼但是基本上好多东西都可以明白比较容易梳理。 首先放个图在前面展示下他们各个集合类之间的关系如下 java集合框架的基本接口/类层次结构 java.util.Collection [I]
--java.util.List [I]--java.util.ArrayList [C]--java.util.LinkedList [C]--java.util.Vector [C]--java.util.Stack [C]
--java.util.Set [I]--java.util.HashSet [C]--java.util.SortedSet [I]--java.util.TreeSet [C]java.util.Map [I]
--java.util.SortedMap [I]--java.util.TreeMap [C]
--java.util.Hashtable [C]
--java.util.HashMap [C]
--java.util.LinkedHashMap [C]
--java.util.WeakHashMap [C][I]接口
[C]类 那么为什么要有集合类 面向对象的语言对事物的体现都是以对象的形式为了方便对多个对象操作就要对对象进行存储集合类就是对多个对象进行存储的一种方式。 数组和集合类有何不同 最主要的区别是长度可变不可变问题。数组可以存储对象但是长度是固定的不可变的。集合长度是可变的。其次数组中可以存储基本数据类型集合只能存储对象。集合的一个比较大的优点是可以存储不同类型的对象。数组不可以。 下面就开始各种总结。 Collection接口 Collection接口是最基本的集合接口代表一组Object集合这些Object被称作Collection的元素所有实现Collection接口的类型必须提供两个标准的构造函数无参数的构造函数用于创建一个空的Collection有一个Collection参数的构造函数用于创建一个新的Collection这个新的Collection与传入的Collection有相同的元素后一个构造函数允许用户复制一个Collection。这些都比较容易理解。 1 CollectionInteger ci new ArrayListInteger();
2 CollectionInteger ci2 new ArrayListInteger(Arrays.asList(1,2,3,4,5)); 并且注意Collection中没有get()方法要想查看或者操作Collection中的元素只能遍历使用的是iterator()方法使用该方法可以逐一访问Collection的每一个元素。 1 Iterator it collection.iterator();//获得迭代
2 while(it.hasNext()){
3 Object obj it.next();//得到下一个元素
4 } 由上图可知Collection分为Lst接口和Set接口。 List接口 List接口是有序的Collection使用该接口能精确控制每个元素的插入位置可以使用索引来访问List中的元素跟数组是很类似的。并且List中允许有重复元素当然有些List的实现类不允许重复元素的存在。 List中有iterator()方法还有listIterator方法返回一个ListIterator接口这个接口比标准的Iterator接口相比多了一些add之类的方法允许添加、删除、设置元素值以及向前或者向后遍历等。 如上图List下有几个常用类:LinkedList、ArrayList和Vector以及Stack。 1ArrayList类实现了可变大小的数组。它允许包含所有元素包括null。每个ArrayList实例都有一个容量即用于存储元素的数组的大小这个容量可以随着不断添加新元素而自动增加但增长算法没有定义当插入大量元素时插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。 2LinkedList类允许null元素提供额外的getremove和insert方法这使得LinkedList可以用作stack、queue或双向队列。它可以再List的中间插入和移除在这方面比ArrayList有效但是在随机访问方面就没有ArrayList有效了。如果多个线程同时访问一个List则必须自己实现访问同步一种解决方法是在创建List时构造一个同步的List List list Collection.synchronizedList(new LinkedList(……)) 3Vector类Vector跟ArrayList非常类似但是Vector是同步的由Vector创建的Iterator虽然和ArrayList创建的 Iterator是同一接口但是因为Vector是同步的当一个Iterator被创建而且正在被使用另一个线程改变了Vector的状态例如添加或删除了一些元素这时调用Iterator的方法时将抛出ConcurrentModificationException因此必须捕获该异常。 4Stack类继承自Vector实现一个后进先出的栈。提供了几个基本方法push、pop、peak、empty、search等。 总结 List元素是有序的元素可以重复。因为该集合体系有索引。 ArrayList底层的数据结构使用的是数据结构。 查询速度很快。增删稍慢。线程不同步。默认长度为10增长率为50%。LinkedList底层使用的链表数据结构。 增删速度很快。查询稍慢。Vector底层是数组数据结构。1.0出现 线程同步被ArrayList替代了。长度增长率100%。Set接口 Set接口是继承自Collection的它不能包含有重复元素。Set中最多有一个null元素。 因为Set的这个制约在使用Set集合的时候应该注意 1为Set集合里的元素的实现类实现一个有效的equals(Object)方法。 2对Set的构造函数传入的Collection参数不能包含重复的元素。 Set下有几个set类HashSet、SortedSet、TreeSet用的较多的是HashSet其他两种基本不常用以后慢慢补充该方面知识下面说HashSet。 1HashSet底层数据结构式哈希表由哈希表支持不保证集合的迭代顺序特别是不保证该顺序恒久不变此类允许使用null元素。HashSet保证元素唯一性的方法是通过元素的两个方法hashCode和equals来完成。如果元素的HashCode值相同才会判断equals是否为true。如果元素的hashCode值不同不会调用equals。 2TreeSet底层数据结构式二叉树。注添加元素必须实现Comparable接口或在实例TreeSet时指定比较器。可以对Set集合中的元素进行排序。保证元素唯一性的依据compareTo方法return 0 Map接口 Map集成Collection接口Map和Collection是两种不同的集合Collection是值value的集合Map是键值对key,value的集合。包含几种主要类和接口HashMap、LinkedMap、WeakHashMap、SortedMap、TreeMap、HashTable等几种。 1Hashtable继承Map接口实现一个key-value映射的哈希表。任何非空non-null的对象都可作为key或者value。添加数据使用put(key, value)取出数据使用get(key)这两个基本操作的时间开销为常数。 2WeakHashMap类WeakHashMap是一种改进的HashMap它对key实行“弱引用”如果一个key不再被外部所引用那么该key可以被GC回收。 总结 如果涉及到堆栈队列等操作应该考虑用List对于需要快速插入删除元素应该使用LinkedList如果需要快速随机访问元素应该使用ArrayList。 如果程序在单线程环境中或者访问仅仅在一个线程中进行考虑非同步的类其效率较高如果多个线程可能同时操作一个类应该使用同步的类。 在除需要排序时使用TreeSet,TreeMap外,都应使用HashSet,HashMap,因为他们 的效率更高。 要特别注意对哈希表的操作作为key的对象要正确复写equals和hashCode方法。 容器类仅能持有对象引用指向对象的指针而不是将对象信息copy一份至数列某位置。一旦将对象置入容器内便损失了该对象的型别信息。 尽量返回接口而非实际的类型如返回List而非ArrayList这样如果以后需要将ArrayList换成LinkedList时客户端代码不用改变。这就是针对抽象编程。 注意 1、Collection没有get()方法来取得某个元素。只能通过iterator()遍历元素。 2、Set和Collection拥有一模一样的接口。 3、List可以通过get()方法来一次取出一个元素。使用数字来选择一堆对象中的一个get(0)...。(add/get) 4、一般使用ArrayList。用LinkedList构造堆栈stack、队列queue。 5、Map用 put(k,v) / get(k)还可以使用containsKey()/containsValue()来检查其中是否含有某个key/value。 HashMap会利用对象的hashCode来快速找到key。 6、Map中元素可以将key序列、value序列单独抽取出来。 使用keySet()抽取key序列将map中的所有keys生成一个Set。 使用values()抽取value序列将map中的所有values生成一个Collection。 为什么一个生成Set一个生成Collection那是因为key总是独一无二的value允许重复。 转载于:https://www.cnblogs.com/Pillar/p/4226549.html