Java 集合

简介: Java 集合

一  集合简介:

  1. 什么是集合?  集合简称集,是用来存储多个元素的容器
  2. 集合与数组的区别:集合中:引用类型的数据(如果存储基本类型时自动装箱),数组中:既可以是基本数据类型也可以是引用类型 。集合中:元素个数不固定,可任意扩容,数组是固定的,不可任意扩容。
  3. 集合的好处:不受容器大小的限制,可以随时添加,删除元素。Java针对集合提供了大量操作元素的方法(如:判断,获取等)
  4. 集合体系:(1)单列集合(Collection 接口) List体系:ArrayList类  Set体系:HashSet类                        (2)双列集合(Map接口:key,value)Map体系:HashMap类
注意:
集合类<泛型类> 集合对象名 = new 集合类<>();
使用System.out.println(“集合对象名”); s时默认调用该泛型类的 toString()方法,若该泛型
类没有重写toString()方法,则调用Object类中的默认方法,会输出集合中元素的字符串格式。
解决方法:需要获取集合中的内容,需要重写泛型类中的 toString()方法

二  List集合 :

  1. 特点:可重复 、有序(存取的顺序相同,先存的先取)
  2. 应用:List list = new ArrayList(); (List 为接口不能实例化,该方法为父接口指向子类对象来实例化)
ArrayList
构造方法:
1 ArrayList():构造一个初始容量为 10 的空列表
2 ArrayList​(int initialCapacity):构造一个具有指定初始容量的空列表
3 ArrayList​(Collection<? extends E> c):按照集合的迭代器返回的顺序构造一个包含指定集合元素的列表
成员方法:
1 add​(int index, E element):在此列表中的指定位置插入指定元素
2 add​(E e):将指定的元素附加到此列表的末尾,返回boolean值表示是否添加成功
3 clear():从此列表中删除所有元素
4 get​(int index):返回此列表中指定位置的元素
5 indexOf​(Object o)  返回此列表中指定元素第一次出现的索引,如果此列表不包含该元素,则返回 -1
6 isEmpty():true如果此列表不包含任何元素,则返回
7 remove​(int index):移除此列表中指定位置的元素
8 removeAll​(Collection<?> c):从此列表中删除包含在指定集合中的所有元素
9 set​(int index, E element):用指定的元素替换此列表中指定位置的元素
10 size():返回此列表中的元素数

三 增强for循环:

  1. 为什么增强for循环:简化数组和集合的遍历
  2. 格式:
for(数据类型 变量名 : 数组或者集合对象){
    //循环体,变量即元素
}
注:在IDEA编译器中的快捷键:iter + 回车
  1. 增强for循环的底层依赖的是迭代器(Iterator),即增强for循环就是迭代器的简写形式

四 迭代器:

  1. 为什么使用迭代器?对过程的重复,称为迭代,迭代器是遍历Collection集合的通用方式,可以在对集合遍历的同时进行添加、删除等操作。
常用方法:
1 next():返回迭代的下一个元素对象
2 hasNext():如果仍有元素可以迭代,则返回ture
3 remove():从底层集合中移除此迭代器返回的最后一个元素(可选操作)
4 iterator():返回此集合中元素的迭代器
例:通过迭代器遍历List集合
1 创建集合对象
List list = new ArrayList();
2 创建元素对象
3 将元素对象添加到集合对象中
list.add("a");
list.add("b");
list.add("c");
4 遍历集合
(1)根据集合对象获取其对象的迭代器对象 
    Iterator it = list.iterator();
(2)判断迭代是否有元素
        while (it.hasNext()){
        (3)如果有元素就输出
            System.out.println(it.next());
        }
例: 在“b”后添加“java”
        List<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        Iterator it = list.iterator();
        while (it.hasNext()){
            String s = (String) it.next();
            if("b".equals(s)){ //使用常量“b”调用equals方法与变量s比较,防止空指针异常
                list.add("java");
            }
        }
list.add("java") 这样写,会报ConcurrentModificationException(并发修改异常)
需要调用List独有的列表迭代器,该迭代器支持在遍历集合的同时进行添加、删除等操作
修改后:
        List<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        ListIterator lit = list.listIterator();
        while (lit.hasNext()){
            String s = (String) lit.next();
            if(s.equals("b")){
                lit.add("java"); //使用列表迭代器进行添加
            }
        }
        System.out.println(list);
输出结果:[a, b, java, c]
  1. 总结:普通的迭代器在遍历集合的同时不能添加或者删除元素,否则会报并发修改异常。使用列表迭代器在遍历的同时可以修改集合中的元素,但必须使用列表迭代器的方法

