Java中常见的集合对象:数组、List、Set、Map。
1、数组
数组与其它容器的区别体现在三个方面:效率、类型识别以及可以持有Primitives。
Arrays类(java.util.Arrays)——辅助类
包含了一组可用于数组的Static方法。
equals():比较两个数组是否相等。
fill():填充数组
sort():排序
binarySearch():用于在一个已排序的数组中查找元素的返回位置。(只能对排序后的数组使用此方法,不排序,无意义)
复制一个数组:System.arrayCopy(源数组,偏移量,目标数组,偏移量,拷贝数量)
Java中两种实现比较功能的方法
一是实现java.lang.Comparable接口
Arrays.sort(array),其中array中所含对象实现了comparable接口。
二是java.util.Comparator接口
实现此接口,需实现 int compart(object o1,object o2)
o1小于o2,返回-1;o1等于o2,返回0;o1大于o2,返回1。
Arrays.sort(array,ComparatorImpl)。
2、容器类
Collection包括List和Set。其中,List:必须按照特定的顺序持有这些元素;Set,不能保存重复的元素。
Map:一组以"键—值"(Key—Value)形式出现的Pair。
Collections(java.util.Collections)辅助类:
fill();只能为List工作,不能为Set和Map工作。
3、迭代器
Iterator:可遍历整个Collection,包括Vector、Stack。
4、容器类的应用
在理想情况下,绝对多数代码应该只同上述接口打交道,只是在创建容器的时候才要精确地指明它的确切类型,所以可以这样创建一个List。
List list1 = new LinkedList()
List list2 = new ArrayList()
接口(interface)的优雅就在于,你想修改具体的实现的时候,只要改一下创建的声明就可以了。
1)、List的功能
擅长对元素进行随机访问的,较常用的ArrayList(常用)和更强大的LinkedList。LinkedList不是为快速的随机访问而设计的,但是它却有一组更加通用的方法。
ArrayList:一个用数组实现的List。能进行快速的随机访问,但是往列表间插入和删除元素的时候比较慢。
LinkedList:对顺序访问进行优化。在List中插入和删除元素的代价也不高。随机访问的速度较慢。不过有一些List接口中未定义的方法:addFirst()、addLast()、getFirst()、getLast()、removeFirst()和removeLast()。
2)、Set的功能
Set的接口就是Collection,所以不像List,没有额外的功能。加入Set的每个元素必须是唯一的。
HashSet:为优化查询速度而设计的Set。——(常用)
(SortedSet)TreeSet:是一个有序的Set,其底层是一颗树。这样就能从Set里面提取一个有序序列了。
LinkedHashSet(自JDK1.4):一个在内部使用链表的Set。既有HashSet的查询速度,又能保存元素被加进去的顺序(插入顺序)。
3)、Map的功能
Map接口维持键—值得关联(即Pairs),这样就能用键来找值了。
HashMap:基于Hash表的实现(用它来替代Hashtable)。——(常用)
LinkedHashMap:很像HashMap,但是用Iterator进行遍历的时候,它会按插入顺序或最先使用的顺序进行访问。除了用Iterator外,其它情况下,只是比HashMap稍慢一点。用Iterator的情况下,由于是使用链表来保存内部顺序,因此速度会更快。
(SortedMap)HashMap:一个Weak Key的Map。如果某个对象除了在Map当中充当键之外,在其它地方都没有其reference的话,,那它将被当作垃圾回收。
IdentityHashMap:一个用==,而不是equals()来比较键的HashMap。
默认的object.equals()只是简单地比较两个对象的地址。
ArrayList和Vector的区别,HashMap和Hashtable的区别
答:就ArrayList与Vector主要从二方面来说.
一.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的
二.数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半
ArrayList,Vector, LinkedList的存储性能和特性
ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
就HashMap与HashTable主要从三方面来说.
一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一实现
二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的
三.值:只有HashMap允许在一个集合中有一个null键和在一个集合中有多个null值
Hashtable是HashMap的同步版本;HashMap允许有null值和一个null键,但是,Hashtable不允许有任何内容为null
Hashtable类的对象必须覆盖Object类的hashCode()和equals()方法
关于其他集合类型:
一.ArrayList 提供快速遍历和快速访问。现在设计了新的 RandomAccess 接口,它指出这种列表支持快速随机访问。Vector也实现了RandomAccess 接口。
二.遍历HashSet与HashMap时,其顺序是未知的(但添加删除快)。LinkedHashSet和LinkedHashSet是按照元素的插入的顺序遍历的(遍历快)。
三.TreeSet和TreeMap将保证元素按照元素的自然顺序进行排列。也可以使用一个用户自己实现的比较规则。
四、HashSet有一个散列表支持它。它为基本操作提供固定时间性能。TreeSet它确保了排序集将按元素升序,根据自然顺序排序。
Dictionary类
主要用于将关键字转换成值,该类接收一个关键字并返回一个值。Dictionary是一个抽象类,它是Hashtable的超类。
Properties类
扩展了Hashtable类,但Properties对象的关键字和值必须是String类型,并能将对象写入一个输出流并保存在一个文件中,然后可以把它读回一个输入流。
如果需要维护和搜索一个部件列表,它们由唯一的字母数字序列号标示,其中的部件是Part类型,这时应该使用哪种集合?如果我们改变需求,你也需要能够按顺序、按它们的序列号打印出部件?
1、应该选择HashMap
2、应该选择TreeMap
现在的Java都是分代垃圾机制:新代、旧代(对象时长的)。