集合
数组与集合的区别:
1.集合与数组存储数据概述:
-
集合、数组都是对多个数据进行存储操作的结构,简称Java容器。
-
说明:此时的存储,主要指的是内存层面的存储,不涉及到持久化的存储(.txt,.jpg,.avi,数据库中)
2.数组存储的特点:
- 一旦初始化以后,其长度就确定了。
- 数组一旦定义好,其元素的类型也就确定了。我们也就只能操作指定类型的数据了。比如:String[] arr;int[] arr1;Object[] arr2;
- 一旦初始化以后,其长度就不可修改。
- 数组中提供的方法非常限,对于添加、删除、插入数据等操作,非常不便,同时效率不高。
- 获取数组中实际元素的个数的需求,数组没有现成的属性或方法可用
- 数组存储数据的特点:有序、可重复。对于无序、不可重复的需求,不能满足。
- 集合存储的优点:
解决数组存储数据方面的弊端。
Collection接口:
单列集合,用来存储一个一个的对象
- List接口:存储序的、可重复的数据。
- ArrayList、LinkedList、Vector
- Set接口:存储无序的、不可重复的数据
- HashSet、LinkedHashSet、TreeSet
通用功能:
- 添加 add
- 删除 remove
- 记数 size
- 包含 contains
- 清空 clear
- 是否空 isEmpty
迭代器(Iterator)
- hasNext();//判断是否有与乃是没有被遍历
- next(); //返回游标当前位置,并向下移动一个位置
- remove();//删除游标左面的元素,最起码执行一次next代码才能使用该代码,只能执行一次
public class void main (String [] args){}
Iterator<String> it = list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
List接口
存储的数据特点:存储序的、可重复的数据。
常用方法:(记住)
-
增:add(Object obj)
-
删:remove(int index) / remove(Object obj)
-
改:set(int index, Object ele)
-
查:get(int index)
-
插:add(int index, Object ele)
-
长度:size()
-
遍历:① Iterator迭代器方式
② 增强for循环
③ 普通的循环
常用实现类:
Collection接口:单列集合,用来存储一个一个的对象
- List接口:存储序的、可重复的数据。 -->“动态”数组,替换原的数组
- ArrayList:作为List接口的主要实现类;线程不安全的,效率高;底层使用Object[] elementData存储
- LinkedList:对于频繁的插入、删除操作,使用此类效率比ArrayList高;底层使用双向链表存储
- Vector:作为List接口的古老实现类;线程安全的,效率低;底层使用Object[] elementData存储
Set接口
存储的数据特点:无序的、不可重复的元素
set的实现类是HashSet,HashSet的底层是HashMap
以HashSet为例说明:
Hash具有两大特性
- 无序性:不等于随机性。存储的数据在底层数组中并非照数组索引的顺序添加,而是根据数据的哈希值决定的。
- 不可重复性:保证添加的元素照equals()判断时,不能返回true.即:相同的元素只能添加一个。
底层实现:
首先进行hashcode算法计算后,得到在Entry数组中的存放位置. 如果此位置上的数据为空,key-value添加成功
如果此位置上的数据不为空(此位置上存在一个或多个数据(以链表形式存在)),比较哈希值:
如果key的哈希值与已存在的数据的哈希值都不同,此时key-value数据添加成功
如果key的哈希值和与已存在的某个数据的哈希值相同,需要进行equals比较:调用key所在类的方法
如果equlas返回folse:此时key数据添加成功
如果equals返回是true:使用key-value中的value替换相同key的value值
在JDK8中的改动:
-
jdk8中的数组底层没有创建一个长度为16的数组
-
底层的数组是Node[] ,而非Entry数组[]
-
首次调用put()方法时,底层创建长度为16的数组
-
jdk8中的底层结构为数组+链表+红黑树
-
当数组的某一个索引位置上以链表形式存在数据个数>8 且当前数组的长度>64时,此时索引位置上的所有数据改为使用红黑树存储
HashMap的常用方法
t()方法时,底层创建长度为16的数组
-
jdk8中的底层结构为数组+链表+红黑树
-
当数组的某一个索引位置上以链表形式存在数据个数>8 且当前数组的长度>64时,此时索引位置上的所有数据改为使用红黑树存储
HashMap的常用方法