当前位置: 首页 > news >正文

Java集合框架详解:深入探讨Java中的集合框架

前言

Java集合框架是Java语言中用于存储和操作大量数据的基石。集合框架提供了一套灵活的接口和实现,使得数据的存储、访问和管理变得异常简单。在本专栏中,我们将深入探讨Java集合框架,包括List、Set、Map等集合的使用和内部实现。

集合框架概述

Java集合框架主要由以下几个部分组成:

  • 接口(Interfaces):定义了集合的基本操作。
  • 实现(Implementations):提供了接口的具体实现。
  • 算法(Algorithms):用于操作或返回集合的实用方法。

List接口

List是Java集合框架中一个非常重要的接口,它是一个有序的集合,可以包含重复的元素。

List接口的特点

  • 有序:元素按照添加的顺序排列。
  • 可重复:可以包含重复的元素。
  • 动态数组:通常使用动态数组来实现。

List接口的实现

  • ArrayList:基于动态数组实现的List,支持快速随机访问。
  • LinkedList:基于双向链表实现的List,支持快速的插入和删除操作。

示例代码:ArrayList的使用

import java.util.ArrayList;public class ArrayListExample {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("Java");list.add("Python");list.add("C++");System.out.println("Original List: " + list);// Accessing elements by indexSystem.out.println("Element at index 1: " + list.get(1));// Removing elementslist.remove("C++");System.out.println("List after removal: " + list);}
}

示例代码:LinkedList的使用

