Java集合框架

简介: Java集合框架

我是南城余!阿里云开发者平台专家博士证书获得者!

欢迎关注我的博客!一同成长!

一名从事运维开发的worker,记录分享学习。

专注于AI,运维开发,windows Linux 系统领域的分享!

本章节对应知识库


 

集合框架 (yuque.com)

面试相关

集合中安全与不安全的类

不安全:ArrayList、HashMap、HashSet

安全:Vector、Hashtable

两种遍历集合的方式
public class exer1 {
    public static void main(String[] args) {
        HashMap hashMap = new HashMap();
        hashMap.put("张杰","逆战");
        hashMap.put("邓紫棋","喜欢你");
        hashMap.put("群星","逆战");
        hashMap.put("张杰","天下");
        //遍历 方式1
        Iterator iterator = hashMap.keySet().iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
        System.out.println("======");
        Iterator iterator1 = hashMap.keySet().iterator();;
        while (iterator1.hasNext()){
            System.out.println(iterator1.next());
        }
        //遍历方式2:增强for循环
        System.out.println("======");
        for(Object obj: hashMap.entrySet()){
            System.out.println(obj);
        }
    }
}
数组存储的特点

》数组一旦初始化,其长度是确定的

》数组中的多个元素是依次紧密排列的,有序的,可重复的

》(优点)数组一旦初始化完成,其元素的类型就确定的。不是此类型的元素,就不能添加到此数组中

int[] arr = new int[10];
arr[1] = 1;
arr[2] = "aa"; //编译报错
Object[] arr1 = new Object[10];
arr[0] = new String();
arr[1] = new Date();

(优点)元素的类型既可以是基本数据类型,也可以是引用数据类型

数据存储的弊端

数组一旦初始化,其长度就不可变

》数组中存储数据特点单一,对于无序的、不可重复的场景的多个数据就无能为力

》数组中可用的方法、属性都极少。具体的需求,都需要自己来组织代码逻辑

集合框架(java.util包下)

java.util.Collection:存储一个一个的数据

子接口:List:存储有序的、可重复的数据(动态数组)

ArrayList(主要实现类)、LinkedList、Vector

子接口:Set:存储无序的、不可重复的数据

HashSet(主要实现类)、LinkedHashSet、TreeSet

java.util.Map :存储一对一对的数据(key-value键值对,(x1、y1)(x2、y2)->y=f(x),类似于高中的函数)

HashMap(主要实现类)、LinkedHashMap、TreeMap、Hashtable、Properties

集合与数组的相互转换

集合——》数组:toArray()

数组——》集合:调用Arrays的静态方法asList(Object ... objs),返回一个List

Collection

向Collection中添加元素要求

要求元素所属的类的equals()方法重写

原因:

因为Collection中的相关方法(contains()/remove())在使用时,要调用元素所在类的equals()方法。

迭代器(Iterator)

迭代器是用来遍历Collection,不能用来遍历Map(因为Map里面存储的键值)

设计模式的一种

迭代器不负责存储数据,只用来遍历集合元素

迭代器创建对象

Iterator itertor = 对象名.Iterator();

遍历Iterator对象

while(iterator.hasNext()){

System.out.pringtln(iteror.next());

}

增强for循环(foreach循环)(jdk5)

作用

用来遍历数组、集合

for(要遍历的集合或数组的类型 临时变量名:要遍历的集合或数组的变量名){

操作临时变量的输出

}

说明

》针对集合来讲,增强for循环的底层仍然使用的是迭代器

》增强for循环的执行过程,是将集合和数中的元素依次赋值给临时变量,注意,循环体对临时变量的修改,可能不会导致原有集合和数组中的元素的修改。

一般for循环

一般for循环是用来遍历List

List

由于时Colletion类的子类,所以Colletion类方法List都可以使用

但是继承关系,所以新增了多种方法

add(Object obj)

addAll(Collection coll)

remove(Obeject obj)

remove(int index)

set(int index,Object ele)

get(int index)

add(int index,Object ele)

addAll(int index,Collection eles)

长度

size()

遍历

Iterator()

增强for循环

一般for循环

List实现类

java.util.Collection:存储一个一个的数据

子接口:List:存储有序的、可重复的数据(动态数组)

ArrayList:List的主要实现类;线程不安全;底层使用Object[]数组存储

