提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
2022-08-24学习笔记
一、集合框架的简介
集合框架是一种存储数据的容器;集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。任何集合框架都包含三大块内容:对外的接口、接口的实现和对集合运算的算法。
特点:
-
对象封装数据,对象多了也需要存储。集合用于存储对象。
-
对象的个数确定可以使用数组,对象的个数不确定的可以用集合。因为集合是可变长度的。
使用集合框架的好处
- 容量自增长;
- 提供了高性能的数据结构和算法,使编码更轻松,提高了程序速度和质量;
- 允许不同 API 之间的互操作,API之间可以来回传递集合;
- 可以方便地扩展或改写集合,提高代码复用性和可操作性。
- 通过使用JDK自带的集合类,可以降低代码维护和学习新API成本
二、List集合
1.概述
List是元素有序并且可以重复的集合。
List的主要实现:ArrayList, LinkedList, Vector。
ArrayList基本等同于Vector,ArrayList是线程不安全的,在多线程的情况下不建议用ArrayList。
ArrayList扩容:element在无设置值的时候0→10→1.5倍……
有设置值时按1.5倍扩容。
transient表示该属性不会被序列化。
2.List常用方法:
增:add(index,element);//在index的位置添加element,注意索引index要存在,index<=size;
addAll(index,Collection);
删:remove(index);removeAll(Collection);clear();//通过索引删除元素,并将被删除的元素返回;
改:set(index,element);
获取:get(index);subList(fromIndex,toIndex:返回的是两个索引之间的内容);listterator;indexOf(value)---第一次出现"value"的索引位置;lastIndexOf(value)--最后出现"value"的索引位置;size;
判断:isEmpty;contains(Collection);
import java.util.ArrayList;
import java.util.List;
public class Test10 {
public static void main(String[] args) {
List list = new ArrayList<>();
//只有一个内容时默认为元素
list.add(111);
list.add(222);
list.add(333);
list.add(444);
list.add(555);
list.add(666);
list.add(777);
list.set(3,"tttt");//更改
//list.remove(111);此时运行会报错,remove后如果为整数则默认为索引;
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}
LinkedList不会出现扩容的问题;比较适合随机位置增删;因为是基于链表实现,所以在定位查询时效率较低;
ArrayList基于数组实现,当在末尾增加或删除会较为方便,但随即增删是效率较低;同时随即查询数据时会有更好的性能。
3.迭代器的执行原理
Iterator iterator = col.iterator();//先获取一个集合的迭代器!!!!!
//hasNext();判断是否还有下一个元素
while(iterator.hasNext()){
//next();①指针下移②将下移以后集合位置上的元素返回
System.out.println(iterator.next());
}
在调用it.next();之前必须要调用hasNext();方法进行检测,如果没有,且下一条记录无效,则会抛出异常。
4.增强for
public class Demo02 {
public static void main(String[] args) {
List list = new ArrayList();
list.add(new Student("张三", 21));
list.add(new Student("李四", 22));
list.add(new Student("王五", 23));
list.add(new Student("小二", 24));
//增强for底层仍然是迭代器
//增强for,不仅可以用在集合,也可以直接用在数组
for (Object Student:list){
System.out.println(Student);
}
//数组
int[] nums = {1,2,3,4,5}
for(int i :nums){
System.out.println(i);
}
}
}
三、Set集合
Set集合元素无序(存入和取出的顺序不一定一致),并且没有重复对象。
Set的主要实现类:HashSet, TreeSet。
Set与List方法类似,二者都属于Collection接口,Set与List的区别:
-
List:有序(元素存入集合的顺序和取出的顺序一致),元素都有索引,元素可以重复。
-
Set:无序(存入和取出顺序有可能不一致),没有索引,不可以存储重复元素。必须保证元素唯一性。
Set接口遍历方式:①迭代器②增强for 注:不能使用索引的方式获取
四、Map接口
键对象和值对象映射,每个元素包含一对键对象和值对象;
Map不继承与Collection接口;常用实现类:HashMap、TreeMap、HashTable、LinkedHashMap、ConcurrentHashMap;
Map与Collection并列存在,用于保存具有映射关系的数据:Key-Value,key不可以重复,value可以重复;
Map常用方法:
增:put(Object key,Object values);putAll;
删:remove(Object key);clear();
获取:get;size;entrySet;keySet;values;
判断:isEmpty;containsValue;containsKey;
重写:equals;hashCode;用来判断是否相等;
public class Map01 {
public static void main(String[] args) {
//双列元素:key-value
//常用String做key
//key与value一一对应,通过指定的key总能找到value
HashMap map = new HashMap();
map.put("num1","666");//k-v
map.put("num2","777");
map.put("no1","tjh");
map.put("num44","tjh");
map.put("no1","afafasx");//key不能重复,相同的key会把原来的tjh替换为afafasx
map.put(null,null);
map.put(null,"abc");//key和value都可以为null,但是key为null只能有一个,key重复会发生替换
System.out.println(map);
}
}
HashMap:基于哈希表实现(数组+链表);
LinkedHashMap:双向链表维护元素的顺序,顺序为插入顺序或者最近最少使用的顺序;
Map接口遍历方法:①containsKey查找键是否存在
②keySet获取所有键
③entrySet获取所有关系
④values获取所有的值
public class MapFor {
public static void main(String[] args) {
HashMap map = new HashMap();
map.put("Zzitai","儿姿");
map.put("Letme","少爷");
map.put("Krystal","刚子");
map.put("AmaziJ","御剑蛤蟆");
//1---------keySet();取出所有的键,通过key取出对应的value
Set keyset = map.keySet();
for (Object key : keyset) {
System.out.println(key+"-----"+map.get(key));
}
System.out.println("-------------------------------------");
//2---------通过迭代器
Iterator iterator = keyset.iterator();
while (iterator.hasNext()) {
Object key = iterator.next();
System.out.println(key+"-----"+map.get(key));
}
//3---------values();取出所有的values
System.out.println("-------------------------------------");
Collection values = map.values();
for (Object obj :values) {
System.out.println(obj);
}
System.out.println("-------------------------------------");
Iterator iterator1 = values.iterator();
while (iterator1.hasNext()) {
Object next = iterator1.next();
System.out.println(next);
}
//4----------通过entrySet();获取
Set set = map.entrySet();//EntrySet<Map.Entry<K,V>>
for (Object entry : set) {
//将entry转成Map.Entry
Map.Entry e = (Map.Entry) entry;//object强转map,之后才能调用map的方法
System.out.println(e.getKey()+"-------------"+e.getValue());
}
//5--------------entrySet迭代器
System.out.println("-------------------------------------");
Iterator iterator2 = set.iterator();
while (iterator2.hasNext()) {
Object next1 = iterator2.next();//Node类型
//向下转型Map.Entry
Map.Entry m = (Map.Entry) next1;
System.out.println(m.getKey()+"***"+m.getValue());
}
}
}