集合框架的内容太多太复杂,一旦不用就很容易忘记,于是我打算记录下来一些我的学习过程,在多多看API开发文档来提高自己的能力 。个人的理解或者哪里错了,希望各位大哥可以指出来,大家一起学习
每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector、Stack、HashTable和Array。随着集合的广泛使用,Java1.2提出了囊括所有集合接口、实现和算法的集合框架。在保证线程安全的情况下使用泛型和并发集合类,Java已经经历了很久。它还包括在Java并发包中,阻塞接口以及它们的实现。集合框架的部分特点如下:
(1)使用核心集合类降低开发成本,而非实现我们自己的集合类。
(2)随着使用经过严格测试的集合框架类,代码质量会得到提高。
(3)通过使用JDK附带的集合类,可以降低代码维护成本。
(4)复用性和可操作性!
(5)用来存储对象,如果对象的个数不确定
(6)集合的长度是可变的,很灵活
(7)集合是依赖对象而生的,所以就对基本数据类型"不感兴趣",所以集合中不可以存储基本数据类型值(但是实际是可以放的,存在自动拆箱和装箱功能)
List<Integer> list = new ArrayList<Integer>();
list.add(1);
//打印结果为1
System.out.println(list.get(0));
------------------------------------------------------------------------------------------------------------------------------------
集合的一些好用的小技巧
需要数据唯一吗?
需要:set()
需要制定顺序吗:
需要:treeSet
不需要:HashSet
但是想要一个和存储一致的顺序:LinkedHashSet
不需要:List()(有序)
需要频繁增删吗?
需要:LinkedList
不需要:ArrayList
ps:有序指的是插入的顺序
------------------------------------------------------------------------------------------------------------------------------------
如何记录每一个容器的结构和所属体系呢?
看名字!
List
|--ArrayList
|--LinkedList
Set
|--HashSet
|--TreeSet
后缀名就是该集合所属的体系
前缀名就是该集合的数据结构
看到 array(ArrayList,):就要想到数组,就要想到查询快,有角标
看到 Link( LinkedList , LinkedHashSet , LinkedHashMap ) : 就要想到链表,就要想到增删快,就要想到
增:add() ;
返回index位置的元素 :get(int index) ;
移除第一个或者最后一个元素 : remove+frist last();
看到hash( HashSet , HashMap ): 就要想到哈希表,就要想到唯一性,就要想到覆盖hashcode()方法和equals()方法
ps:覆盖它们的好处是利于查找,减少循环次数,提高效率,这两者的关系为:equals()相等的两个对象,hashcode()一定相等,equals()不相等的两个对象,有可能hashcode()不相等,也有可能相等。hashcode()不等,一定能推出equals()也不等;hashcode()相等,equals()可能相等,也可能不等。详细可以看这里:http://www.360doc.com/content/14/0527/09/15113968_381327452.shtml
看到 tree ( treeSet , TreeMap ) : 就要想到二叉树,就要想到排序,就要想到实现两个接口Comparable,Comparator
ps:TreeSet是依靠TreeMap来实现的。TreeSet是一个有序的set。它实现了Comparable.用于比较排序。。详细可以看连接 :http://blog.csdn.net/dreamwbt/article/details/53185592 http://www.cnblogs.com/ningvsban/archive/2013/05/06/3062535.html
========================================================================
Map:一次添加一对元素。Collection 一次添加一个元素。
Map也称为双列集合,Collection集合称为单列集合。
其实map集合中存储的就是键值对。
map集合中必须保证键的唯一性。
常用方法:
1,添加。
value put(key,value):返回前一个和key关联的值,如果没有返回null.
2,删除。
void clear():清空map集合。
value remove(key):根据指定的key翻出这个键值对。
3,判断。
boolean containsKey(key):
boolean containsValue(value):
boolean isEmpty();
4,获取。
value get(key):通过键获取值,如果没有该键返回null。
当然可以通过返回null,来判断是否包含指定键。
int size(): 获取键值对的个数。
Map常用的子类:
|--Hashtable :内部结构是哈希表,是同步的。不允许null作为键,null作为值。
|--Properties:用来存储键值对型的配置文件的信息,可以和IO技术相结合。
|--HashMap : 内部结构是哈希表,不是同步的。允许null作为键,null作为值。
|--TreeMap : 内部结构是二叉树,不是同步的。可以对Map集合中的键进行排序。
ps:
同步设计到线程的问题,列入a线程调用Hashtable的size方法(还没调用完)
这时B线程也来调用size方法的话,就要排队等候,因为a正在调用
如果是非同步的话,a,b可以在同一时间对Hashtable的一个方法