在添加数据、查找数据时,效率高效,在插入、删除数据时,效率低效

LinkedList:底层使用双向链表的方式进行存储数据;在对集合中的数据进行频繁删除,插入操作 时,建议使用此类

在插入数据、删除数据时,效率较高,在添加数据、查找数据时,效率低效

Vector:List的古老实现类;线程安全的,效率低;底层使用Object[]数组储存

Set

Set实现类

java.util.Collection:存储一个一个的数据

子接口:Set:存储无序的、不可重复的数据

HashSet:主要实现类,底层使用的时HashMap,即使用的是数组+单向链表+红黑树进行存储

LinkedHashSet:是HashSet子类,在现有的数组+单向链表+红黑树结构基础上,又添加 了一组双向链表,用于记录添加的元素先后顺序。即我们可以按照添加元素的顺序进行遍历

TreeSet:底层使用红黑树进行存储,可以按照添加的元素的指定属性的大小顺序进行遍历。

开发中,Set使用频率比List、Map少,用来过滤重复数据

无序性:!=随机性

添加元素的顺序和遍历的元素的顺序不一致,是不是无序性呢?No!

这里的无序性,指的是与添加的元素的位置有关,不像ArrayList一样依次紧密排列

这里根据的是添加元素的哈希值,计算的其在数组中的存储位置。此位置不是依次排列的,表现为无序性

不可重复性:

是根据哈希值先判断两个存储数据的哈希值是否相等,若相等,则判断值是否相等,或者是否存 在,不存在则放入,存在则覆盖数据。

比较标准,需判断hashCode()得到的哈希值以及equals()得到的boolean型的结果

哈希值相同且equals()返回true,则认为元素相同

添加到HashSet和LinkedHahSet元素的要求

要求元素所在类要重写两个方法:equals()和hashCode()

TreeSet

底层使用红黑树进行存储,可以按照添加的元素的指定属性的大小顺序进行遍历。

添加元素的属性必须保持一致,否则会保错异常ClassException

必须考虑排序:①自然排序②定制排序

判断数据是否相同的标准

不再是考虑hashCode()和equals()方法,也意味着添加到TreeSet中的元素所在的类不需要重写这两种方法

比较元素的方法为排序:①自然排序②定制排序(compareTo()或者compare()的返回值)

如果compareTo()或者compare()的返回值为0,则认为两个对象相等

由于TreeSet中存放的元素不能相同,则后一个元素如果i相同,则不能添加到TreeSet中

Map

java.util.Map:存储一对一对的数据(key-value键值对,(x1,y1),(x2,y2)->y=f(x))

HashMap:主要的实现类,线程不安全,效率高,可以添加null的key和value的值,底层使用的 数组+单向链表+红黑树结构存储

LinkedHashMap:是HashMap的子类,在HashMap使用的数据结构基础上,增加了一 对双向链表,用于记录添加的元素的先后顺序,即添加的顺序即为打·· 印输出的顺序,进而遍历元素时,就可以按照添加的元素显示

TreeMap:底层使用的红黑树存储,可以添加按照key-value中的key元素指定的属性大小顺序遍 历,需要考虑①自然排序②定制排序(compareTo()或者compare()的返回值)

Hashtable:古老的实现类,线程安全,效率低,不可以添加null的key或value的值;底层使用的是数组+单向链表存储

Properties:其key和value都是String类型。常用来处理属性文件

HashMapkey存储位置

存储在数组+链表+红黑树。key、value作为树的node属性出现。

HashMap中的元素特点

》HashMap中的所有的key彼此之间是不可重复的,无序的。所有的key就构成了一个Set集合。——》key所在类要重写HashCode()和equals()方法

》HashMap中的所有的value彼此之间是可重复的、无序的。所有的value就构成一个Collection集合——》value所在的类要重写equals()

》HashMap中的一个key—value,就构成了一个entry

》HasnMap中的所有entry彼此之间是不可重复的、无序的。所以entry就构成了一个Set集合

