百知教育 - 孙帅 - 14_集合框架
01_集合的概念
-
集合:
是一种工具类,是对象的容器,可以用于存储数量不等的多个对象的对象,代替数组 -
所有集合的接口和相关实现类都在java.util包中
-
底层结构:
数组 -
代码:
package day15; import java.util.Arrays; public class TestMyList{ public static void main(String[] args){ MyList list = new MyList(); list.add("ABC"); list.add("XYZ"); list.add("123"); list.add("AAA"); System.out.println(list.get(0)); for(int i = 0; i < list.size(); i++){ System.out.println(list.get(i)); } } } class MyList{ private Object[] os = new Object[10]; private int index; //记录数组中真正存储了几个元素 public void add(Object o){ if(index == os.length){ os = Arrays.copyOf(os, os.length*2); } os[index] = o; index++; } public void add(int pos, Object o){ //xxxxxxxx } public int size(){ return index; } public Object get(int i){ return os[i]; } }
-
运行结果:
02_Collection
-
概念:
Collection接口是List接口和Set接口的 父接口 -
特点:
元素是Object -
常用方法:
- add(Object) 把元素添加到集合中
- addAll(Collection c) 把c集合中的所有元素添加到集合中
- clear() 清空集合
- contains(Object o) 判断o元素在集合中是否存在
- remove(Object o) 从集合中删除元素o
- size() 返回集合的长度
- toArray() 将集合转化为数组
- isEmpty() 判断集合是否为空
-
List特点
- 元素按顺序存储(下标)
- 元素 可以重复
-
Set特点
- 元素无顺序
- 元素内容 不可重复
03_List常用方法
-
add(int pos, Object o) 将元素插入到指定位置
-
remove(int pos) 删除指定位置的元素
-
get(int pos) 获得指定位置的元素
-
indexOf(Object o) 获得o元素的首下标
-
lastIndexOf(Object o) 获得o元素的尾下标
-
set(int pos, Object o) 将o元素设置到pos位置,覆盖原有的元素
-
subList(int start, int end) 获得某段位置的子集合(包含start,不包含end)
-
代码:
package day15; import java.util.*; public class TestList{ public static void main(String[] args){ List list = new ArrayList(); list.add("YKY"); list.add("LYH"); list.add("HHH"); list.add("ZYK"); list.add("YXM"); list.add("WKY"); list.add("YKY"); System.out.println(list.size()); System.out.println(list.indexOf("YKY")); System.out.println(list.lastIndexOf("YKY")); list.remove(0); System.out.println(list.get(0)); } static Object[] findAllDogs(Object[] as){ List list = new ArrayList(); for(int i = 0; i < list.size(); i++){ if(as[i] instanceof Dog){ list.add(as[i]); } } return list.toArray(); } } class Animal{} class Dog extends Animal{} class Cat extends Animal{}
-
运行结果:
04_List的遍历
-
遍历
- 下标遍历
- 迭代器遍历
-
代码
package day15; import java.util.*; public class TestIterator{ public static void main(String[] args){ List list = new ArrayList(); list.add("YKY"); list.add("LYH"); list.add("HHH"); list.add("ZYK"); list.add("YXM"); list.add("WKY"); list.add("YKY"); print1(list); System.out.println(); print2(list); } static void print1(List list){ for(int i = 0; i < list.size(); i++){ Object o = list.get(i); String s = (String)o; if("ZYK".equals(s)){ list.remove(i); continue; } System.out.println(s.toUpperCase()); } } static void print2(Collection con){ Iterator it = con.iterator(); while(it.hasNext()){ String s = (String)it.next(); if("ZYK".equals(s)){ it.remove(); } System.out.println(s.toUpperCase()); } } }
-
运行结果:
05_在JDK5中的集合遍历
-
for-each遍历特点:
遍历时不能对原集合进行更改 -
for-each遍历代码:
static void print3(Collection con){ for(Object o : con){ String s = (String)o; System.out.println(s.toUpperCase()); } }
06_JDK8中的集合遍历
-
forEach()方法特点:
需要实现 java.util.function.Consumer接口 -
forEach()遍历代码:
package day15; import java.util.List; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.function.Consumer; public class TestConsumerAccept{ public static void main(String[] args){ List list = new ArrayList(); list.add("YKY"); list.add("LYH"); list.add("HHH"); list.add("ZYK"); list.add("YXM"); list.add("WKY"); list.add("YKY"); print4(list); System.out.println(); print5(list); } static void print4(Collection con){ con.forEach(new Consumer(){ public void accept(Object o){ String s = (String)o; System.out.println(s.toUpperCase()); } }); } /* from Collection public void forEach(Consumer c){ Iterator it = this.iterator(); while(it.hasNext()){ Object o = it.next(); c.accept(o); } } */ static void print5(Collection con){ con.forEach(System.out::println); } }
-
运行结果:
07_List的实现类
-
ArrayList特点:
数组实现、查询快、增删慢、线程不安全、并发效率高、JDK1.2推出 -
Vector特点:
数组实现、查询快、增删慢、线程安全、并发效率低、JDK1.0推出 -
LinkedList特点:
链表实现、查询慢、增删快 -
ArrayList代码:
package day15; import java.util.LinkedList; public class TestLinkedList{ public static void main(String[] args){ LinkedList list = new LinkedList(); list.add("YKY"); list.add("LYH"); list.add("HHH"); list.add("YXM"); list.add("ZYK"); list.addFirst("WKY"); list.removeLast(); for(Object o : list){ System.out.println(o); } } }
-
运行结果:
08_集合中的泛型 < E >
-
泛型技术来源:
JDK5 -
作用:
约束 集合 中 元素的类型 -
代码:
package day16; import java.util.ArrayList; import java.util.List; import java.util.Iterator; import java.util.function.Consumer; public class TestGenerics1{ public static void main(String[] args){ List<String> list = new ArrayList<String>(); list.add("YKY"); list.add("LYH"); list.add("HHH"); list.add("YXM"); list.add("ZYK"); for(int i = 0; i < list.size(); i++){ String s = list.get(i); System.out.println(s.toUpperCase()); } System.out.println(); Iterator<String> it = list.iterator(); while(it.hasNext()){ String s = it.next(); System.out.println(s.toUpperCase()); } System.out.println(); for(String s : list){ System.out.println(s.toUpperCase()); } System.out.println(); list.forEach(new Consumer<String>(){ public void accept(String s){ System.out.println(s.toUpperCase()); } }); System.out.println(); list.forEach(System.out::println); } }
-
运行结果:
09_泛型的多态
-
泛型的特点
- 只在编译时有泛型,运行时没泛型
- 泛型没有多态,赋值语句前后泛型必须保持一致
-
语法(JDK7):
List list = new ArrayList<>(); -
代码:
package day16; import java.util.List; import java.util.ArrayList; public class TestGenerics2{ public static void main(String[] args){ //List<Animal> list1 = new ArrayList<Animal>(); List<Animal> list1 = new ArrayList<>(); //List<Dog> list2 = new ArrayList<Dog>(); List<Dog> list2 = new ArrayList<>(); System.out.println(list1.getClass() == list2.getClass()); //list1.add(new Cat()); } } class Animal{} class Dog extends Animal{} class Cat extends Animal{}
-
运行结果:
10_泛型的通配符
-
方法参数的泛型定义:
通配符 <?> -
用法:
- <?> : 任何类型
- <? extends A> : A或A的任何子类(A可以是类也可以是接口)
- <? super A> : A或A的父类
-
代码(编译通过):
package day16; import java.util.ArrayList; import java.util.List; public class TestGenerics3{ public static void main(String[] args){ List<Object> l1 = new ArrayList<>(); List<String> l2 = new ArrayList<>(); //implements Comparable List<Number> l3 = new ArrayList<>(); List<Integer> l4 = new ArrayList<>(); //extends Number implements Comparable List<Double> l5 = new ArrayList<>(); //extends Number implements Comparable List<Comparable> l6 = new ArrayList<>(); print(l1); //print(l2); print(l3); //print(l4); //print(l5); //print(l6); } /*和下面的方法不能同时出现,只有泛型不同的两个方法不算重载,因为运行时没有泛型。 static void print(List<? extends Number> list){ for(int i = 0; i < list.size(); i++){ Number n = list.get(i); } } */ static void print(List<? super Number> list){ for(int i = 0; i < list.size(); i++){ Object o = list.get(i); } } }
11_泛型方法
-
< T >使用方法
- T可以替换为任何标识符,通常写一个大写字母
- 泛型定义在修饰符之后,返回值类型之前
- < T extends A >: T为A或A的子类
- < T extends A & B >: T为A或A的子类,同时实现B接口
- 其他用法:
- static <T, s> void m(T t, S s){}
- static <T, S extends T> void m2(T t, S s){}
-
代码1(编译通过):
package day16; import java.util.ArrayList; import java.util.List; public class TestGenerics4{ public static void main(String[] args){ List<Object> l1 = new ArrayList<>(); List<String> l2 = new ArrayList<>(); //implements Comparable List<Number> l3 = new ArrayList<>(); List<Integer> l4 = new ArrayList<>(); //extends Number implements Comparable List<Double> l5 = new ArrayList<>(); //extends Number implements Comparable List<Comparable> l6 = new ArrayList<>(); //copy(new Object[]{}, l1); //copy(new String[]{}, l2); //copy(new Number[]{}, l3); copy(new Integer[]{}, l4); copy(new Double[]{}, l5); //copy(new Comparable[]{}, l6); } static <T extends Number & Comparable> void copy(T[] os, List<T> list){ for(T o : os){ list.add(o); } } }
-
代码2:
package day16; import java.util.ArrayList; import java.util.List; public class TestGetAllDogs{ public static void main(String[] args){ } static Dog[] findAllDogs(Animal[] as){ List<Dog> result = new ArrayList<>(); for(Animal a : as){ if(a instanceof Dog){ Dog d = (Dog)a; result.add(d); } } //result --> Dog[] return result.toArray(new Dog[]{}); } }
12_泛型类
-
代码(编译通过):
package day16; public class TestGenerics5{ public static void main(String[] args){ MyClass<String> m1 = new MyClass<>(); MyClass<Integer> m2 = new MyClass<>(); } } class MyClass <T>{ public void method1(T t){} public T method2(){ return null; } } /* class MyArrayList <T>{ private T[] os; private int index; public void add(T t){ } public T get(int pos){ return os[pos]; } } MyArrayList<String> m1 = new MyArrayList<>(); m1.add("abc"); String s = m1.get(0); */ interface A{ void m(String s); } interface B{ void m(Integer i); } interface I<T>{ void m(T t); } interface N<T>{ T m(); } class c1 implements I<String>{ public void m(String s){} } class c2 implements I<Integer>{ public void m(Integer i){} } class c3 implements N<String>{ public String m(){ return "helloword"; } } class c4 implements N<Integer>{ public Integer m(){ return 0; } }