Day22
集合:概念 ;使用(熟悉API);深入底层原理 ;项目中的应用 ;
1.集合含义
集合是Java API所提供的一系列类,可以用于动态存放多个对象 (集合只能存对象)
集合与数组的不同在于,集合是大小可变的序列,而且元素类型可以不受限定,只要是引用类型。(集合只能存储引用数据类型,不能放基本数据类型,但可以放基本数据类型的包装类)
集合类全部支持泛型,是一种数据安全的用法。
集合就是一组数据的容器,存放多个数据 --> 数组、集合
有些集合专门用于存放数据,有些集合专门用去排序,有些集合专门去重
集合:既要存储数据,也要管理数据(增删改查)
2.集合与数组的不同
数组:一旦初始化后长度不可变,元素类型受限定(String类型的数组只能装String的数据),数组可以存储基本数据类型
集合:长度可变的序列,元素类型不受限定(一个集合可以存储多个数据类型的元素),集合只能存储引用数据类型
3.Collection家族(存储单个数据)add() remove()
List接口
特点:有序且可重复(因为List接口中添加了许多针对下标操作的方法)
实现类:
- ArrayList (底层 --> 一维数组)
- LinkedList
- Vector
- Stack
Set接口
特点:无序且不可重复 (无序不代表随机)
实现类:
- HashSet
- LinkedHashSet
- TreeSet
4.Map家族(存储键值对 k-v)
注意:Map不能直接遍历,但是可以间接遍历
实现类:
- HashMap
- LinkedHashMap
- Hashtable
- ConcurrentHashMap
- TreeMap
- Properties
注意:Collection,Map都是接口
5.接触ArrayList
感受一个集合可以存储多个类型的数据!!!
经验:平时不会将多个数据类型的数据存入一个集合中,因为不好管理
public class Test01 {public static void main(String[] args) {ArrayList list = new ArrayList();list.add(100);//Integer.valueOf(100)list.add(123.123);//Double.valueOf(123.123)list.add("abc");}
}
6.ArrayList的使用
注意:
集合一旦定义了泛型,就规定了集合存储元素的类型
所以说泛型是一种数据安全的做法
public class Test02 {public static void main(String[] args) {//创建ArrayList集合的对象ArrayList<String> list = new ArrayList<>();//<String> --> 泛型//添加元素list.add("小彭");list.add("小光");list.add("小丽");list.add("小杨");list.add("小王");list.add("小李");list.add("小古");//设置指定下标上的元素list.set(1, "小张");//获取指定下标上的元素String str = list.get(1);System.out.println("获取指定下标上的元素:" + str);//小张//获取元素个数int size = list.size();System.out.println("获取元素个数:" + size);//7//将元素添加到指定下标的位置list.add(4, "小北");ArrayList<String> newList1 = new ArrayList<>();Collections.addAll(newList1, "aaa","bbb","ccc","ccc");//利用Collections工具类给集合做批量添加list.addAll(newList1);//将newList1中所有的元素添加到list集合的末尾ArrayList<String> newList2 = new ArrayList<>();Collections.addAll(newList2, "xxx","yyy","zzz","zzz");//利用Collections工具类给集合做批量添加list.addAll(4, newList2);//将newList2中所有的元素添加到list集合指定下标的位置//清空集合中所有的元素//list.clear();System.out.println("判断集合中是否包含指定元素:" + list.contains("小张"));//trueSystem.out.println("判断集合中是否包含子集合中所有的元素:" + list.containsAll(newList1));//trueSystem.out.println("获取集合中第一次出现该元素的下标:" + list.indexOf("ccc"));//13System.out.println("获取集合中最后一次出现该元素的下标:" + list.lastIndexOf("ccc"));//14System.out.println("判断集合中是否没有元素:" + list.isEmpty());//falselist.remove(0);//根据下标删除元素list.remove("小光");//根据元素删除元素list.removeAll(newList1);//删除list中包含newList1的元素(去除交集)list.retainAll(newList2);//保留list中包含newList2的元素(保留交集)List<String> subList = list.subList(1, 3);//截取开始下标(包含)到结束下标(排他)处的元素,返回新的List集合//将集合转成数组Object[] objs = subList.toArray();System.out.println(Arrays.toString(objs));//将集合转成数组String[] ss = new String[2];subList.toArray(ss);System.out.println(Arrays.toString(ss));System.out.println("--------------------------------");//遍历数据 -- for循环for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));}System.out.println("--------------------------------");//遍历数据 -- foreachfor (String element : list) {System.out.println(element);}System.out.println("--------------------------------");//遍历数据 -- IteratorIterator<String> it = list.iterator();while(it.hasNext()){//判断是否有可迭代的元素String element = it.next();//返回下一个元素System.out.println(element);}System.out.println("--------------------------------");//遍历数据 -- ListIteratorListIterator<String> listIterator = list.listIterator();while(listIterator.hasNext()){//判断是否有可迭代的元素(看后面有没有元素,有就继续)String element = listIterator.next();//返回下一个元素System.out.println(element);}}
}
7.泛型
含义:数据安全的做法
E - element - 元素
T - type - 类型
K - key - 键
V - value - 值
注意:泛型可以设置多个,使用逗号隔开
ps:public class HashMap<K,V>{}
泛型限定:规定了泛型类型的范围
?表示什么类型都可以
? extends A 表示元素必须是A类或A的子类
? super A 表示元素必须是A类或A的父类
public class A{}
public class B extends A{}
public class Test01 {public static void main(String[] args) {}//?表示任何类型public ArrayList<?> method01(){//ArrayList<Object> list = new ArrayList<>();//ArrayList<String> list = new ArrayList<>();//ArrayList<Integer> list = new ArrayList<>();//ArrayList<A> list = new ArrayList<>();ArrayList<B> list = new ArrayList<>();return list;}//? extends A 表示A类或其子类public ArrayList<? extends A> method02(){//ArrayList<A> list = new ArrayList<>();ArrayList<B> list = new ArrayList<>();return list;}//? super A 表示A类或其父类public ArrayList<? super A> method03(){//ArrayList<A> list = new ArrayList<>();ArrayList<Object> list = new ArrayList<>();return list;}
}
7.1 泛型在项目中的应用
需求:编写通用的管理系统的接口
分析:
学生管理系统 – 管理学生
淘宝后台管理系统 – 管理用户
OA管理系统 – 管理员工
public class Test01 {public static void main(String[] args) {//用户管理系统 -- 管理的是用户对象UserManagerSystem ums = new UserManagerSystem();ums.add(new User());System.out.println("----------------------");//图书管理系统 -- 管理的是书名BookManagerSystem<String> bms1 = new BookManagerSystem<>();bms1.add("Java从入门到精通");bms1.add("MySQL从删库到跑路");//图书管理系统 -- 管理的是图书类别BookManagerSystem<String> bms2 = new BookManagerSystem<>();bms2.add("小说类");bms2.add("科技类");bms2.add("历史类");}
}
用户管理:
//管理系统的接口
public interface ManagerSystem<T> {public int add(T t);public int delete(T t);public int update(T t,int type,Object val);public int getElementIndex(T t);public T getElement(T t); }
public class User {}
//用户管理系统
public class UserManagerSystem implements ManagerSystem<User>{@Overridepublic int add(User t) {// TODO Auto-generated method stubreturn 0;}@Overridepublic int delete(User t) {// TODO Auto-generated method stubreturn 0;}@Overridepublic int update(User t, int type, Object val) {// TODO Auto-generated method stubreturn 0;}@Overridepublic int getElementIndex(User t) {// TODO Auto-generated method stubreturn 0;}@Overridepublic User getElement(User t) {// TODO Auto-generated method stubreturn null;}}
图书管理:
public class Book {}
public class BookManagerSystem<T> implements ManagerSystem<T> {@Overridepublic int add(T t) {// TODO Auto-generated method stubreturn 0;}@Overridepublic int delete(T t) {// TODO Auto-generated method stubreturn 0;}@Overridepublic int update(T t, int type, Object val) {// TODO Auto-generated method stubreturn 0;}@Overridepublic int getElementIndex(T t) {// TODO Auto-generated method stubreturn 0;}@Overridepublic T getElement(T t) {// TODO Auto-generated method stubreturn null;}}
注意
1.Collection 与 Map的区别
Collection 存单个值,可以获取迭代器进行遍历
Map存两个值(Key-Value),不可以获取迭代器,不能遍历(Map可以间接遍历)
注意:Collection家族有迭代器,迭代器用于遍历集合;Map家族是没有迭代器,以为着Map家族不能遍历集合,但是可以间接遍历
2.理解Set为什么是无序
无序:存入顺序和取出顺序不一致,无序不等于随机
3.ArrayList 与 LinkedList的区别
使用上的区别:
LinkedList添加了
队列模式-先进先出(removeFirst())
栈模式-先进后出(removeLast())
效率上的区别:
ArrayList底层数据结构是一维数组
LinkedList底层数据结构是双向链表
添加 - 不扩容的情况:ArrayList快
添加 - 扩容的情况:LinkedList快
删除:LinkedList快
查询:ArrayList快
修改:ArrayList快
注意:工作中常用ArrayList,因为很多需求都需要使用查询功能,ArrayList查询更快
总结
集合
概念
Collection vs Map
List vs Set
ArrayList的使用泛型
泛型在项目中的应用