集合框架分类:
在讲述集合框架之前我们先看下数组的概念,数组可以存放多个数据类型相同的数据。集合框架也可以存放数据类型相同的数据,但是也可以存放数据类型不同的数据(在实际使用的时候不建议存放数据类型不同的数据,因为这样在存取的时候不方便操作)。除此之外集合这种元素它的大小是可变的。它就像是一个可变的数组一样。随着填入数据的增多,集合大小自动增加。
Collection和Map都是接口,没有具体的实现类,都是通过子接口的实现类来间接实现的。Collection中有的集合是允许元素重复的,有的是不允许元素重复的,有的是有序的,有的是无需的。因此根据这些特征可以将集合分成有序的和无序的,以及按集合元素是否可重复分成可重复元素的和不可重复元素的结合。
Collection中两个非常常用的子接口(依然是接口),Set和List。
List也是一个接口,但是这个接口规定了其所有实现类都是有序的,并且允许元素重复,并且允许null元素。List接口下面三个常用的具体的实现类(ArrayList、LinkedList、Vector)。
这三个实现类都继承了接口中的特性(元素有序,允许重复元素,允许null值)。但是ArrayList和LinkedList的实现不是同步的也就是说该类的实现时线程不安全的。Vector是线程安全的。
有关这三个类的具体方法可以参考相应的帮助文档来细细研读。在这里就不赘述了!
Set接口中常用的实现类:HashSet和TreeSet。
Set是接口,这个接口不能包含重复元素,并且最多只有一个null元素。
HashSet是去重复的,并且是无序的,集合中最多只允许一个null元素。
HashSet是如何去重复的,为什么是无序的?
当向集合中插入数据的时候,会自动给这个元素分配一个Hashcode值,这个值代表了在该集合中的索引位置,根据索引位置,将这个值填入进去,由于这个索引值是根据hashcode算出来的,因此在分配集合元素的时候是无需的,并且不保证这种顺序是固定不变的。当相机和中传入了两个相同的值时,他们两个元素的hashcode是相同的,就会在存的时候索引位置发生碰撞,这时候就会触发equals方法用来比较这两个内容是否相同,当内容相同的时候就会将后面添加的元素覆盖掉前面的,当添加的元素不相同的,只是hashcode相同的时候,就会将后添加的元素在原来hashcode值的基础上加上一个偏移量,存入集合中。但是在实际操作的时候如果存入两个相同的字符串的时候,后存入的字符串会覆盖掉先存入的字符串,但是当声明两个属性一模一样的对象的时候,就不会发生元素覆盖(因为在使用比较规则的时候是先使用hashcode来验证他们两个的值是否相同,在进行两个对象比较的时候,hashcode值是不同的,因此不会产生覆盖,产生这个的驻澳问题是没有重写类中的hashcode方法和equals方法),当重写了hashcode方法和equals方法的时候,这两个对象产生的hashcode值是相同的,就会触发equals比较,比较的结果是相同的,这时候就会后面的元素覆盖前面的元素。从而实现去重复。
在重写实体类中的hashcode和equals方法的时候可以使用Eclipse中自带的重写方法来实现方法的重写,具体操作是:在Eclipse代码编辑区域右击选择Source,然后选择Generate HashCode()... and equals()...
TreeSet:在Set集合中此实现是有序的,但是不允许null元素,不允许重复元素。
HashTable:线程同步、允许存在null元素此类实现一个哈希表,该哈希表将键映射到相应的值。任何非 null 对象都可以用作键或值
Map集合:键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值
常用实现类:HashMap和TreeMap
HashMap:允许使用null值和null键,这种集合不保证跌代顺序,并且不保证该顺序恒久不变。这种集合的实现不是线程同步的。
TreeMap:这种集合是有序的,该实现依然不是同步的
总结:
两种结合框架接口Collection和Map,Collection中两个常用的子接口Set和List。List常用的实现类ArrayList、Linkedlist、Vector。Set中常用的实现类HashSet和TreeSet。Map键值对集合,常用的实现类HashMap和TreeMap。
有序的:ArrayList、LinkedList、Vector、TreeSet、TreeMap
无序的:HashSet、HashMap、HashTable
实现同步:Vector、HashTable
实现非同步的:ArrayList、Linkedlist、TreeSet、TreeMap、HashSet、HashMap
允许重复元素:ArrayLIst、LinkedList、Vector
不允许重复元素:HastSet、TreeSet、HashTable、HashMap、TreeMap
允许null元素:ArrayLIst、LinkedList、Vector、HashSet(最多一个),HashMap
不允许使用null元素:TreeSet、HashTable、TreeMap
在使用集合框架的时候我们会注意到后面有几个尖括号,尖括号里面写个E,或者在Map键值对映射中写着<K,V>,这些字符表示占位符,用来规定传入这个集合中的数据类型,集合中虽然可以传入不同的数据类型,但是我们推荐传入类型相同的数据,这样的话方便以后存取。在使用占位符声明一个集合的时候代表只能存进去这种类型的数据。其他类型的数据存不进去。这种机制在Java中称为泛型---用来对声明时要传入集合框架中的数据类型进行修饰和限定。
例如:
ArrayList<String> list = new ArrayList<String>();
这种方式声明的集合只能传进String类型的数据,其他类型的数据传不进去。从而起到了对传入数据类型的修饰和限定。因此以后凡是使用集合框架的地方都要使用这种泛型来进行约束。