import java.util.LinkedList;public class LinkedListExample {public static void main(String[] args) {LinkedList<String> list = new LinkedList<>();list.add("Java");list.addFirst("Python");list.addLast("C#");System.out.println("Original List: " + list);// Accessing elementsSystem.out.println("First Element: " + list.getFirst());System.out.println("Last Element: " + list.getLast());// Removing elementslist.removeFirst();list.removeLast();System.out.println("List after removal: " + list);}
}

Set接口

Set是一个不允许重复元素的集合。

Set接口的特点

  • 不允许重复:不能包含重复的元素。
  • 无序:元素没有特定的顺序。

Set接口的实现

  • HashSet:基于哈希表实现的Set,提供快速查找。
  • LinkedHashSet:类似于HashSet,但可以按照插入顺序遍历元素。
  • TreeSet:基于红黑树实现的Set,可以按照自然顺序或自定义顺序排序元素。

示例代码:HashSet的使用

import java.util.HashSet;public class HashSetExample {public static void main(String[] args) {HashSet<Integer> set = new HashSet<>();set.add(1);set.add(2);set.add(3);System.out.println("Original Set: " + set);// Checking for existenceSystem.out.println("Does the set contain 2? " + set.contains(2));// Removing elementsset.remove(2);System.out.println("Set after removal: " + set);}
}

示例代码:LinkedHashSet的使用

import java.util.LinkedHashSet;public class LinkedHashSetExample {public static void main(String[] args) {LinkedHashSet<String> set = new LinkedHashSet<>();set.add("Java");set.add("Python");set.add("C++");System.out.println("Original Set: " + set);// Iterating in insertion orderset.forEach(element -> System.out.println(element));}
}

示例代码:TreeSet的使用

import java.util.TreeSet;public class TreeSetExample {public static void main(String[] args) {TreeSet<Integer> set = new TreeSet<>();set.add(3);set.add(1);set.add(2);System.out.println("Sorted Set: " + set);// TreeSet maintains natural orderingset.forEach(element -> System.out.println(element));}
}

Map接口

Map是一种键值对集合,每个键只能映射一个值。

Map接口的特点

  • 键值对:存储数据为键值对的形式。
  • 键唯一:每个键都是唯一的。

Map接口的实现

  • HashMap:基于哈希表实现的Map,提供快速查找。
  • LinkedHashMap:类似于HashMap,但可以按照插入顺序遍历键值对。
  • TreeMap:基于红黑树实现的Map,可以按照自然顺序或自定义顺序排序键。

示例代码:HashMap的使用

import java.util.HashMap;public class HashMapExample {public static void main(String[] args) {HashMap<String, Integer> map = new HashMap<>();map.put("Apple", 1);map.put("Orange", 2);map.put("Banana", 3);System.out.println("Original Map: " + map);// Accessing values by keySystem.out.println("Value for 'Apple': " + map.get("Apple"));// Removing entriesmap.remove("Banana");System.out.println("Map after removal: " + map);}
}

示例代码:LinkedHashMap的使用

import java.util.LinkedHashMap;public class LinkedHashMapExample {public static void main(String[] args) {LinkedHashMap<String, Integer> map = new LinkedHashMap<>();map.put("Apple", 1);map.put("Orange", 2);map.put("Banana", 3);System.out.println("Original Map: " + map);// Iterating in insertion ordermap.forEach((key, value) -> System.out.println(key + " => " + value));}
}

示例代码:TreeMap的使用

import java.util.TreeMap;public class TreeMapExample {public static void main(String[] args) {TreeMap<String, Integer> map = new TreeMap<>();map.put("Banana", 3);map.put("Apple", 1);map.put("Orange", 2);System.out.println("Sorted Map: " + map);// TreeMap maintains natural ordering of keysmap.forEach((key, value) -> System.out.println(key + " => " + value));}
}

集合框架的高级特性

迭代器模式(Iterator)

迭代器模式是一种设计模式,它允许开发者在不知道集合底层实现的情况下,顺序访问集合中的元素。Java集合框架中的迭代器提供了hasNext()next()remove()等方法。

示例代码:使用迭代器遍历ArrayList
import java.util.ArrayList;
import java.util.Iterator;public class IteratorExample {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("Java");list.add("Python");list.add("C++");Iterator<String> iterator = list.iterator();while (iterator.hasNext()) {String element = iterator.next();System.out.println(element);}}
}

集合操作

Java集合框架提供了一些集合操作方法,如addAll()retainAll()removeAll()clear()等,这些方法可以用于集合之间的操作。

示例代码:集合之间的操作
import java.util.ArrayList;
import java.util.List;public class CollectionOperationsExample {public static void main(String[] args) {List<String> list1 = new ArrayList<>();list1.add("Java");list1.add("Python");list1.add("C++");List<String> list2 = new ArrayList<>();list2.add("Python");list2.add("JavaScript");// Add all elements of list2 to list1list1.addAll(list2);System.out.println("After addAll: " + list1);// Remove all elements present in list2 from list1list1.removeAll(list2);System.out.println("After removeAll: " + list1);// Retain only elements present in list2list1.retainAll(list2);System.out.println("After retainAll: " + list1);// Clear the listlist1.clear();System.out.println("After clear: " + list1);}
}

集合的不可变性

不可变集合是指一旦创建,其内容就不能被修改的集合。Java提供了Collections.unmodifiableList()Collections.unmodifiableSet()Collections.unmodifiableMap()等方法来创建不可变集合。

示例代码:创建不可变集合
import java.util.Collections;
import java.util.List;
import java.util.ArrayList;public class UnmodifiableCollectionsExample {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("Java");list.add("Python");list.add("C++");// Create an unmodifiable listList<String> unmodifiableList = Collections.unmodifiableList(list);// This will throw an UnsupportedOperationExceptiontry {unmodifiableList.add("Scala");} catch (UnsupportedOperationException e) {System.out.println("Cannot modify unmodifiable list");}// Accessing elements is allowedSystem.out.println("Element at index 1: " + unmodifiableList.get(1));}
}

序列化

Java集合框架中的一些实现支持序列化,这意味着集合可以被写入到文件或通过网络传输。要使集合可序列化,集合中的元素也必须是可序列化的。

示例代码:集合的序列化
import java.io.*;
import java.util.*;public class SerializationExample {public static void main(String[] args) throws IOException, ClassNotFoundException {ArrayList<String> list = new ArrayList<>();list.add("Java");list.add("Python");list.add("C++");// Write the list to a fileObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("list.ser"));out.writeObject(list);out.close();// Read the list from the fileObjectInputStream in = new ObjectInputStream(new FileInputStream("list.ser"));@SuppressWarnings("unchecked")ArrayList<String> deserializedList = (ArrayList<String>) in.readObject();in.close();System.out.println("Deserialized List: " + deserializedList);}
}

结语

Java集合框架不仅提供了基本的集合操作,还包含了丰富的高级特性,如迭代器模式、集合操作、不可变集合和序列化等。这些特性使得Java集合框架成为一个功能强大且灵活的工具,能够帮助开发者高效地处理数据集合。


整理不易,请点赞收藏关注

相关文章:

  • 【栈】Leetcode 71. 简化路径【中等】
  • 美团Java社招面试题真题,最新面试题
  • Srping 历史
  • ROS学习笔记(16):夹缝循迹
  • 类 和 对象(二)
  • 分享10个国内可以使用的GPT中文网站
  • 工业4.0 企业级云MES全套源码,支持app、小程序、H5、台后管理端
  • 四川汇聚荣科技有限公司好不好?
  • Day6 LeedCode: 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和
  • 关于软件设计模式的理解
  • HQL面试题练习 —— 合并数据
  • [Python]pyenv 环境配置
  • Selenium 库的爬虫实现
  • Host头攻击-使用加密和身份验证机制
  • git分支常用命令
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • angular组件开发
  • ECMAScript入门(七)--Module语法
  • FastReport在线报表设计器工作原理
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • java小心机(3)| 浅析finalize()
  • js继承的实现方法
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • mysql innodb 索引使用指南
  • Rancher-k8s加速安装文档
  • springboot_database项目介绍
  • spring学习第二天
  • SSH 免密登录
  • ubuntu 下nginx安装 并支持https协议
  • 编写高质量JavaScript代码之并发
  • 大型网站性能监测、分析与优化常见问题QA
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 简单基于spring的redis配置(单机和集群模式)
  • 面试遇到的一些题
  • 排序算法之--选择排序
  • 微信开放平台全网发布【失败】的几点排查方法
  • 微信小程序--------语音识别(前端自己也能玩)
  • 由插件封装引出的一丢丢思考
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 正则学习笔记
  • ionic入门之数据绑定显示-1
  • 从如何停掉 Promise 链说起
  • 积累各种好的链接
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • 正则表达式-基础知识Review
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • #Datawhale AI夏令营第4期#AIGC方向 文生图 Task2
  • #window11设置系统变量#
  • (2)leetcode 234.回文链表 141.环形链表
  • (2020)Java后端开发----(面试题和笔试题)
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (libusb) usb口自动刷新
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (三)elasticsearch 源码之启动流程分析