List 集合特点:
1.1:有序
List集合数据存进去的顺序和取出来的顺序一致
List lst=new ArrayList();
lst.add(2);
lst.add(1);
lst.add(5);
lst.add(8);
System.out.println(lst);
1.2:不唯一
List集合数据允许添加重复数据
List lst=new ArrayList();
lst.add(2);
lst.add(1);
lst.add(5);
lst.add(8);
lst.add(8);
System.out.println(lst);
2.1:遍历方式
2.1.1 for下标
List lst=new ArrayList();
lst.add("zs");
lst.add("ls");
lst.add("ww");
for (int i = 0; i < lst.size(); i++) {
System.out.println(lst.get(i));
}
2.1.2 foreach
List lst=new ArrayList();
lst.add("zs");
lst.add("ls");
lst.add("ww");
for (String str : lst) {
System.out.println(str);
}
2.1.3 迭代器
List lst=new ArrayList();
lst.add("zs");
lst.add("ls");
lst.add("ww");
Iterator iterator = lst.iterator();
while(iterator.hasNext())
System.out.println(iterator.next());
2.2 删除方式
2.2.1 for 正向删除
List list = new ArrayList();
list.add("txj");
list.add("wyy");
list.add("xy");
System.out.println("删除前的集合个数:" + list.size());
int size = list.size();
for (int i = 0 ;i<size;i++){
list.remove(0);
}
System.out.println("删除后的集合个数:" + list.size());
2.2.2 for逆向删除
List list = new ArrayList();
list.add("txj");
list.add("wyy");
list.add("xy");
list.add("txy");
list.add("tyy");
System.out.println("删除前的集合个数:" + list.size());
int size = list.size();
for (int i = size - 1; i >= 0; i--) {
list.remove(i);
}
System.out.println("删除后的集合个数:" + list.size());
2.2.3 迭代器删除
List集合删除推荐使用迭代器.
List list = new ArrayList();
list.add("txj");
list.add("wyy");
list.add("xy");
list.add("txy");
list.add("tyy");
System.out.println("删除前的集合个数:" + list.size());
Iterator it = list.iterator();
//判断下一个元素是否存在
while (it.hasNext()) {
it.next();
it.remove();
}
System.out.println("删除后的集合个数:" + list.size());
3.优化
概念:初始化大小10、负载因子1.5、向下取整
公式:容器大小\*1.5倍
例如:10\*1.5=15、15\*1.5=22、22\*1.5=33 ...(如有余数 :向下取整)
tedian:List集合优化目的在于利用合理的存储空间存下所有元素数据,不多不少,不造成空间浪费。
public static void main(String[] args) {
//list 集合优化
List list = new ArrayList<>(50);
for (int i = 0; i < 50; i++) {
list.add(i);
System.out.println(i);
getList(list);
}
}
private static void getList(List list) {
try {
//获取类对象
Class cls = list.getClass();
//获取类对象中的属性
Field field = cls.getDeclaredField("elementData");
//设置权限
field.setAccessible(true);
//获取属性的值
Object[] arr = (Object[]) field.get(list);
System.out.println("List集合的大小为:" + arr.length);
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
}
4. 迭代器的原理
迭代器中有两个重要的方法:
方法一:hasNext():用于判断迭代器中的下一个元素是否存在,不会移动下标
方法二:next():移动下标并取出当前元素
List lst = new ArrayList();
lst.add("ssl");
lst.add("txj");
lst.add("wyy");
//获取迭代器
ListIterator it = lst.listIterator();
//判断下一个元素是否存在
while(it.hasNext()){
//移动下标取出当前元素并输出
System.out.println(it.next());
}
5. 泛型
从 Java 1.5 开始提供了泛型。泛型可以在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高了代码的重用率。
> JDK1.5以上才有。
> 1)以类型为参数的类叫做泛型
> 2)泛型的默认类型为Object
> 3)作用:提高程序的健壮性、简化代码
案例:获取List集合中的偶数
List<Integer> lst = new ArrayList();
lst.add(1);
lst.add(3);
lst.add(4);
lst.add(8);
//获取迭代器
// Iterator it = lst.iterator();
ListIterator<Integer> it = lst.listIterator();
//循环便利
while (it.hasNext()) {
//移动下标取值
Integer val = it.next();
// Object next = it.next();
//类型转换
// Integer val = Integer.parseInt(next.toString());
//判断偶数
if (val % 2 == 0) {
System.out.println(val);
}
}
6.拆装箱
示例:送快递,寄快递时需要对物品进行包裹,收快递后就需要对包裹进行拆包。
6.1:装箱
> 装箱:值类型到引用类型
int a=10;
Integer b=new Integer(a);
6.2:拆箱
> 拆箱:引用类型到值类型
Integer c=new Integer(10);
int d=c.intValue();
7.ArrayList、LinkedList和Vector的区别
7.1.ArrayList和LinkedList的区别
相同点:
1. LinkedeList和ArrayList都实现了List接口。
2.ArrayList和LinkedList是两个集合类,用于存储一系列的对象引用(references)
不同点:
1.ArrayList底层实现是数组,而LinkedList是双向链表。
2.ArrayList查询快(下标)、增删改慢、LinkedList是查询慢,但是在插入删除时效率比较高。
7.2.ArrayList和Vector的区别
相同点
1.ArrayList和Vector都是用数组实现的
2.默认初始化大小都是10
不同点
1.Vector多线程是安全的,而ArrayList不是。Vector类中的方法很多有synchronized进行修饰,这样就导致了Vector在效率上无法与ArrayList相比;
2.两个都是采用的线性连续空间存储元素,但是当空间不足的时候,两个类的增加方式是不同的。(ArrayList每次存储时会检查空间大小,不够时会扩充为原来的1.5倍,Vector会扩充为原来空间的2倍)