ToB企服应用市场:ToB评测及商务社交产业平台

标题: Collection单列集合总结 [打印本页]

作者: 盛世宏图    时间: 2023-3-19 22:19
标题: Collection单列集合总结
这篇文章记录了Collection集合,List集合,Set集合
在文章第七点总结了两大系列集合的五种实现类的区别,有需要的小伙伴可以直接去查看
一、什么是集合

集合是Java中存储对象数据的一种容器
二、集合有什么特点

三、体系结构


Collection单列集合,每个元素(数据)只包含一个值。
Map双列集合,每个元素包含两个值(键值对)。
四、Collection

1. 什么是Collection

官方的解释
说的通俗一点就是
   例如:Father f = new Sun(); // Sun类继承了Father类
2. Collection的体系结构


3. 常用方法

方法名称
说明
public boolean add(E e)
把给定的对象添加到当前集合中
public void clear()
清空集合中所有的元素
public boolean remove(Object o)
把给定的对象在当前集合中出现的第一个位置删除,如果删除失败返回false
public boolean contains(Object obj)
判断当前集合中是否包含给定的对象
public boolean isEmpty()
判断当前集合是否为空
public int size()
返回集合中元素的个数。
public Object[] toArray()
把集合中的元素,存储到数组中
4. 集合的遍历方式

4.1 迭代器

Iterator是集合专用的迭代方法,只能集合调用
Iterator中常用方法
  1. Collection<Integer> list = new ArrayList<>();
  2. Iterator<Integer> iterator = list.iterator();
  3. while(iterator.hasNext()){
  4.     Integer next = iterator.next();
  5.     System.out.println(next);
  6. }
复制代码
注意事项
4.2 普通for

只适用于List系列集合,因为他有序
通过调用集合的get方法,根据索引取值
4.3 增强for
  1. List<Integer> list = new ArrayList<>();
  2. list.add(1);
  3. list.add(3);
  4. list.add(2);
  5. //增强for
  6. for (int i : list) {
  7.     if (i == 3) {
  8.         i = 5;//增强for中如果对取出的这个元素修改,将不会对集合产生影响
  9.     }
  10.     System.out.println(i);
  11. }
复制代码
4.4 Lambda迭代
  1. // 使用lambda表达式集合的迭代
  2. colStr.forEach(new Consumer() {
  3.     @Override public void accept(String s) {
  4.         System.out.println(s);
  5.     }
  6. });
  7. // 简化写法
  8. System.out.println("-------------------------");
  9. colStr.forEach(s-> System.out.println(s));
  10. System.out.println("-------------------------");
  11. // 再次简化
  12. colStr.forEach(System.out::println);
复制代码
五、List

Collection的子接口
1. 特点

有序,有索引(是独有的),可重复,可存储null值,此实现不同步,线程不安全
存储和取出顺序一致
2. 特有方法

方法名称
说明
注意
void add(int index, E element)
将给定的元素插入到指定位置
索引不能越界,否则报错
 
E get(int index)
返回该索引位置的元素,没找到返回-1
E set(int index, E element)
对给定位置的元素进行替换
E remove(int index)
删除指定位置的元素
int lastIndexOf(Object o)
返回特定元素在集合中最后一次出现的位置
没找到返回-1
int indexOf(Object o)
返回特定元素在集合中第一次出现的位置
ListIterator listIterator()
List集合特有的迭代器
 
List subList(int fromIndex, int toIndex)
根据开始索引和结束索引(左闭右开)返回一个新的集合,该集合是原集合的子集
 
ListIterator叫做列表迭代器,将在第3.2解释

3. 迭代方式

和Collection一样的:迭代器、增强for、Lambda表达式
List独有的:listIterator、普通for(因为有索引)
3.1 并发修改异常

迭代器在迭代集合,但是集合本身被修改,换而言之:就是在同一时刻只能有一个对象来操作集合,否则就会出现并发修改异常
下面两种情况会出现并发修改异常

  1. 迭代器和集合方法都会对集合进行操作
  1. List<String> list = new ArrayList<>();
  2. list.add("java");
  3. list.add("css");
  4. list.add("python");
  5. while(stringListIterator.hasNext()){
  6.     String ele = stringListIterator.next();
  7.     if("css".equals(ele)){
  8.         stringListIterator.remove();//允许
  9.         //list.remove("css");// 不允许 出现 ConcurrentModificationException
  10.     }
  11.     System.out.println(ele);
  12. }