四 泛型类

  1. 什么是泛型类?即泛指任意类型,又叫参数化类型,对具体类型的使用起到辅助作用,类似于方法的参数
  2. 集合类泛型的解释:表示该集合中存指定类型的元素 List<String> list = new ArrayList<>();
  3. 泛型类的好处:类型安全,避免了类型转换
  4. 总结泛型一般只和集合类结合使用,泛型是JDK5提出的特性,在JDK7开始,后边的泛型可以不用写出具体的数据类型(菱形泛型类)

五 Collections工具类

  1. 简介:针对集合进行操作的工具类
成员方法:
1 sort(List<T>):根据元素的自然顺序,将指定列表按升序排列
2 max(Collection<T>):返回集合的最大元素
3 min(Collection<T>):返回集合的最小元素
4 reverse(List<T>):反转List集合元素
5 shuffle(List<T>):使用默认的随机源随机置换指定的列表
注:大部分方法为静态方法,可通过类名直接进行调用

六 Set集合

  1. 特点:不可重复,无序(先进后出)
  2. 应用:Set<T>  set  =  new HashSet<>();
HashSet成员方法:
1 add​(E e):如果指定的元素尚不存在,则将其添加到此集合中
2 clear():从此集合中删除所有元素
3 isEmpty():true如果此集合不包含任何元素,则返回
4 contains​(Object o):返回true此集合是否包含指定的元素
5 iterator():返回此集合中元素的迭代器
6 remove​(Object o):如果存在,则从此集合中删除指定的元素
7 size():返回此集合中的元素数(其基数)
  1. 遍历集合与List类似
  2. 注意:Set会“去重”,其保证元素的唯一性依赖的是equals() 和 hashCode() 的方法,如果使用的<T>:泛型类中没有重写equals() 和 hashCode() 的方法,则默认调用Object类中的方法,而在Object中这俩种方法比较的是地址值是否相同,就会造成不同对象,内容相同,但地址不同,同时存入HashSet,造成元素重复。解决方法,在泛型类中,重新equals() 和 hashCode() 的方法,使其进行内容的比较。
  3. 结论Set结合的元素唯一性依靠其引用泛型类的equals() 和 hashCode() 方法

七 Map集合

  1. 特点:双列集合元素由键值对(Entry)构成:key -- value (key不可重复,value可重复)
  2. 应用:Map<T1 , T2>  map  =  new  HashMap<>();  (T1:键的类型,T2:值的类型)
HashMap成员方法:
1 put​(K key, V value):将指定值与此映射中的指定键相关联,如果一个键第一次添加元素,则返回null,如果同一个键第二次添加,则会覆盖第一次的内容,并返回第一次的内容
2 remove​(Object key):如果存在,则从此映射中删除指定键的映射
3 keySet():获取所有的key,返回Set集合;
4 get​(Object key):返回指定键映射到的值(根据键获取值),或者null如果此映射不包含键的映射
5 remove​(Object key):如果存在,则从此映射中删除指定键的映射
6 values():返回Collection此映射中包含的值的视图
  1.  
遍历集合:
1 获得所有的键集合:
Set<key的泛型类> key = map.keySet();
2 遍历所有集合:使用迭代器或增强for循环
for (key的泛型类 i : key){
    System.out.println(map.get(i)); //3 使用get获得value值
}


目录
相关文章
|
2月前
|
算法 Java 数据处理
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。HashSet基于哈希表实现,提供高效的元素操作;TreeSet则通过红黑树实现元素的自然排序,适合需要有序访问的场景。本文通过示例代码详细介绍了两者的特性和应用场景。
46 6
|
2月前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
44 3
|
2月前
|
存储 Java 数据处理
Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位
【10月更文挑战第16天】Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位。本文通过快速去重和高效查找两个案例,展示了Set如何简化数据处理流程,提升代码效率。使用HashSet可轻松实现数据去重,而contains方法则提供了快速查找的功能,彰显了Set在处理大量数据时的优势。
34 2
|
5天前
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
24 5
|
18天前
|
存储 缓存 安全
Java 集合框架优化:从基础到高级应用
《Java集合框架优化:从基础到高级应用》深入解析Java集合框架的核心原理与优化技巧,涵盖列表、集合、映射等常用数据结构,结合实际案例,指导开发者高效使用和优化Java集合。
29 4
|
1月前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
30 2
|
1月前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
|
1月前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
1月前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
1月前
|
Java 开发者