Map中的常用方法

  • 添加、修改操作:
  • Object put(Object key,Object value):将指定key-value添加到(或修改)当前map对象中
  • void putAll(Map m):将m中的所有key-value对存放到当前map中
  • 删除操作:
  • Object remove(Object key):移除指定key的key-value对,并返回value
  • void clear():清空当前map中的所有数据
  • 元素查询的操作:
  • Object get(Object key):获取指定key对应的value
  • boolean containsKey(Object key):是否包含指定的key
  • boolean containsValue(Object value):是否包含指定的value
  • int size():返回map中key-value对的个数
  • boolean isEmpty():判断当前map是否为空
  • boolean equals(Object obj):判断当前map和参数对象obj是否相等
  • 元视图操作的方法:
  • Set keySet():返回所有key构成的Set集合
  • Collection values():返回所有value构成的Collection集合
  • Set entrySet():返回所有key-value对构成的Set集合
import java.util.HashMap;
public class TestMapMethod {
    public static void main(String[] args) {
        //创建 map对象
        HashMap map = new HashMap();
        //添加元素到集合
        map.put("黄晓明", "杨颖");
        map.put("李晨", "李小璐");
        map.put("李晨", "范冰冰");
        map.put("邓超", "孙俪");
        System.out.println(map);
        //删除指定的key-value
        System.out.println(map.remove("黄晓明"));
        System.out.println(map);
        //查询指定key对应的value
        System.out.println(map.get("邓超"));
        System.out.println(map.get("黄晓明"));
    }
}
TreeMap

底层使用红黑树进行存储,可以按照添加的key-value的中key元素的指定属性的大小顺序进行遍历。

添加元素的属性必须保持一致,否则会保错异常ClassException

必须考虑排序:①自然排序②定制排序

向TreeMap中添加的key属性必须保持一致,即唯一

Properties

Properties是HashTable的子类

Colletions

Collections是一个操作Set、List、Map等集合的工具类

Colletion和Colletions的区别

Colletion:集合框架的接口,其子类包括Set、List等子接口

Collections是一个操作Set、List、Map等集合的工具类

Map不是直接继承自Collection接口。实际上,Map是继承自Collection接口的另一个接口,叫做Map接口。Map接口提供了键值对数据的存储和访问方法,与Collection接口提供的基本集合操作方法不同。

以下是一些与Map相关的常用实现类:

  • HashMap:基于哈希表的实现,提供快速的插入和查找操作。
  • TreeMap:基于红黑树的实现,按键进行排序,可以进行二分查找。
  • LinkedHashMap:在HashMap的基础上,通过链表维护插入顺序或访问顺序。
  • ConcurrentHashMap:支持高并发访问的线程安全Map实现。

这些实现类都是基于Map接口的扩展,具有不同的特性和适用场景。

常用方法

Collections 中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作,还提供了对集合对象设置不可变、对集合对象实现同步控制等方法(均为static方法):

排序操作:

  • reverse(List):反转 List 中元素的顺序
  • shuffle(List):对 List 集合元素进行随机排序
  • sort(List):根据元素的自然顺序对指定 List 集合元素按升序排序
  • sort(List,Comparator):根据指定的 Comparator 产生的顺序对 List 集合元素进行排序
  • swap(List,int, int):将指定 list 集合中的 i 处元素和 j 处元素进行交换

查找

  • Object max(Collection):根据元素的自然顺序,返回给定集合中的最大元素
  • Object max(Collection,Comparator):根据 Comparator 指定的顺序,返回给定集合中的最大元素
  • Object min(Collection):根据元素的自然顺序,返回给定集合中的最小元素
  • Object min(Collection,Comparator):根据 Comparator 指定的顺序,返回给定集合中的最小元素
  • int binarySearch(List list,T key)在List集合中查找某个元素的下标,但是List的元素必须是T或T的子类对象,而且必须是可比较大小的,即支持自然排序的。而且集合也事先必须是有序的,否则结果不确定。
  • int binarySearch(List list,T key,Comparator c)在List集合中查找某个元素的下标,但是List的元素必须是T或T的子类对象,而且集合也事先必须是按照c比较器规则进行排序过的,否则结果不确定。
  • int frequency(Collection c,Object o):返回指定集合中指定元素的出现次数

复制、替换

  • void copy(List dest,List src):将src中的内容复制到dest中
  • boolean replaceAll(List list,Object oldVal,Object newVal):使用新值替换 List 对象的所有旧值
  • 提供了多个unmodifiableXxx()方法,该方法返回指定 Xxx的不可修改的视图。

添加

  • boolean addAll(Collection  c,T... elements)将所有指定元素添加到指定 collection 中。

