18.集合框架
1. Collection
1.1 泛型:
-
语义:广泛的类型
-
代码:任意的对象类型。
-
场景: 不用强制转换
-
指定泛型的范围
? extends java.util.Date: 包含java.util.Date或子类
? super java.util.Date : 包含java.util.Date或父类(接口)
T : type类型 E: element元素, K: key键, V: value值
package com.etc.lesson19;
import java.util.Date;
public class TestMain3 {
public static void main(String[] args) {
A<String> a1 = new A<>();
a1.setT("Hello Fanxing");
String str = a1.getT();
System.out.println(str);
// Object o = a1.getT();
// if (o instanceof String) {
// String str = (String) o;
// System.out.println(str);
// }
A<Date> a2 = new A<Date>();
a2.setT(new Date());
Date d2 = a2.getT();
System.out.println(d2);
// Object o1 = a2.getT();
// if (o1 instanceof Date) {
// Date str = (Date) o1;
// System.out.println(str);
// }
// a2.setT(100);
// Object o2 = a2.getT();
// if (o2 instanceof Integer) {
// int str3 = (int) o2;
// System.out.println(str3);
// }
A<java.lang.Cloneable> a3 = new A<>();
A.x(a3);
}
}
class A<T> {
private T t;
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
public static void x(A<? super Date> a) {
System.out.println(a);
}
}
1.2 集合方法:
集合不用定义大小,无顺序无下标。
数组有下标。
- boolean add(E e); 添加元素。 返回值是否添加成功
- clear(); 清空集合元素
- size(); 集合大小
- Object[] toArray(): 集合转换数组
- Arrays.asList(数组); 返回的是List
- Collections.addAll(c, new Integer[]{1, 3, 6, 7}); 返回Collection
集合的遍历方式:
Collection<Integer> c = new Stack<>();
Collections.addAll(c, new Integer[]{1, 3, 6, 7});
System.out.println(c.size());
System.out.println("-------增强for------------");
// 增强for可以迭代遍历
for (Integer item: c) {
System.out.println(item);
}
System.out.println("-------常规老式写法------------");
Iterator<Integer> it = c.iterator();
while (it.hasNext()) {
Integer item = it.next();
System.out.println(item);
if (item == 6)
it.remove();
}
System.out.println("-------jdk8 foreach------------");
// 正规的老式调用方式:
c.forEach(System.out::println);
c.forEach((item) -> {
System.out.println(item);
}
);
1.3 : Collection-List:线性列表: 序列
List: 有下标,有顺序。
- boolean add(index, E); 在下标处添加元素
- E get(index): 根据下标获取元素
- E romove(index); 根据下标删除元素
- E set(index, E);修改下标处元素
- sort(Comparator a) : 排序
package com.etc.lesson19;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class TestMain5 {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(9);
list.add(4);
list.set(2, 8);
list.add(2, 18);
list.remove(2);
for (int i = 0; i < list.size(); i++) {
int item = list.get(i);
System.out.println(item);
}
}
}
1.3.1 : ※ArrayList: 数组集合
底层封装数组:非线程安全。 数组默认0, add一次后10, 到临界值 自增50%。oldCapacity + (oldCapacity >> 1);
- ArrayList(): 无参数,封装数组是长度是0
- ArrayList(int initialCapacity); 参数是封装数组的默认长度
1.3.2: Vecoter: 封装的数组
底层封装数组: 线程安全。 默认10,每次增一倍或 指定增量((capacityIncrement > 0) ? capacityIncrement : oldCapacity
- new Vecoter(10, 20)
1.3.3: LinkedList: 双向链表:
底层是Node组成的双向链表: 每一个node有前一个的引用和后一个的引用。
LinkedList: 方法比较多可以实现自己的栈,队列
arraylist 查询快,修改慢
LinkedList 修改快,查询慢
vector: 线程安全, 比arryList慢
package com.etc.lesson19;
import java.util.LinkedList;
import java.util.List;
import java.util.Stack;
import org.apache.poi.util.SystemOutLogger;
public class TestMain5 {
public static void main(String[] args) {
List<Integer> list = new LinkedList<>(); // 0
list.add(1); // 10
list.add(9);
list.add(4);
list.add(4);
list.add(4);
list.add(4);
list.add(4);
list.add(4);
list.add(4);
list.add(4);
list.add(19);
list.set(2, 8);
list.add(2, 18);
list.remove(2);
for (int i = 0; i < list.size(); i++) {
int item = list.get(i);
System.out.println(item);
}
System.out.println("---------");
LinkedList<Integer> linkedlist = new LinkedList<>();
linkedlist.add(1);
linkedlist.add(2);
linkedlist.add(3);
linkedlist.add(4);
linkedlist.add(5);
linkedlist.add(6);
int a = linkedlist.pop();
System.out.println(a);
System.out.println("---------");
linkedlist.forEach(System.out::println);
System.out.println("---------");
int a1 = linkedlist.pollLast();
System.out.println(a1);
System.out.println("---------");
linkedlist.forEach(System.out::println);
}
}