目录
集合框架
集合理解为是:容器。
集合和数组的区别:
数组:
1.存储基本类型或引用类型都可以
2.创建数组时,只能存储同一种类型的数据
3.容器大小是固定的,不能改变
4.数组中的元素通过下标来操作
集合:
1.只能存储引用类型
2.创建集合时,可以存储不同类型的数据
3.容器大小是可变的
4.有的容器有下标,有的没有下标
集合框架:
java.util包
单列集合:
Collection
--List :有序可重复,有序指的是存入的顺序和取出的顺序是一致的
--ArrayList
--LinkedList
--Set :无序不可重复,无序指的是存入的额顺序和取出的顺序不一定一致。
--HashSet
--LinkedHashSet
双列集合:
Map:映射,存储一对一对的数据。
--HashMap
--LinkedHashMap
Collecttion:
—List:有序可重复
–LinkedList:使用链表实现的,增删快,查询慢
–ArrayList:使用可变数组实现,查询快,增删慢
—Set:无序不可重复
–HashSet:使用哈希表实现,自定义对象需重写hashCode和equals方法
–LinkedHashSet:链表+哈希表,有序不可重复
方法: add() / remove() / size()
Map:
–HashMap key要唯一,使用哈希表算法
–LinkedHashMap key唯一并有序,使用哈希表+链表
方法: put() / get(key) /size() /remove()
Collection
是一个接口。
遍历集合元素:
1.将集合转为数组
Object[] toArray()
2.使用迭代器
Iterator iterator()
注意:如果没有迭代的元素,还调用了next方法,则会出现异常
NoSuchElementException 没有这个元素异常
使用迭代器时注意:
对coll对象想要迭代取出元素,又想要添加元素。
解决方式:
要么都是用迭代器里的功能来操作
要么都是用集合里的功能来操作
List集合
是Collection接口的子接口,称为叫做序列(列表)。
特点: 有序,可以有重复元素。因为有整数索引,可以控制顺序,可以有重复元素。
因此,此接口在继承父接口的方法的同时,新增了一些与索引有关的方法。
方法:
在指定的索引处可以添加、修改、删除、获取元素。
遍历:
1.转数组 2.迭代器和列表迭代器 3.for-each语句或普通for语句
使用列表迭代器逆向遍历,需先调整指针位置,可以通过下边的方法进行调整。
List的实现类
ArrayList
实现原理:可变大小数组,因此可以精确查找元素。
特点:查找或修改快,增删慢(元素位置的移动)。元素都在一块连续的空间。
可以存储null元素,前身是Vector。
与Vector的区别是:ArrayList线程不安全,Vector线程安全,都慢。
这个对象现在是List接口的一个实现类。
构造方法:
new ArrayList() : 默认初始容量为10
new ArrayList(capacity):指定初始容量
LinkedList
实现原理:链接列表实现。
节点: 元素+引用。
特点:元素不需要在一块连续的空间内,查找慢,增删快。线程不安全对象。
允许存储null元素。在头尾添加了get、remove、insert方法。

泛型
属于是一个机制,jdk5.0版本新增的特性。
理解:广泛的类型。当定义某个类时,不能确定操作的数据类型时,可以使用泛型。
当一旦确定了泛型的类型,那么此时只能操作这一种类型。
某种类型支持泛型技术,但是我们应用该技术,那么默认操作的是Object类型。
格式: <引用类型>
应用:eg:ArrayList list = new ArrayList();
jdk7.0, 类型推断,ArrayList list = new ArrayList<>();
好处:
1.安全机制,将运行时会出现的异常提前至编译时期
2.不需要强转
自定义泛型
泛型类
格式:
class 类名<E1,E2,…>{}
泛型类上定义的泛型,在整个类中可以直接使用。
当创建对象时,确定泛型类型。
泛型方法
格式:
修饰符 <E1,E2,E3,…> 返回值类型 方法名(E1 e1, E2 e2){}
调用方法时,确定泛型类型。
注意:1.泛型类型的声明,并不意味着都需要同时使用。
2.该方法是实例方法,因此泛型类上的泛型可以直接使用
3.方法可以是静态的,那么该方法使用类名调用,不需要对象,因此不可以使用泛型类上的泛型。
泛型接口
格式:
interface 接口名<E1,E2,…>{}
确定泛型类型:1.实现接口时直接确定 2.创建实现类时再确定
定义泛型常量的名字:E、R、T、Q、U、W…
泛型通配符
是应用在方法的参数列表上。
有三种写法:
<?> : 通配符或占位符,相当于Object类型。
泛型限定:
<? extends E>: E类型或E的子类型 —上限
<? super E>: E类型或E的父类型 — 下限
Set集合
是Collection的一个子接口。
特点:不能存储重复元素,也不能保证存入和取出顺序一致。
最多能存储一个null.
接口中并没有新增方法,全部来自于父接口Collection。
遍历:
1.转数组 :Object[] toArray()
2.迭代器 :Iterator
3.jdk5.0新增的语句:
增强for循环或for-each语句:
for(元素类型 变量名 : 被遍历的对象(数组或集合)){
语句;…
}
只能用来做与遍历有关的操作,不能修改集合或数组中的元素值。
如果想要修改只能使用普通的for循环。
4. T[] toArray(T[])
a.创建的数组长度等于集合的长度,将集合元素直接存储到数组中
b.创建的数组长度大于集合的长度,将集合元素直接存储到数组中,其余位置存默认值
c.创建的数组长度小于集合的长度,该数组不使用,创建一个新的数组来存储集合的元素,并将这个新数组返回。
HashSet
底层实现原理是:哈希表算法。
当存储元素时,元素首先会先计算自身的哈希值,看这个值是否在容器中有出现,如果没有那么直接存入;如果有出现,会进行第二次的比较,比较是否是同一对象,如果是不存入,如果不是则存入。
元素计算哈希值依赖于Object类中的hashCode方法
元素进行比较是否是同一对象依赖于Object类中equals方法
当存储自定义对象时,想要保证元素的唯一(属性信息值唯一),需重写hashCode和equals方法。
hashCode方法的重写:通常使用类中的属性编写一个表达式
equals方法的重写:进行属性值的比较
LinkedHashSet
底层实现原理是:链接列表+哈希表实现的。
因此该容器的特点是:有序不可重复。
使用方式按照HashSet使用即可,因为LinkedHashSet是HashSet容器的子类。
Map
地图的意思,在Java中称为叫做映射。
Map容器是用来存储具有映射关系的一对一对的数据,一对一对的数据又称为叫做键值对。
键–key ,值–value,注意key要保证唯一,value可重复。
实现类对象:
HashMap
—LinkedHashMap
Map中方法演示:
Map集合元素遍历:
实现类:
HashMap
key使用哈希表算法,允许存储null作为key和value,线程不安全对象。
LinkedHashMap
key使用哈希表+链表算法,保证顺序。有序不可重复。
当存储自定义对象时,需重写hashCode和equals方法。
Hashtable
key使用哈希表算法,不允许存储null,线程安全对象。
Collections
集合工具类。都是静态方法,大部分方法都是用来操作Collection。
可变参数:
数据类型… 变量名
实际底层原理:就是一个数组,根据实际参数的个数创建对应大小的数据,并将数据存入。
实际参数的个数:大于等于0
注意:1.在一个参数列表中,只能出现一个可变参数
2.在参数列表中,可变参数必须放在最后边
方法:
以上方法是用来返回一个线程安全的集合容器对象。
以上方法是用来返回一个不可修改的容器对象。