目录
ArrayList、LinkedList、Vector 的区别
集合简介
集合框架是?:
用于存储数据的容器。
特点
-
对象封装数据,对象多了也需要存储。集合用于存储对象。
-
对象的个数确定可以使用数组,对象的个数不确定的可以用集合。因为集合是可变长度的。
集合和数组的区别
-
数组是固定长度的;集合可变长度的。
-
数组可以存储基本数据类型,也可以存储引用数据类型;集合只能存储引用数据类型。
-
数组存储的元素必须是同一个数据类型;集合存储的对象可以是不同数据类型。
使用集合框架的好处
- 容量自增长;
- 提供了高性能的数据结构和算法,使编码更轻松,提高了程序速度和质量;
- 允许不同 API 之间的互操作,API之间可以来回传递集合;
- 可以方便地扩展或改写集合,提高代码复用性和可操作性。
- 通过使用JDK自带的集合类,可以降低代码维护和学习新API成本。
集合框架关系图
Collection接口
所有集合类都位于java.util包下。Java的集合类主要由两个接口派生而出:Collection和Map,Collection和Map是Java集合框架的根接口,这两个接口又包含了一些子接口或实现类。
- Collection一次存一个元素,是单列集合;
- Map一次存一对元素,是双列集合。Map存储的一对元素:键–值,键(key)与值(value)间有对应(映射)关系。
Collection集合主要有List和Set两大接口
- List:有序(元素存入集合的顺序和取出的顺序一致),元素都有索引。元素可以重复。
- Set:无序(存入和取出顺序有可能不一致),不可以存储重复元素。必须保证元素唯一性。
List集合
List集合特点:
List是元素有序并且可以重复的集合。
List的主要实现:
ArrayList, LinkedList, Vector。
1、UML
遍历方式:
- 下标
- foreach(>=jdk1.5)
- 迭代器Iterator(原理)
List lst=new ArrayList();
lst.add("zs");
lst.add("ls");
lst.add("ww");
lst.add("zs");
//jdk1.8新特性
lst.forEach(System.out::println);
//List遍历方式(3种)
//1) for下标
System.out.println("---------1) for下标---------");
for (int i = 0; i < lst.size(); i++) {
System.out.println(lst.get(i));
}
//2) foreach
System.out.println("---------2) foreach---------");
for (Object object : lst) {
System.out.println(object);
}
//3) iterator(迭代器)
System.out.println("---------3) iterator(迭代器)---------");
//获取迭代器
Iterator it = lst.iterator();
//hasNext():判断集合中的下一个元素是否存在,不移动下标(重点)
//next():移动下标并取出当前元素
//循环遍历
while(it.hasNext()) {
System.out.println(it.next());
}
List删除方式(3种+1)
- for正向删除
- for逆向删除
- iterator(推荐)
- clear 清空
List lst=new ArrayList();
lst.add("zs");
lst.add("ls");
lst.add("ww");
lst.add("zs");
System.out.println("删除之前的List集合大小:"+lst.size());
//第一次删除:i=0 lst.remove(0) a 4
//第二次删除:i=1 lst.remove(1) c 3
//第三次删除:i=2 2<2
System.out.println("---------1) for(正向删除)---------");
int len=lst.size();
for (int i = 0; i <len; i++) {
lst.remove(0);
}
System.out.println("---------2) for(逆向删除)---------");
int lens=lst.size()-1;
for (int i = lens; i>=0; i--) {
lst.remove(i);
}
System.out.println("---------3)iterator(迭代器)---------");
//获取迭代器
ListIterator its = lst.listIterator();
while(its.hasNext()) {
//注:先移动下标,再删除元素
its.next();
its.remove();
}
System.out.println("---------4) clear(清空)---------");
lst.clear();
System.out.println("删除之后的List集合大小:"+lst.size());
List优化
核心概念:
- 初始化容量:10
- 负载因子(扩容比例):1.5
- 计算公式:当前容器大小*负载因子(向下取整)
第一次:10*1.5=15
第二次:15*1.5=22
第三次:22*1.5=33
public static void main(String[] args) {
List lst=new ArrayList();
for (int i = 0; i < 50; i++) {
lst.add(i);
System.out.println(i);
getLen(lst);
}
}
public static void getLen(List lst) {
try {
//获取类对象
Class<? extends List> cla = lst.getClass();
//获取类中对应的属性
Field field = cla.getDeclaredField("elementData");
//设置访问权限
field.setAccessible(true);
//获取属性
Object[] object = (Object[]) field.get(lst);
//获取数组的长度
System.out.println("当前List集