• Java之Collention集合


    1、集合的代表是?
    ●Collection接口 。
    2、Collection集合分 了哪2大常用的集合体系?
    ●List系列集合: 添加的元素是有序、可重复、有索引。
    ●Set系列集合:添加的元素是无序、不重复、无索引。
    3、如何约定集合存储数据的类型,需要注意什么?
    ●集合支持泛型
    ●集合和泛型不支持基本类型,只支持引用数据类型。

    ●集合不支持使用索引查找数据

    1. public class ColectionDemo {
    2. public static void main(String[] args) {
    3. //有序可重复有索引
    4. Collection list = new ArrayList();
    5. list.add("Java");
    6. list.add("Java");
    7. list.add("Mybatis");
    8. list.add(23);
    9. list.add(23);
    10. list.add(false);
    11. list.add(false);
    12. System.out.println(list);
    13. //无序不重复 无索引
    14. Collection list1 = new HashSet() ;
    15. list1.add("Java");
    16. list1.add("Java");
    17. list1.add("Mybatis");
    18. list1.add(23);
    19. list1.add(23);
    20. list1.add(false);
    21. list1.add(false);
    22. System.out.println(list1);
    23. //有序不重复 无索引
    24. Collection list2 = new TreeSet() ;
    25. list2.add("Java1");
    26. list2.add("Java");
    27. list2.add("Java");
    28. list2.add("Mybatis");
    29. list2.add("1");
    30. System.out.println(list2);
    31. //支持泛型
    32. Collection list3 = new ArrayList<>() ;
    33. list3.add("Java1");
    34. list3.add("Java");
    35. list3.add("Java");
    36. // list3.add(1);
    37. System.out.println(list2);
    38. }
    39. }

     Collection常用API

    1. public class ColectionDemo {
    2. public static void main(String[] args) {
    3. Collection list = new ArrayList();
    4. list.add("Java");
    5. list.add("Java");
    6. list.add("Java");
    7. System.out.println(list);
    8. // list.clear();
    9. System.out.println(list);
    10. System.out.println("删除成功返回true,默认删除第一个"+list.remove("Java"));
    11. System.out.println(list);
    12. System.out.println(list.isEmpty());
    13. System.out.println(list.size());
    14. System.out.println(list.toArray());
    15. }
    16. }

    Collection迭代器

    1. public class ColectionDemo {
    2. public static void main(String[] args) {
    3. Collection c = new ArrayList<>();
    4. c.add("Java1");
    5. c.add("Java3");
    6. c.add("Java3");
    7. Iterator i = c.iterator(); //创建一个迭代器对象,泛类型与数组保持一致,默认起始位置为0
    8. // System.out.println("判断是否还有元素"+i.hasNext());
    9. // System.out.println("取出第一个数"+i.next());
    10. // System.out.println("取出第二个数"+i.next());
    11. // System.out.println("取出第三个数"+i.next());
    12. // System.out.println("数量不足,会越越界报错"+i.next());
    13. while (i.hasNext()){
    14. System.out.println(i.next());
    15. }
    16. }
    17. }
    Colection之foreach
    1. 1、增强for可以遍历哪些容器? ●既可以遍历集合也可以遍历数组。
    2. 2、增强for的关键是记住它的遍历格式
    3. for(元素数据类型 变量名:数组或者Collection集合) {
    4. //在此处使用变量即可,该变量就是元素
    5. }
    6. public class ColectionDemo {
    7. public static void main(String[] args) {
    8. Collection c = new ArrayList<>();
    9. c.add("Java1");
    10. c.add("Java3");
    11. c.add("Java3");
    12. for (String s : c) {
    13. System.out.println("s是变量名" + s);
    14. }
    15. double[] d = {1.1,2.1,3.1};
    16. for (double v : d) {
    17. System.out.println("v是变量名" + v);
    18. }
    19. }
    20. }
    21. public class ColectionDemo {
    22. public static void main(String[] args) {
    23. Collection c = new ArrayList<>();
    24. c.add("Java1");
    25. c.add("Java3");
    26. c.add("Java3");
    27. // forEach几种方法
    28. c.forEach(new Consumer() {
    29. @Override
    30. public void accept(String s) {
    31. System.out.println(s);
    32. }
    33. });
    34. c.forEach((String s)->System.out.println(s));
    35. c.forEach(s->System.out.println(s));
    36. c.forEach(System.out::println);//最终简写,实际效果一样
    37. }
    38. }

    List,包含ArrayList,LinkedList实现类

    1. public class ColectionDemo {
    2. public static void main(String[] args) {
    3. List list = new ArrayList<>();
    4. list.add("Java");
    5. list.add("Java");
    6. list.add("MySQL");
    7. list.add("MySQL");
    8. // 2.在某个索引位置插入元素。
    9. list.add( 2,"HTML");
    10. System.out.println(list);
    11. // 3.根据索引删除元素,返回被删除元素
    12. System.out.println(list.remove(2));
    13. System.out.println(list);
    14. // 4. 根据索引获取元素:public E get(int index): 返回集合中指定位置的元素。
    15. System.out.println(list.get(2));
    16. // 5.修改索引位置处的元素: public E set(int index, E element)
    17. //返回修改前的数据
    18. System.out.println(list.set(1,"高斯林"));
    19. System.out.println(list);
    20. }
    21. }
    22. public class ColectionDemo {
    23. public static void main(String[] args) {
    24. //栈,先进后出
    25. LinkedList stack = new LinkedList<>();
    26. stack.addFirst("第一颗子弹");
    27. stack.addFirst("第二颗子弹");
    28. stack.addFirst("第三颗子弹");
    29. stack.addFirst("第四颗子弹");
    30. System.out.println(stack.removeFirst());
    31. System.out.println(stack.removeFirst());
    32. System.out.println(stack.removeFirst());
    33. System.out.println(stack);
    34. //队列,先进先出
    35. LinkedList queue = new LinkedList<>();
    36. queue.addLast("1号");
    37. queue.addLast("2号");
    38. queue.addLast("3号");
    39. queue.addLast("4号");
    40. System.out.println(queue.removeFirst());
    41. System.out.println(queue.removeFirst());
    42. System.out.println(queue);
    43. }
    44. }

    自定义泛型 

    1. 泛型类
    2. 作用:强制类下的方法只能使用同一种引用类型
    3. public class FanXing {
    4. public void add(E e){
    5. }
    6. public void remove(E e){
    7. }
    8. }
    9. public class Test {
    10. public static void main(String[] args) {
    11. FanXing f = new FanXing<>();
    12. f.add("a");
    13. f.remove("a");
    14. }
    15. }
    16. ======================================================================
    17. 泛型方法
    18. 作用:方法可以接收任意类型的数据,使得更加有通用型
    19. public class Test {
    20. public static void main(String[] args) {
    21. Integer[] i = {1,2,3,4,5};
    22. prinaArray(i);
    23. }
    24. /*
    25. 定义一个可以传任意类型的数组
    26. */
    27. public static void prinaArray(T[] arry) {
    28. if(arry != null){
    29. StringBuilder h = new StringBuilder("[");
    30. for (int i = 0; i < arry.length; i++) {
    31. h.append(i == arry.length -1 ? arry[i]: arry[i] + ",");
    32. }
    33. h.append("]");
    34. System.out.println(h);
    35. }else {
    36. System.out.println(Arrays.toString(arry));
    37. }
    38. }
    39. }
    40. ==================================================
    41. 泛型接口
    42. 作用:泛型接口可以让实现类选择当前功能需要操作的数据类型
    43. //定义一个泛型接口
    44. public interface FangXing {
    45. void add(E e);
    46. void delete(int id);
    47. void update(E e);
    48. E queryId(int id);
    49. }
    50. //定义一个类型只可以接受Teacher
    51. public class TeacherData implements FangXing{
    52. @Override
    53. public void add(Teacher teacher) {
    54. System.out.println("加了一个老师信息");
    55. }
    56. @Override
    57. public void delete(int id) {
    58. }
    59. @Override
    60. public void update(Teacher teacher) {
    61. }
    62. @Override
    63. public Teacher queryId(int id) {
    64. return null;
    65. }
    66. }
    67. //定义一个Teacher类
    68. public class Teacher{
    69. }
    70. //使用
    71. public class Test {
    72. public static void main(String[] args) {
    73. Teacher t = new Teacher();
    74. TeacherData TD = new TeacherData();
    75. TD.add(t);
    76. }
    77. }

    使用泛型

    1. 泛型的上下限:
    2. extends Car> >>?必须是Car或者其子类泛型:上限(常用)
    3. super Car> >>?必须是Car或者其父类泛型:下限
    4. import java.util.ArrayList;
    5. public class UseFangXing {
    6. public static void main(String[] args) {
    7. ArrayList ben = new ArrayList<>();
    8. ArrayList bao = new ArrayList<>();
    9. ArrayList dog = new ArrayList<>();
    10. ben.add(new Benchi());
    11. bao.add(new Baoma());
    12. dog.add(new Dog());
    13. go(ben);
    14. go(bao);
    15. // go(dog); 无法添加
    16. }
    17. public static void go(ArrayList allCar){
    18. System.out.println("所有车都可以参加" + allCar.toString());
    19. }
    20. }
    21. class Benchi extends Car{
    22. private String name = "奔驰";
    23. @Override
    24. public String toString() {
    25. return "Benchi{" +
    26. "name='" + name + '\'' +
    27. '}';
    28. }
    29. }
    30. class Baoma extends Car{
    31. private String name = "宝马";
    32. @Override
    33. public String toString() {
    34. return "Baoma{" +
    35. "name='" + name + '\'' +
    36. '}';
    37. }
    38. }
    39. class Dog{
    40. private String name = "狗";
    41. @Override
    42. public String toString() {
    43. return "Dog{" +
    44. "name='" + name + '\'' +
    45. '}';
    46. }
    47. }
    48. class Car {}

     Set系列集合特点
    ●无序:存取顺序不-致
    ●不重复:可以去除重复
    ●无索引: 没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取元素。
     

    Set集合实现类特点
    ●HashSet: 无序、不重复、无索引。
    ●LinkedHashSet: 有序、不重复、无索引。
    ●TreeSet: 排序、不重复、无索引。
     

    基本使用

    1. public class Test {
    2. public static void main(String[] args) {
    3. // 无序
    4. Set sets = new HashSet<>();
    5. sets.add("html");
    6. sets.add("java");
    7. sets.add("java");
    8. sets.add("Mysql");
    9. System.out.println(sets);
    10. // 有序
    11. Set sets1 = new LinkedHashSet<>();
    12. sets1.add("html");
    13. sets1.add("java");
    14. sets1.add("java");
    15. sets1.add("Mysql");
    16. System.out.println(sets1);
    17. // 排序
    18. Set sets2 = new TreeSet<>();
    19. sets2.add("html");
    20. sets2.add("java");
    21. sets2.add("java");
    22. sets2.add("Mysql");
    23. System.out.println(sets2);
    24. System.out.println(sets.hashCode());// object提供了hashCode,代表每个对象都有一个hash值,且同一个对象值是保持不变的
    25. }
    26. }

     hsahcode重写

    1. public class Test {
    2. public static void main(String[] args) {
    3. //底层原理是hash+数组+链表+红黑树,先计算对象的hash值后取mod,然后得到的索引插入数组,
    4. //如果为null直接插入,不为null再用equals去判断数据有没有重复,有重复就不插入,不重复就
    5. //放入该数据,原先数据根据链表方式接入到新的数据,
    6. //因此自定义的类使用set集合,需要重写hashcode方法,只要类的值一样,
    7. //hash值就一样,则不重复添加到集合里面
    8. Set sets = new HashSet<>();
    9. sets.add(new Student("小红",19,"男"));
    10. sets.add(new Student("小红",19,"男"));
    11. sets.add(new Student("小A",19,"男"));
    12. System.out.println(sets);
    13. }
    14. }
    15. class Student {
    16. private String name;
    17. private Integer age;
    18. private String sex;
    19. public Student() {
    20. }
    21. public Student(String name, Integer age, String sex) {
    22. this.name = name;
    23. this.age = age;
    24. this.sex = sex;
    25. }
    26. @Override
    27. public boolean equals(Object o) {
    28. if (this == o) return true;
    29. if (o == null || getClass() != o.getClass()) return false;
    30. Student student = (Student) o;
    31. return Objects.equals(name, student.name) && Objects.equals(age, student.age) && Objects.equals(sex, student.sex);
    32. }
    33. @Override
    34. public int hashCode() {
    35. return Objects.hash(name, age, sex);
    36. }
    37. public String getName() {
    38. return name;
    39. }
    40. public void setName(String name) {
    41. this.name = name;
    42. }
    43. public Integer getAge() {
    44. return age;
    45. }
    46. public void setAge(Integer age) {
    47. this.age = age;
    48. }
    49. public String getSex() {
    50. return sex;
    51. }
    52. public void setSex(String sex) {
    53. this.sex = sex;
    54. }
    55. @Override
    56. public String toString() {
    57. return "Student{" +
    58. "name='" + name + '\'' +
    59. ", age=" + age +
    60. ", sex='" + sex + '\'' +
    61. '}';
    62. }
    63. }

    Treeset自定义排序规则

    1. package com.ruqi.xiushifu.demoset;
    2. import java.util.*;
    3. public class Test {
    4. public static void main(String[] args) {
    5. //自定义类的排序规则,使用set自带的Comparator方法,也可以在Student类中自定义
    6. // Set Students = new TreeSet<>(new Comparator() {
    7. // @Override
    8. // public int compare(Student o1, Student o2) {
    9. return o1.getAge() - o2.getAge(); //表示按年龄升序,如果相等去重
    10. // return o1.getAge() - o2.getAge() >= 0 ? 1 : -1 ; //表示按年龄升序,不去重
    11. // }
    12. // });
    13. Set Students = new TreeSet<>((o1, o2) -> o1.getAge() - o2.getAge() >= 0 ? 1 : -1); //简写
    14. Students.add(new Student("小A",11,"男",12.11));
    15. Students.add(new Student("小B",11,"男",12.01));
    16. Students.add(new Student("小C",12,"男",12.71));
    17. Students.add(new Student("小D",14,"男",12.01));
    18. System.out.println(Students);
    19. }
    20. }
    21. class Student implements Comparable{
    22. private String name;
    23. private Integer age;
    24. private String sex;
    25. private double height;
    26. public Student() {
    27. }
    28. public Student(String name, Integer age, String sex , double height) {
    29. this.name = name;
    30. this.age = age;
    31. this.sex = sex;
    32. this.height = height;
    33. }
    34. public double getHeight() {
    35. return height;
    36. }
    37. public void setHeight(double height) {
    38. this.height = height;
    39. }
    40. public String getName() {
    41. return name;
    42. }
    43. public void setName(String name) {
    44. this.name = name;
    45. }
    46. public Integer getAge() {
    47. return age;
    48. }
    49. public void setAge(Integer age) {
    50. this.age = age;
    51. }
    52. public String getSex() {
    53. return sex;
    54. }
    55. public void setSex(String sex) {
    56. this.sex = sex;
    57. }
    58. @Override
    59. public String toString() {
    60. return "Student{" +
    61. "name='" + name + '\'' +
    62. ", age=" + age +
    63. ", sex='" + sex + '\'' +
    64. ", height=" + height +
    65. '}';
    66. }
    67. @Override
    68. public int compareTo(Student o) {
    69. return this.age - o.age;
    70. }
    71. }

  • 相关阅读:
    代码随想录day动态规划回文子串
    MySQL-(3)
    面向临床需求的CT图像降噪综述
    S1_servlet与数据库连接、filter过滤器、分页 实操的叙述
    玩转Android10源码开发定制(五)之源码目录说明及模块源码路径定位
    Neo4j离线环境搭建与基于python中py2neo的简单操作
    1235. 规划兼职工作(难度:困难)
    掌握基本排序算法:冒泡、选择、插入和快速排序
    人大女王大学金融硕士项目——披星戴月走过的路,一定可以繁花满地
    bindParam() 和 bindValue() 的区别
  • 原文地址:https://blog.csdn.net/qq_34577961/article/details/127539325