黑马程序员技术交流社区
标题:
个人对于集合的归类!
[打印本页]
作者:
余银桂
时间:
2012-6-13 18:15
标题:
个人对于集合的归类!
java集合体系:
-----| Iterable 接口
Itertaotr iterator()
--------| Collection 接口 所有集合的父类
add() remove() clear()
-------------| List 有序,可以重复
listIterator() get(index) remove(index)
----------------| ArrayList 使用数组实现,默认是10,增长0.5倍,操作慢,查询快
----------------| Vector 线程安全的ArrayList
element() elementAt() elements()
----------------| LinkedList 链表实现,操作快,查询慢 , 数据结构:栈、队列
-------------| Set 无序,不可以重复
----------------| HashSet 哈希表,对象的哈希码,hashCode且equals同时相等元素重复。 线程不安全
----------------| TreeSet 红黑树,默认使用自然排序,线程不安全。
实现Comparable接口, compareTo(Object o) 集合的元素实现
实现Compatrator接口,compare(Object o1. Object o2) 直接传递给集合
-----| Iterator
hasNext() next() remove()
--------| ListIterator
hasPrevious() previous() set() add()
-----| Comparable
compareTo()
-----| Comparator
compare()
equals()
-----| Map 用于存储关联对象的集合容器
put(K,V) remove(K) get(K) keySet() values() Set<Map.Entry<K,V>> entrySet()
---------| HashMap 哈希表实现,hashCode且equals同时相等元素重复(Key)
---------| TreeMap 红黑树实现,对Key对象进行排序,默认自然排序。
实现Comparable接口, compareTo(Object o) 集合的元素实现
实现Compatrator接口,compare(Object o1. Object o2) 直接传递给集合
java.util.*
-----| Collections 封装了操作集合的常见算法,提供的全部是静态方法,所以称之为集合的工具类。
sort(List<T> list)
static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key)
static void reverse(List<?> list)
max(Collection<? extends T> coll)
fill(List<? super T> list, T obj)
synchronizedCollection(Collection<T> c) 将线程不安全的集合转换为线程安全的
-----| Arrays 主要封装了操作数组的常见算法,帮助开发人员快速、高效的操作数组。
static <T> List<T> asList(T... a)
Set集合的实现类,如 HashSet底层采用HashMap实现,元素存储在Map的Key上,Value默认为null。
如 TreeSet底层采用TreeMap实现,元素存储在Map的Key上,Value默认为null。
Generic:
1. 集合中泛型应用
使用泛型的时候左右两边泛型的类型必须一致。当然可以一边有一般没有但是不推荐。
2. 泛型的自定义和继承
静态函数不能使用类上的泛型声明,必须单独的声明。
3. 泛型的通配符及其限制
? 所有的类型 Collection<?> = Collection<String>
? extends Number String Integer
? super Integer Number
一个类是自己本身子类或父类。
作者:
sbeeqnui1987
时间:
2012-6-13 23:12
在使用Java的时候,我们都会遇到使用集合(Collection)的时候,但是Java API提供了多种集合的实现。
总的说来,Java API中所用的集合类,都是实现了Collection接口,他的一个类继承结构如下:
Collection<--List<--Vector
Collection<--List<--ArrayList
Collection<--List<--LinkedList
Collection<--Set<--HashSet
Collection<--Set<--HashSet<--LinkedHashSet
Collection<--Set<--SortedSet<--TreeSet
Vector : 基于Array的List,其实就是封装了Array所不具备的一些功能方便我们使用,它不可能不受Array的限制。性能也就不可能超越Array。所以,在可能的情况下,我们要多运用Array。另外很重要的一点就是Vector :sychronized”的,这个也是Vector和ArrayList的唯一的区别。
ArrayList:同Vector一样是一个基于Array上的链表,但是不同的是ArrayList不是同步的。所以在性能上要比Vector优越一些,但是当运行到多线程环境中时,可需要自己在管理线程的同步问题。
LinkedList:LinkedList不同于前面两种List,它不是基于Array的,所以不受Array性能的限制。它每一个节点(Node)都包含两方面的内容:1.节点本身的数据(data);2.下一个节点的信息(nextNode)。所以当对LinkedList做添加,删除动作的时候就不用像基于Array的List一样,必须进行大量的数据移动。只要更改nextNode的相关信息就可以实现了。这就是LinkedList的优势。
List总结:
1. 所有的List中只能容纳单个不同类型的对象组成的表,而不是Key-Value键值对。例如:[ tom,1,c ];
2. 所有的List中可以有相同的元素,例如Vector中可以有 [ tom,koo,too,koo ];
3. 所有的List中可以有null元素,例如[ tom,null,1 ];
4. 基于Array的List(Vector,ArrayList)适合查询,而LinkedList(链表)适合添加,删除操作。
HashSet:虽然Set同List都实现了Collection接口,但是他们的实现方式却大不一样。List基本上都是以Array为基础。但是Set则是在HashMap的基础上来实现的,这个就是Set和List的根本区别。HashSet的存储方式是把HashMap中的Key作为Set的对应存储项。看看HashSet的add(Object obj)方法的实现就可以一目了然了。
public boolean add(Object obj)
{
return map.put(obj, PRESENT) == null;
}
这个也是为什么在Set中不能像在List中一样有重复的项的根本原因,因为HashMap的key是不能有重复的。
LinkedHashSet:HashSet的一个子类,一个链表。
TreeSet:SortedSet的子类,它不同于HashSet的根本就是TreeSet是有序的。它是通过SortedMap来实现的。
Set总结:
1. Set实现的基础是Map(HashMap);
2. Set中的元素是不能重复的,如果使用add(Object obj)方法添加已经存在的对象,则会覆盖前面的对象
为什么要使用集合类 ?
当你事先不知道要存放数据的个数,或者你需要一种比数组下标存取机制更灵活的方法时,你就需要用到集合类。
作者:
无所谓啦
时间:
2014-8-19 12:20
哎,集合学了忘 忘了再学!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2