List
List是一个接口,是实现于collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。而我们常用的ArrayList、LinkedList集合也是实现于List接口的。
ArrayList集合
概念
ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。ArrayList 继承了 AbstractList ,并实现了 List 接口,并且List集合是有序的,且元素可以重复。
ArrayList存储结构
因为ArrayList其实就像一个动态的数组,所以是可以通过索引来查找元素,因此它的查询较快,如图
ArrayList集合添加数据时,集合中会新开辟一个空间并给予索引
当ArrayList进行指定索引添加操作的时候,集合依然是在后面开辟一个存储空间,并给予索引
同时要添加索引的值发生改变,原来未改变前的值以此向后移动一位
删除指定索引的元素的元素,在ArrayList集合将指定索引的元素内容删除,并且后面的索引值向前一位,最后删除最后一位索引空间,这个时候才算是完成删除操作
那么由上面可以看到,在查询方面ArrayList集合较快,但是由于其的存储结构,使其在删除和添加的操作上比较繁琐,因为改动一个可能会使其一部分变动,所以效率不高,速度不快
特点:ArrayList查询快、增删慢
ArrayList的使用
1.导入java.util包下的ArrayList包
import java.util.*;//代表util包下所有的类
2.构造一个ArrayList对象
List<String> list = new ArrayList<>();
3.使用方法操作数据
ArrayList常用方法
|
例如:
List<String> list = new ArrayList<>();//集合初始化
list.add("a");//添加元素
list.add("b");
list.add("c");
list.add("d");
System.out.println(list);//打印集合
结果如下:
|
例如:
List<String> list = new ArrayList<>();
//添加元素
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add(1,"e");
//遍历元素
for (String s : list) {
System.out.println(s);
}
结果如下:
|
例如:
List<String> list = new ArrayList<>();
//添加元素
list.add("a");
list.add("b");
list.add("c");
list.add("d");
System.out.println(list);
list.clear();
//遍历元素
for (String s : list) {
System.out.println(s);
}
结果如下:
|
例如:
List<String> list = new ArrayList<>();
//添加元素
list.add("a");
list.add("b");
list.add("c");
list.add("d");
//打印输出
System.out.println(list.get(1));
结果如下:
|
例如:
List<String> list = new ArrayList<>();
//添加元素
list.add("a");
list.add("b");
list.add("c");
list.add("d");
System.out.println(list.size());//打印集合元素个数
结果如下:
|
例如:
List<String> list = new ArrayList<>();
//添加元素
list.add("a");
list.add("b");
list.add("c");
list.add("d");
System.out.println(list.indexOf("b"));//元素索引
System.out.println(list.indexOf("2"));//找不到对应索引则输出-1
结果如下:
LinkedList
概念
LinkedList底层是通过双向链表实现的。所以,LinkedList和ArrayList之前的区别主要就是数组和链表的区别。
LinkedList的存储结构
如图所示,在每个数据的左右都有前后指针,后指针指向后面的一个数据,前指针指向前面的一个数据。
因为LinkedList的底层是通过双向链表来实现存储的,所以用LinkedList来存储数据的时候,比如我们要查询第三个数据时,通过索引查找,但是在LinkedList集合中的查询是从索引0开始依次往后找,直到索引为2时才停止,这还是三个数据,一般来说我们的数据会放入的很多很多,如果用LinkedList集合放入数据,查询的效率就比较慢;但是对应的,正因为他的底层不是数组而是链表,每个数据都有前后指针,那么,对于增删的操作,我们只需要找到对应的指针就可以了,增删的效率就会很快了。
特点:LinkedList查询慢、增删快
LinkedList的常用方法
Set接口
Set也是一个集合接口,继承了Collection接口,
使用的大环境:无序(添加的顺序)、不重复
HashSet实现类
HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合。
HashSet 允许有 null 值。
HashSet 是无序的,即不会记录插入的顺序。
HashSet 不是线程安全的, 如果多个线程尝试同时修改 HashSet,则最终结果是不确定的。 您必须在多线程访问时显式同步对 HashSet 的并发访问。
HashSet 实现了 Set 接口。
使用HashSet
实现HashSet对象
Set<Integer> set = new HashSet<>();
添加元素
//添加元素
set.add(1);
set.add(12);
set.add(3);
set.add(4);
常用方法
迭代器遍历集合
Iterator<Integer> it1 = set.iterator();
//判断it1是否有下一个值
while (it1.hasNext()){
//获取这个值
Integer number = it1.next();
System.out.println(number);
}
Map
概念
Map 是一种键-值对(key-value)集合,Map 集合中的每一个元素都包含一个键对象和一个值对象。其中,map中键可以是任意类型的对象,键对象不允许重复,每个键都有一个对应的值。值对象可以重复,并且值对象还可以是 Map 类型的。
使用方法
因为Map是一个接口不能直接实现,需要通过创建Map类的实现类HashMap
Map<String,Object> map =new HashMap<>();
添加操作put
map.put("姓名","蔡徐坤");
map.put("爱好","唱跳rap篮球");
map.put("代表作","鸡你太美");
常用方法
迭代器遍历 HashMap集合
Set<String> keySet = map.keySet();//从map中获取Key值放入新的集合
Iterator<String> it2 = keySet.iterator();//使用迭代器
//判断是否有下一个值
while (it2.hasNext()){
//获取迭代当前的值
String key = it2.next();
Object values = map.get(key);//用获取到的Key获取values
//打印
System.out.println(key+"--->"+values);
}