目录

一. Collextion(单列集合接口)

1. Collection集合体系特点

2.Collection集合常用API

3.Collection集合的遍历方式

①方式一:迭代器

②方式二:foreach/增强for循环

③方式三:lambda表达式

4.Collection集合存储自定义类型的对象

5. 补充知识:集合工具类Collections

6.  总结

二.  List

1.  List集合特点、特有API、遍历方式

2.  ArrayList集合的底层原理

3. LinkedList集合特点、特有API

三. Set

1.  Set系列集系概述

2. HashSet元素无序的底层原理:哈希表

3. HashSet元素去重复的底层原理

4.实现类:LinkedHashSet

5. 实现类:TreeSet

四. 红黑树                                java.util.List

五. 集合的并发修改异常问题

六.  泛型深入

1. 自定义泛型类

2.  自定义泛型方法

3.   自定义泛型接口

4. 泛型通配符、上下限


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

一. Collextion(单列集合接口)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. Collection集合体系特点

2.Collection集合常用API

  代码演示:

public class Test {public static void main(String[] args) {Collection<String> col = new ArrayList<>();//1. 添加元素col.add("库里");col.add("汤普森");col.add("格林");col.add("库里");col.add("汤普森");col.add("格林");System.out.println(col);//2. 清空所有元素col.clear();System.out.println(col);// 3. 删除某个元素: 如果有多个重复元素默认删除前面的第一个!col.remove("库里");System.out.println(col);//4. 判断集合是否为空boolean rs = col.isEmpty();System.out.println(rs);//5. 判断集合是否包含指定内容boolean result = col.contains("格林");System.out.println(result);//6. 计算集合元素大小int num = col.size();System.out.println(num);//7.  集合转数组//注意Object 和 Objects 的区别  Objects会报错Object[] arrs = col.toArray();System.out.println(Arrays.toString(arrs));// 8. addAll 全部添加Collection<String> c1 = new ArrayList<>();c1.add("java1");c1.add("java2");Collection<String> c2 = new ArrayList<>();c2.add("赵敏");c2.add("殷素素");// addAll把c2集合的元素全部拷贝到c1中去。c1.addAll(c2);System.out.println(c1);System.out.println(c2);}

3.Collection集合的遍历方式

①方式一:迭代器

  