同步

  • Collections 类中提供了多个 synchronizedXxx() 方法,该方法可使将指定集合包装成线程同步的集合,从而可以解决多线程并发访问集合时的线程安全问题:
目录
相关文章
|
7天前
|
存储 缓存 Java
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
31 3
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
|
1月前
|
并行计算 算法 Java
Java中的Fork/Join框架详解
Fork/Join框架是Java并行计算的强大工具,尤其适用于需要将任务分解为子任务的场景。通过正确使用Fork/Join框架,可以显著提升应用程序的性能和响应速度。在实际应用中,应结合具体需求选择合适的任务拆分策略,以最大化并行计算的效率。
51 23
|
2月前
|
存储 安全 Java
Java 集合框架中的老炮与新秀:HashTable 和 HashMap 谁更胜一筹?
嗨,大家好,我是技术伙伴小米。今天通过讲故事的方式,详细介绍 Java 中 HashMap 和 HashTable 的区别。从版本、线程安全、null 值支持、性能及迭代器行为等方面对比,帮助你轻松应对面试中的经典问题。HashMap 更高效灵活,适合单线程或需手动处理线程安全的场景;HashTable 较古老,线程安全但性能不佳。现代项目推荐使用 ConcurrentHashMap。关注我的公众号“软件求生”,获取更多技术干货!
53 3
|
2月前
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
60 5
|
3月前
|
存储 缓存 安全
Java 集合框架优化:从基础到高级应用
《Java集合框架优化:从基础到高级应用》深入解析Java集合框架的核心原理与优化技巧,涵盖列表、集合、映射等常用数据结构,结合实际案例,指导开发者高效使用和优化Java集合。
72 4
|
3月前
|
Java 数据库
在Java中使用Seata框架实现分布式事务的详细步骤
通过以上步骤,利用 Seata 框架可以实现较为简单的分布式事务处理。在实际应用中,还需要根据具体业务需求进行更详细的配置和处理。同时,要注意处理各种异常情况,以确保分布式事务的正确执行。
|
3月前
|
消息中间件 Java Kafka
在Java中实现分布式事务的常用框架和方法
总之,选择合适的分布式事务框架和方法需要综合考虑业务需求、性能、复杂度等因素。不同的框架和方法都有其特点和适用场景,需要根据具体情况进行评估和选择。同时,随着技术的不断发展,分布式事务的解决方案也在不断更新和完善,以更好地满足业务的需求。你还可以进一步深入研究和了解这些框架和方法,以便在实际应用中更好地实现分布式事务管理。
|
3月前
|
开发框架 Java 关系型数据库
Java哪个框架适合开发API接口?
在快速发展的软件开发领域,API接口连接了不同的系统和服务。Java作为成熟的编程语言,其生态系统中出现了许多API开发框架。Magic-API因其独特优势和强大功能,成为Java开发者优选的API开发框架。本文将从核心优势、实际应用价值及未来展望等方面,深入探讨Magic-API为何值得选择。
133 2
|
3月前
|
Java 数据库连接 API
Spring 框架的介绍(Java EE 学习笔记02)
Spring是一个由Rod Johnson开发的轻量级Java SE/EE一站式开源框架,旨在解决Java EE应用中的多种问题。它采用非侵入式设计,通过IoC和AOP技术简化了Java应用的开发流程,降低了组件间的耦合度,支持事务管理和多种框架的无缝集成,极大提升了开发效率和代码质量。Spring 5引入了响应式编程等新特性,进一步增强了框架的功能性和灵活性。
77 0
|
3月前
|
前端开发 Java 数据库连接
你不可不知道的JAVA EE 框架有哪些?
本文介绍了框架的基本概念及其在编程领域的应用,强调了软件框架作为通用、可复用的软件环境的重要性。文章分析了早期Java EE开发中使用JSP+Servlet技术的弊端,包括可维护性差和代码重用性低等问题,并阐述了使用框架的优势,如提高开发效率、增强代码规范性和可维护性及提升软件性能。最后,文中详细描述了几种主流的Java EE框架,包括Spring、Spring MVC、MyBatis、Hibernate和Struts 2,这些框架通过提供强大的功能和支持,显著提升了Java EE应用的开发效率和稳定性。
239 1

热门文章

最新文章