集合.txt 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. 集合
  2. 集合和数组的区别
  3. 相同点:
  4. 集合和数组都是一种容器,可以存储多个数据。
  5. 不同点:
  6. 数组长度不可变,集合的长度是可变的。
  7. 数组可以存储基本数据类型也可以存储引用数据类型
  8. 集合只能存储引用数据类型。如果想存储基本数据类型,需要存储基本数据类型对用的包装器类
  9. 基本类型 类
  10. byte -> Byte
  11. short -> Short
  12. int -> Integer
  13. long -> Long
  14. float -> Float
  15. double -> Double
  16. char -> Character
  17. boolean ->Boolean
  18. Java中集合的类型分为两种:
  19. 单列集合
  20. 有序、可重复
  21. 无序、不可重复
  22. 双列集合
  23. Collection集合
  24. 是单列集合的顶层接口,它表示一组对象,这些对象也可以称为Collection的元素
  25. java中不提供关于Collection集合的任何直接实现类,它提供更具体的子接口的实现类。
  26. 没有关于直接实现Collection集合的实现类,但是有Collection集合子接口(List、Set)的实现类
  27. 如果想要创建Collection集合的对象。
  28. 就需要采用多态的形式,创建Collection集合的实现类对象。比如ArrayList.
  29. 缺少遍历集合的方式
  30. Collection集合遍历的方式------迭代器
  31. 迭代器是专门用来遍历集合的。
  32. 迭代器是一个类,也是一个方法。
  33. //1、调用迭代器方法获取迭代器对象
  34. Iterator it = c.iterator();
  35. //再通过迭代器对象,调用方法,结合循环,实现遍历。
  36. //2、直接使用while循环
  37. //hasNext() 判断当前的位置的元素是否能被取出。 判断什么时候要结束循环
  38. //next() 获取当前位置的元素,然后将迭代器指向下一个元素位置。
  39. while (it.hasNext()){
  40. Object o = it.next(); //获取元素对象,从集合的最开始,获取一个有一个的元素,赋值给o对象
  41. //至于后面的操作,是输出,还是做运算,都可以.....
  42. System.out.println(o);
  43. }
  44. foreach迭代器
  45. 格式:
  46. for(元素类型 变量名 : 集合名){
  47. //使用变量
  48. }
  49. List集合(还是个接口)
  50. 是一种有序的集合,这里面的有序指的是【存取顺序】
  51. 我们可以精确的控制List集合中每个元素的插入位置,我们可以通过整数索引值来访问元素,并且可以搜索列表中的元素
  52. List允许放重复元素。
  53. List集合的特点:
  54. 1、存取有序
  55. 2、可以重复
  56. 3、有索引
  57. List常用的方法: (E 其实是泛型,可以使用任何类型,作用其实是规定要向集合中存取的元素类型)
  58. add(int index,E element) 在指定位置插入指定的元素
  59. E remove(int index) 删除集合中指定索引值位置的元素,并且返回被删除的元素
  60. E set(int index, E element) 修改指定索引位置的元素,返回被修改的元素
  61. E get(int index) 返回指定索引位置的元素。
  62. List接口是继承于Collection接口的,Collection接口里的方法List也都拥有
  63. 1、创建一个学生类,包含id、name、age属性,配置构造方法和setter、getter方法
  64. 创建ArrayList集合。
  65. ArrayList<Student> list=new ArrayList<>();
  66. list.add();
  67. 向集合中添加5个学生对象
  68. 获取索引值为3的学生的姓名
  69. 移除集合中索引值为4的学生
  70. 遍历集合
  71. 清空集合。
  72. 2、创建一个教师类,包含id、name、age属性,配置构造方法和setter、getter方法
  73. 创建LinkedList集合。
  74. 向集合中添加5个教师对象
  75. 获取索引值为3的教师的姓名
  76. 移除集合中索引值为4的教师
  77. 遍历集合
  78. 清空集合。
  79. 3、创建一个Person类,包含id、name、age属性,配置构造方法和setter、getter方法
  80. 创建LinkedList集合。
  81. 向集合中添加5个Person对象
  82. 获取索引值为3的Person的姓名
  83. 移除集合中索引值为4的Person对象
  84. 遍历集合
  85. 清空集合。
  86. 4、创建一个Person类,包含id、name、age属性,配置构造方法和setter、getter方法
  87. 创建ArrayList集合。
  88. 向集合中添加5个Person对象
  89. 获取索引值为3的Person的姓名
  90. 移除集合中索引值为4的Person对象
  91. 遍历集合
  92. 清空集合。
  93. Set集合
  94. Set集合不能存储重复元素
  95. Set集合没有索引,不能使用for循环遍历(可以使用foreach)
  96. Set集合也是一种接口,继承Collection集合
  97. Set集合常用的实现类分为:
  98. HashSet
  99. TreeSet
  100. HashSet集合
  101. HashSet集合的底层数据结构是哈希表
  102. 特点存取无序,存入的顺序和取出的顺序不一定一样。
  103. 不能存入重复元素
  104. 没有索引,不能使用for循环遍历
  105. hashSet集合,其实就是把一个又一个对象进行哈希运算(计算出hash码)后,再根据哈希值的顺序存入到集合中。
  106. 所以,我们存入集合的顺序,和取出元素的顺序是不一致的。
  107. HashCode(哈希值)
  108. 哈希值是JDK根据对象的地址或字符串或者数字进行计算,算出来的int类型的数值。
  109. 如果想获取某个对象的哈希值,可以调用对象.hashCode()方法。就会返回对象的哈希值。
  110. 哈希值(哈希码)特点:
  111. 同一个对象多次调用hashCode()方法,返回的hashCode值是相同的。
  112. 默认的情况下,不同的对象的哈希码值是不同的。
  113. 我们重写hashCode()方法的目的就是实现让不同的对象的哈希值相同。
  114. 使用HashSet集合存储学生对象并且遍历,
  115. - 创建一个存储学生对象的集合,存储多个学生对象,使用程序实现在控制台遍历该集合
  116. - 要求:学生对象的成员变量值相同,我们就认为是同一个对象
  117. 如果要使用HashSet集合存某个类型的对象,那么该类必须要先同时重写equals方法和hashCode方法
  118. TreeSet集合
  119. 不能存储重复元素
  120. 没有索引
  121. 可以将元素按照规则进行排序
  122. new TreeSet() 无参构造方法 让元素按照自然排序规则进行排序
  123. new TreeSet(Comparator c) 根据指定的比较器进行排序
  124. 注意:
  125. 任何存入TreeSet集合的引用类型对象,都必须要继承Comparable接口,并且重写compareTo方法,设定好两个对象的比较规则(比较大小)
  126. 自然排序:自定义类实现Comparable接口,并且重写compareTo方法,根据返回值进行排序
  127. 比较器排序:创建TreeSet对象的时候,传递Comparator的实现类对象(匿名内部类、lambda表达式),
  128. 重写compare(o1,o2)方法,然后根据返回值进行排序。
  129. 我们在使用TreeSet集合的时候,默认使用的是自然排序,但是当自然排序不能满足我们的业务需求的时候,就必须要使用比较器排序。
  130. 两种方式关于返回值的规则:
  131. 如果返回值是负数,表示当前存入的元素是较小值,存左边。
  132. 如果返回值是0,表示当前存入的元素是重复值,不存。
  133. 如果返回值是正数,表示当前存入的元素是较大值,存右边。