  代码演示:

public static void main(String[] args) {Collection<String> lists = new ArrayList<>();lists.add("赵敏");lists.add("小昭");lists.add("素素");lists.add("灭绝");System.out.println(lists);// 1、得到当前集合的迭代器对象。Iterator<String> it = lists.iterator();// 2、定义while循环while (it.hasNext()){String ele = it.next();System.out.println(ele);}}

②方式二:foreach/增强for循环

代码演示: 

public static void main(String[] args) {Collection<String> col = new ArrayList<>();col.add("赵敏");col.add("小昭");//快捷键:col.for  回车for (String ck : col) {System.out.println(ck);}double[] arrs = {1.2, 3.6, 4.5, 9.9, 12.2};for (double arr : arrs) {//修改无意义,不会影响数组的元素值,每次都只是拷贝一份到第三方变量//score = 100.0;System.out.println(arr);}}

③方式三:lambda表达式

4.Collection集合存储自定义类型的对象

        案例:某影院系统需要在后台存储上述三部电影,然后依次展示出来。

5. 补充知识:集合工具类Collections

代码演示:

//Collections 的 addAll 和shuffle sort①public class CollectionsDemo01 {public static void main(String[] args) {List<String> names = new ArrayList<>();Collections.addAll(names, "楚留香","胡铁花", "张无忌","陆小凤");System.out.println(names);// 2、public static void shuffle(List<?> list) :打乱集合顺序。Collections.shuffle(names);System.out.println(names);// 3、 public static <T> void sort(List<T> list):将集合中元素按照默认规则排序。 (排值特性的元素)List<Integer> list = new ArrayList<>();Collections.addAll(list, 12, 23, 2, 4);System.out.println(list);Collections.sort(list);System.out.println(list);}
}
---------------------------------------------------------------------
sort②//苹果类
public class Apple {private String name;private String color;private double price;private int weight;
}//测试类
public class CollectionsDemo02 {public static void main(String[] args) {List<Apple> apples = new ArrayList<>(); // 可以重复!apples.add(new Apple("红富士", "红色", 9.9, 500));apples.add(new Apple("青苹果", "绿色", 15.9, 300));apples.add(new Apple("绿苹果", "青色", 29.9, 400));apples.add(new Apple("黄苹果", "黄色", 9.8, 500));// 方法一:可以的,Apple类已经重写了比较规则Collections.sort(apples);System.out.println(apples);// 方式二:sort方法自带比较器对象Collections.sort(apples, ( o1,  o2) ->  Double.compare(o1.getPrice() , o2.getPrice()) );System.out.println(apples);}
}

6.  总结

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

二.  List

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1.  List集合特点、特有API、遍历方式

 代码演示:

public static void main(String[] args) {List<String> list=new ArrayList<>();list.add("库里");list.add("库里");list.add("汤普森");list.add("格林");System.out.println(list);// 1.在某个索引位置插入元素。list.add(1,"麦科勒姆");System.out.println(list);// 2.根据索引删除元素,返回被删除元素list.remove(3);System.out.println(list);// 3.修改索引位置处的元素: public E set(int index, E element)list.set(0,"库里FMVP");System.out.println(list);// 4.根据索引获取元素:public E get(int index):返回集合中指定位置的元素。String s = list.get(1);System.out.println(s);}

List集合的遍历方式有几种?

①迭代器         ②增强for循环         ③Lambda表达式        ④for循环(因为List集合存在索引)

2.  ArrayList集合的底层原理

3. LinkedList集合特点、特有API

 代码演示:

        public static void main(String[] args) {// LinkedList可以完成队列结构,和栈结构 (双链表)// 1、做一个队列:LinkedList<String> queue = new LinkedList<>();// 入队queue.addLast("1号");queue.addLast("2号");queue.addLast("3号");System.out.println(queue);// 出队// System.out.println(queue.getFirst());System.out.println(queue.removeFirst());System.out.println(queue.removeFirst());System.out.println(queue);// 2、做一个栈LinkedList<String> stack = new LinkedList<>();// 入栈 压栈 push和addFirst一样stack.push("第1颗子弹");stack.push("第2颗子弹");stack.push("第3颗子弹");System.out.println(stack);// 出栈  弹栈 pop和removeFirst一样stack.removeFirst();stack.pop();}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

三. Set

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1.  Set系列集系概述

2. HashSet元素无序的底层原理:哈希表

3. HashSet元素去重复的底层原理

4.实现类:LinkedHashSet

5. 实现类:TreeSet

 两种方式举例:

//方式一 实现Comparable接口,重写compare方法
public class Apple implements Comparable<Apple>{//这里实现 Comparable是关键        ****private String name;private String color;private double price;private int weight;@Overridepublic String toString() {return "Apple{" +"name='" + name + '\'' +", color='" + color + '\'' +", price=" + price +", weight=" + weight +'}';}@Overridepublic int compareTo(Apple o) {// 去重重量重复的元素return this.weight - o.weight ;// 保留重量重复的元素// return this.weight - o.weight >= 0 ? 1 : -1;}
}//测试类
public static void main(String[] args) {Set<Apple> apples = new TreeSet<Apple>();apples.add(new Apple("红富士", "红色", 9.9, 500));apples.add(new Apple("青苹果", "绿色", 15.9, 300));apples.add(new Apple("绿苹果", "青色", 29.9, 400));apples.add(new Apple("黄苹果", "黄色", 9.8, 500));System.out.println(apples);}//方式二  设置Comparator接口对应的比较器对象,来定制比较规则。TreeSet<student> students=new TreeSet<>(new Comparator<student>() {@Overridepublic int compare(student o1, student o2) {return o1.getAge()-o2.getAge();}});TreeSet<student>  students1=new TreeSet<>((o1, o2) -> o1.getAge()-o2.getAge());

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

四. 红黑树                                java.util.List

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

五. 集合的并发修改异常问题

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

代码演示:

public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("黑马");list.add("Java");list.add("Java");list.add("赵敏");// 需求:删除全部的Java信息。// a、迭代器遍历删除Iterator<String> it = list.iterator();while (it.hasNext()){String ele = it.next();if("Java".equals(ele)){// list.remove(ele); // 集合删除会出毛病it.remove(); // 迭代器删除所在位置的元素,可保证不后裔}}System.out.println(list);// b、foreach遍历删除 (会出现问题,这种无法解决的,foreach不能边遍历边删除,会出bug)for (String s : list) {if("Java".equals(s)){list.remove(s);}}// c、lambda表达式(会出现问题,这种无法解决的,Lambda遍历不能边遍历边删除,会出bug)list.forEach(s -> {if("Java".equals(s)){list.remove(s);}});// d、for循环(边遍历边删除集合没毛病,但是必须从后面开始遍历删除或者每次删除后i--)for (int i = list.size() - 1; i >= 0 ; i--) {String ele = list.get(i);if("Java".equals(ele)){list.remove(ele);}}} 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

六.  泛型深入

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. 自定义泛型类

 案例:

               要求:模拟ArrayList集合自定义一个集合MyArrayList集合,完成添加和删除功能的泛型设计                        

//定义泛型类
public class MyArrayList<E> {//内部new一个ArrayListprivate ArrayList<E> list=new ArrayList<>();public  void  add(E e){list.add(e);}public  void  remove(E e){list.remove(e);}//重写toString方法@Overridepublic String toString() {return list.toString();}
}//测试类
public class Test {public static void main(String[] args) {MyArrayList<String> list = new MyArrayList<String>();list.add("黑马");list.add("Java");System.out.println(list);}
}

2.  自定义泛型方法

案例:

        给你任何一个类型的数组,都能返回它的内容。也就是实现Arrays.toString(数组)的功能!

public class GenericDemo {public static void main(String[] args) {String[] names = {"小璐", "蓉容", "小何"};printArray(names);Integer[] ages = {10, 20, 30};printArray(ages);Integer[] ages2 = getArr(ages);String[]  names2 = getArr(names);}//可以定义返回值为数组的方法 public static <T> T[] getArr(T[] arr){return arr;}public static <T> void printArray(T[] arr){if(arr != null){StringBuilder sb = new StringBuilder("[");for (int i = 0; i < arr.length; i++) {sb.append(arr[i]).append(i == arr.length - 1 ? "" : ", ");}sb.append("]");System.out.println(sb);}else {System.out.println(arr);}}
}

3.   自定义泛型接口

案例:

                教务系统,提供一个接口可约束一定要完成数据(学生,老师)的增删改查操作

//学生类
public class student {}//接口
public interface date<E>{void add(E e);void delete(E e);
}//实现类: 注意 类名< >
public class studentDate implements date<student>{@Overridepublic void add(student s) {   }@Overridepublic void delete(student s) {    }
}//测试类
public class Test {public static void main(String[] args) {student s=new student();studentDate st=new studentDate();st.add(s);}
}

4. 泛型通配符、上下限

案例:

               开发一个极品飞车的游戏,所有的汽车都能一起参与比赛

public class GenericDemo {public static void main(String[] args) {//虽然BMW和BENZ都继承了Car//但是ArrayList<BMW>和ArrayList<BENZ>与ArrayList<Car>没有关系的!!//宝马车集合ArrayList<BMW> bmws = new ArrayList<>();bmws.add(new BMW());bmws.add(new BMW());go(bmws);//奔驰车集合ArrayList<BENZ> benzs = new ArrayList<>();benzs.add(new BENZ());benzs.add(new BENZ());go(benzs);//狗集合ArrayList<Dog> dogs = new ArrayList<>();dogs.add(new Dog());dogs.add(new Dog());// go(dogs);}//所有车比赛方法public static void go(ArrayList<? extends Car> cars){}
}class Dog{}class BENZ extends Car{
}class BMW extends Car{
}// 父类
class Car{
}

Day15-集合(Collection、红黑树 (ListSet )并发修改异常,泛型深入)相关推荐

  1. Java并发修改异常的源码解析

    1. 什么时候会产生并发修改异常 并发的意思是同时发生,那么其实并发修改的字面意思就是同时修改,通过查看JDK的API我们可以得知,并发修改异常的出现的原因是:当方法检测到对象的并发修改,但不允许这种 ...

  2. Java中遍历集合的并发修改异常解决方案

    遍历集合的删除元素的问题 问题引出: 当我们遍历集合从中找出某一批元素并删除的时候, 可能出现一种并发修改异常问题. 哪些变量会存在这个问题? 迭代器遍历集合且直接用集合删除元素的时候可能出现, 例如 ...

  3. 第三次学JAVA再学不好就吃翔(part79)--并发修改异常产生的原因及解决方案

    学习笔记,仅供参考,有错必纠 文章目录 集合 并发修改异常产生的原因及解决方案 ConcurrentModificationException 解决方案 集合 并发修改异常产生的原因及解决方案 在这个 ...

  4. php 迭代器迭代中文时重复,3种方式解决iterator迭代器并发修改异常

    3种方式解决iterator迭代器并发修改异常ConcurrentModificationException 在使用迭代器的时候,时长会遇到 ConcurrentModificationExcepti ...

  5. java迭代器删除元素出异常_java迭代器移除元素出现并发修改异常的原因及解决...

    迭代器(Iterator的对象)主要用于遍历集合,体现的就是迭代器模式. Iterator接口定义了以下四种方法. boolean hasNext():如果集合还没遍历完就返回true. Object ...

  6. 理解和解决Java并发修改异常ConcurrentModificationException(转载)

    原文地址:https://www.jianshu.com/p/f3f6b12330c1 理解和解决Java并发修改异常ConcurrentModificationException 不知读者在Java ...

  7. java 并发修改_理解和解决Java并发修改异常ConcurrentModificationException

    your name.jpg 关键字: Java Exception 不知读者在Java开发的过程中有没有遇到类似的异常信息 Exception in thread "main" j ...

  8. java迭代器 异常_java-迭代器并发修改异常

    A:迭代器的并发修改异常 /* * 迭代器的并发修改异常 java.util.ConcurrentModificationException * 就是在遍历的过程中,使用了集合方法修改了集合的长度,不 ...

  9. ConcurrentModificationException 并发修改异常剖析及解决方案

    最近在回头打基础学习Java SE,研究List集合的过程中,遇到了ConcurrentModificationException 并发修改异常.在此记录下遇到问题的原因解析和解决方案.错误千奇百怪, ...

最新文章

  1. getline简单例子
  2. html实战例子: 课程表
  3. cordova项目打包并更新腾讯开放平台安装包、加固重新签名步骤
  4. 腾讯重磅发布全栈机器学习平台Angel 3.0
  5. Python实现RabbitMQ中6种消息模型(转)
  6. 全网最全的IDEA热部署方案,看完弄懂,再也不用加班了~
  7. R语言ETL系列:过滤(filter)
  8. c++ primer plus 之c++数据类型
  9. vue项目中报常见错误
  10. 【数据库】浅析Innodb的聚集索引与非聚集索引
  11. 【ERROR】Error: Error trying to upgrade business network. Error: No valid responses from any peers.
  12. 初识机器学习与深度学习
  13. 重磅 I IT4IT 2.1中文版正式发布特邀专家彭斐推荐
  14. wordcloud:利用fontawesome字体绘制图标词云图
  15. 关于在使用ztree中同级排序的疑问
  16. 手动挡你会开吗 八招教你开好手动挡车型
  17. 如何使用python下载网站上的视频
  18. 搞笑的英语翻译,数据集整理
  19. 技术分享 | Redis 集群架构解析
  20. 【论文翻译_无数据知识蒸馏_元学习_2022】Up to 100× Faster Data-free Knowledge Distillation

热门文章

  1. stm32微秒延时实现
  2. 根据返回的某一个字段值,去匹配数组对象的某一项, 返回对应的字段值
  3. C++实现当类型为1,输入英尺和英寸,转换为米和厘米;当类型为2,输入米和厘米,转换为英尺和英寸
  4. 1060 爱丁顿数 (C++)
  5. 1060 爱丁顿数 (25 分)
  6. html5调用本地控件exe,网页上如何判断本地是否安装某个应用程序(js实现)
  7. 2B SaaS:得大客户者得天下
  8. 面向对象,类名称空间,查找顺序,组合
  9. “0x00446d22”指令引用的“0xcccd40d5”内存。该内存不能为read。
  10. 苹果android是什么,如果用苹果最新的芯片运行安卓系统会是什么情况?