一、集合类
集合的由来:
面向对象语言对事物都是以对象的形式来体现,为了方便对多个对象的操作,就需要将对象进行存储,集合就是存储对象最常用的一种方式。
集合特点:
1,用于存储对象的容器。(容器本身就是一个对象,存在于堆内存中,里面存的是对象的地址)
2,集合的长度是可变的。
3,集合中不可以存储基本数据类型值。 (只能存对象)
小问题:想用集合存基本数据类型怎么办?
装箱、拆箱。 例:al.add(5); // 相当于al.add(new Integer(5));
集合和数组的区别:
数组虽然也可以存储对象,但长度是固定的,集合长度是可变的。
数组中可以存储基本数据类型,集合只能存储对象。
集合框架的构成及分类:(虚线为接口)
下面分别整理集合框架中的几个顶层接口。
二、 Collection接口
Collection子接口以及常用实现类:
Collection接口
|--List接口:
有序(存入和取出的顺序一致),元素都有索引(角标),元素可以重复。
|--Vector:内部是 ***数****组 *数据结构,是同步的。增删,查询都很慢!100%延长(几乎不用了)
|--ArrayList:内部是
|--LinkedList:内部是
增删元素的速度很快。
|--Set接口:无序,元素不能重复。Set接口中的方法和Collection一致。
|--HashSet: 内部数据结构是
|--LinkedHashSet:内部数据结构是哈希表和链表,是有顺序的HashSet。
|--TreeSet:内部数据结构是有序的
List接口:
有一个最大的共性特点就是都可以操作角标,所以LinkedList也是有索引的。list集合可以完成对元素的增删改查。
Set和List的区别:
1. Set 接口实例存储的是无序的,不重复的数据。List 接口实例存储的是有序的,可以重复的元素 <最本质区别>。
2. Set检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变 。
3. List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变 。
ArryList和Vector可变长度数组的原理:
当默认长度的数组不够存储时,会建立一个新数组。将原来数组的内容拷贝到新的数组当中,并将新增加的元素追加到拷贝完的数组尾,如果仍然不够重复上述动作。其中,ArryList的增加是以原来50%长度进行增加,而Vector是按照100%延长。
ArryList是线程不安全的,Vector是安全的:
由于是否有锁的判断将影响效率,故Arrylist效率远远高于Vector。
而且只要是常用的容器就不是同步的,因为同步效率比较低。
HashSet之覆盖hashCode方法和equals方法来保证元素唯一性
如何保证HashSet的元素唯一性呢?
是通过对象的hashCode和equals方法来完成对象唯一性的:
->如果对象的hashCode值不同,那么不用判断equals方法,就直接存储到哈希表中。
->如果对象的hashCode值相同,那么要再次判断对象的equals方法是否为true:
如果为true,视为相同元素,不存;如果为false,那么视为不同元素,就进行存储。
记住:如果对象要存储到HashSet集合中,该对象必须覆盖hashCode方法和equals方法。
一般情况下,如果定义的类会产生很多对象,比如人,学生,书,通常都需要覆盖equals,hashCode方法,以建立对象判断是否相同的依据。
TreeSet之判断元素唯一性的两种方式(如何排序)
TreeSet默认判断元素唯一性的方式:
根据Conpare接口的比较方法conpareTo的返回结果是否是0,是0,就是相同元素,不存。
下面,我们给出两种自定义判断元素唯一性的方式:
方式一:
让元素自身具备比较功能,即根据元素中的属性来比较。采用这种方式需要元素
方式二:
(开发用这个,掌握比较器的用法)
让集合自身具备比较功能。自己写一个
不再需要元素实现Conparable接口。
思考:
如何通过这种方式实现先进先出和先进后出?让比较器直接返回1或-1即可。