💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] # 集合 ## 集合继承关系图 ![](https://box.kancloud.cn/f61c4bc4a47a0efb4a3a25d50dfdfb9d_1492x684.jpg) list叫链,set叫集 list允许存储重复的,set不允许存储重复的 ## 基本方法 ![](https://box.kancloud.cn/a026b93ddde30a4ea4ca19572eb80cd2_1428x558.jpg) 创建集合的方式 ~~~ 方式一: Collection<元素类型> 变量名=new ArrayList<元素类型>(); 方式二: Collection 变量名=new ArrayList(): ~~~ ## ArrayList和LinkedList的区别 1. ArrayList是实现了基于动态数组的数据结构,而LinkedList是基于链表的数据结构; 2. 对于随机访问get和set,ArrayList要优于LinkedList,因为LinkedList要移动指针; 3. 对于添加和删除操作add和remove,一般大家都会说LinkedList要比ArrayList快,因为ArrayList要移动数据。但是实际情况并非这样,对于添加或删除,LinkedList和ArrayList并不能明确说明谁快谁慢 ## 长度的3种表现形式 数组.length 属性 返回int 字符串.length() 方法,返回值int 集合.size() 方法,返回值int # 迭代器 集合中把这种取元素的方式描述在Iterator接口中 ## 常用方法 ![](https://box.kancloud.cn/b145500941f478e67f673398dba2d332_988x218.jpg) ~~~ //for循环迭代写法: for (Iterator<String> it2 = coll.iterator(); it2.hasNext(); ) { System.out.println(it2.next()); } //存储时提升了Object。取出时要使用元素的特有内容,必须向下转型。 Collection coll = new ArrayList(); coll.add("abc"); coll.add("aabbcc"); coll.add("shitcast"); Iterator it = coll.iterator(); while (it.hasNext()) { //由于元素被存放进集合后全部被提升为Object类型 //当需要使用子类对象特有方法时,需要向下转型 String str = (String) it.next(); System.out.println(str.length()); } ~~~ # 增强for循环 JDK1.5新特性,增强for循环 JDK1.5版本后,出现新的接口java.lang.Iterable Collection是继承Iterable Iterable作用,实现增强for循环 **弊端:没有索引,不能操作容器里面的元素** ## 格式 ~~~ for (数据类型 变量名 : 数组或集合) { } ~~~ ~~~ int[] arr={1,2,3,4,5}; for(int i : arr) { System.out.println(i); } ~~~ # 泛型 由于集合中什么类型的元素都可以存储,导致取出时候,如果出现强转就会引发运行时错误. 解决,使用集合必须明确集合中元素的类型,这种方式称之为泛型 ![](https://box.kancloud.cn/a2aa86acd7d1fa8112defc6b06c889df_494x370.jpg) ## 泛型的好处 泛型的好处 a:将运行时期的ClassCastException,转移到了编译时期变成了编译失败。 b:避免了类型强转的麻烦。 演示下列代码: ~~~ public class GenericDemo { public static void main(String[] args) { List list = new ArrayList(); list.add(“abc”); list.add(“itcast”); //list.add(5);//当集合明确类型后,存放类型不一致就会编译报错 //集合已经明确具体存放的元素类型,那么在使用迭代器的时候,迭代器也同样会知道具体遍历元素类型 Iterator<String> it = list.iterator(); while(it.hasNext()){ String str = it.next(); System.out.println(str.length()); //当使用Iterator<String> //控制元素类型后,就不需要强转了。获取到的元素直接就是String类型 } } } ~~~ ## 泛型的通配符 ~~~ / * 泛型的通配符 / public class GenericDemo { public static void main(String[] args) { ArrayList array = new ArrayList(); HashSet<Integer> set = new HashSet<Integer>(); array.add("123"); array.add("456"); set.add(789); set.add(890); iterator(array); iterator(set); } /* * 定义方法,可以同时迭代2个集合 * 参数: 怎么实现 , 不能写ArrayList,也不能写HashSet * 参数: 或者共同实现的接口 * 泛型的通配,匹配所有的数据类型 ? */ public static void iterator(Collection<?> coll){ Iterator<?> it = coll.iterator(); while(it.hasNext()){ //it.next()获取的对象,什么类型 System.out.println(it.next()); } } } ~~~ ## 泛型的限定 ~~~ / * 将的酒店员工,厨师,服务员,经理,分别存储到3个集合中 * 定义方法,可以同时遍历3集合,遍历三个集合的同时,可以调用工作方法 / import java.util.ArrayList; import java.util.Iterator; public class GenericTest { public static void main(String[] args) { //创建3个集合对象 ArrayList cs = new ArrayList(); ArrayList fwy = new ArrayList(); ArrayList jl = new ArrayList(); //每个集合存储自己的元素 cs.add(new ChuShi("张三", "后厨001")); cs.add(new ChuShi("李四", "后厨002")); fwy.add(new FuWuYuan("翠花", "服务部001")); fwy.add(new FuWuYuan("酸菜", "服务部002")); jl.add(new JingLi("小名", "董事会001", 123456789.32)); jl.add(new JingLi("小强", "董事会002", 123456789.33)); // ArrayList arrayString = new ArrayList(); iterator(jl); iterator(fwy); iterator(cs); } ~~~ ~~~ /* * 定义方法,可以同时遍历3集合,遍历三个集合的同时,可以调用工作方法 work * ? 通配符,迭代器it.next()方法取出来的是Object类型,怎么调用work方法 * 强制转换: it.next()=Object o ==> Employee * 方法参数: 控制,可以传递Employee对象,也可以传递Employee的子类的对象 * 泛型的限定 本案例,父类固定Employee,但是子类可以无限? * ? extends Employee 限制的是父类, 上限限定, 可以传递Employee,传递他的子类对象 * ? super Employee 限制的是子类, 下限限定, 可以传递Employee,传递他的父类对象 */ public static void iterator(ArrayList<? extends Employee> array){ Iterator<? extends Employee> it = array.iterator(); while(it.hasNext()){ //获取出的next() 数据类型,是什么Employee Employee e = it.next(); e.work(); } } } ~~~