复制代码
  2. 增强for本身也是一个Iterator迭代器,同样不能使用
  1. List<String> list = new ArrayList<>();
  2. list.add("java");
  3. list.add("css");
  4. list.add("python");
  5. for (String s : list) {
  6.     if("css".equals(s)){
  7.         list.remove("css");//不允许,并发修改异常
  8.     }
  9.     System.out.println(s);
  10. }
复制代码
不会出现并发修改异常
  1. List<String> list = new ArrayList<>();
  2. list.add("java");
  3. list.add("css");
  4. list.add("python");
  5. for (int i= 0; i < list.size();i++){
  6.     String ele = list.get(i);
  7.     if("css".equals(ele)){
  8.         list.remove("css");// 允许
  9.     }
  10. }
  11. System.out.println(list);
复制代码
并发修改异常总结

3.2 ListIterator

boolean hasNext()
从前往后遍历
boolean hasPrevious()
从后往前遍历,前提是先得从前往后遍历一遍,让迭代器指针走到末尾
  1. List<String> list = new ArrayList<>();
  2. ListIterator<String> listIterator = list.listIterator();
复制代码
4. 两个主要的接口实现类

4.1 特点

List的接口实现类,List的特点就是ArrayList、LinkedList的特点
4.2 ArrayList


4.3 LinkedList




六、Set

1. 特点

元素唯一,无序,没有索引,最多只能一个null
三个主要的接口实现类
HashSet、TreeSet、LinkedHashSet
2. HashSet

2.1 特点:无序(HashSet只是不保证有序,并不是保证无序),不重复,无索引,此实现不同步

2.2 底层实现:哈希表,是一种对增删改查性能都较好的结构

  jdk8之前:数组+链表
  jdk8之后:数组+链表+红黑树
2.3 HashSet底层存储结构



  jdk8之前:新元素占据旧元素位置,指向旧元素。当元素链表挂载元素过多会造成查询性能下降。
  jdk8之后:新元素挂在旧元素下面。当链表长度超过8时,自动将链表转换为红黑树,进一步提高性能
  1. //假设这是一个学生类,有name和age两个属性
  2. //重写equals和hashCode方法
  3. @Override
  4. public boolean equals(Object o) {
  5.     if (this == o)
  6.         return true;
  7.     if (o == null || getClass() != o.getClass())
  8.         return false;
  9.     Student student = (Student) o;
  10.     return Objects.equals(name, student.name); //例如这里
  11.     //可以自定义比较对象中的哪一个特征,比如就比较名字是否一样,不在乎年龄是否一样
  12. }
  13. @Override
  14. public int hashCode() {
  15.     return Objects.hash(name); //例如这里
  16.     //可以自定义要进行计算哈希的对象,比如只想判断名字哈希是否一样,
  17.     //名字哈希一样就认为这俩对象哈希一样,不在乎年龄哈希是否一样
  18. }
复制代码
3. TreeSet

3.1 特点:默认自然升序排序,不重复,无索引,可排序

3.2 排序方式


  创建集合时候就实现Comparator接口
  如何理解排序呢

  首先要知道这俩的区别
  通俗一点,用人话说就是:
LinkedHashSet

七、所有集合最全面总结

 ListSet
实现类ArrayListLinkedListHashSetTreeSetLinkedHashSet
顺序有序有序无序有序有序
重复可重复可重复不可重复不可重复不可重复
空值允许多个null允许多个null最多一个null最多一个null最多一个null
索引有索引有索引无索引无索引无索引
排序存入顺序就是取出顺序存入顺序就是取出顺序不能排序自然排序和比较器排序存入顺序就是取出顺序
特点查询快增删首尾操作快增删改查都快的五边形战士唯一可以自定义排序增删改查都快的五边形战士
底层数组链表哈希表红黑树哈希表和双链表
凡是带list都可重复、有索引凡是带set都不可重复、无索引
凡是带hash都是五边形战士,增删改查都快只有HashSet无序、不能排序
八、集合工具类Collections

Collections 不属于集合,是用来操作集合的工具类

 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4