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

Java ArrayList集合和HashSet集合详解

ArrayList集合

概念

ArrayList是Java集合框架中的一个动态数组实现,它继承了AbstractList类并实现了List接口。ArrayList允许存储重复元素,并且维护元素的插入顺序。

创建ArrayList集合类型对象

// 创建空的ArrayList
ArrayList<String> list1 = new ArrayList<String>();// 创建带有初始容量的ArrayList
ArrayList<Integer> list2 = new ArrayList<Integer>(20);// 从其他集合创建ArrayList
List<String> existingList = Arrays.asList("A", "B", "C");
ArrayList<String> list3 = new ArrayList<String>(existingList);

<>表示集合中存储的数据类型(泛型)。想要使集合能够支持所有类型的数据(包括小数、整数、字符串等),可以使用<Object>。需要注意的是,集合类型仅支持引用类型,基本数据类型如int不可直接使用,必须通过其包装类Integer来实现。

添加数据

ArrayList<String> fruits = new ArrayList<String>();
// 添加单个元素
fruits.add("Apple");
fruits.add("Banana");// 在指定位置插入元素
fruits.add(1, "Orange");// 批量添加集合元素  
List<String> additionalFruits = Arrays.asList("Grapes", "Mango");  //先创建一个列表additionalFruits将值存在里面
fruits.addAll(additionalFruits);//再用列表中的值添加到集合的元素

访问数据

// 根据索引获取元素
String firstFruit = fruits.get(0);// 遍历ArrayList
for(String fruit : fruits) {System.out.println(fruit);
}// 使用迭代器
Iterator<String> it = fruits.iterator();
while(it.hasNext()) {System.out.println(it.next());
}

删除数据

// 根据索引删除
fruits.remove(0);// 根据对象删除
fruits.remove("Banana");// 删除所有元素
fruits.clear();// 条件删除
fruits.removeIf(fruit -> fruit.startsWith("A"));

判断集合是否为空

if(fruits.isEmpty()) {System.out.println("集合为空");
}

判断集合是否包含指定的数据

if(fruits.contains("Apple")) {System.out.println("包含苹果");
}

应用案例

// 学生成绩管理系统
ArrayList<Integer> scores = new ArrayList<Integer>();
scores.add(85);
scores.add(90);
scores.add(78);// 计算平均分
double sum = 0;
for(int score : scores) {sum += score;
}
double average = sum / scores.size();
System.out.println("平均分: " + average);

HashSet集合

概念

HashSet是Java集合框架中Set接口的一个实现,它使用哈希表存储元素。HashSet不允许重复元素,不保证元素的插入顺序,允许包含null值。

创建HashSet集合类型对象

// 创建空HashSet
HashSet<String> set1 = new HashSet<String>();// 创建带有初始容量的HashSet
HashSet<Integer> set2 = new HashSet<Integer>(20);// 从其他集合创建HashSet
List<String> list = Arrays.asList("A", "B", "C");
HashSet<String> set3 = new HashSet<String>(list);

<>表示集合中存储的数据类型(泛型)。想要使集合能够支持所有类型的数据(包括小数、整数、字符串等),可以使用<Object>。需要注意的是,集合类型仅支持引用类型,基本数据类型如int不可直接使用,必须通过其包装类Integer来实现。

添加数据

HashSet<String> colors = new HashSet<String>();
colors.add("Red");
colors.add("Green");
colors.add("Blue");// 添加重复元素会被忽略
colors.add("Red"); // 不会添加

访问数据

// HashSet没有get方法,需要遍历
for(String color : colors) {System.out.println(color);
}// 使用迭代器
Iterator<String> it = colors.iterator();
while(it.hasNext()) {System.out.println(it.next());
}

删除数据

// 删除指定元素
colors.remove("Green");// 删除所有元素
colors.clear();

判断集合是否为空

if(colors.isEmpty()) {System.out.println("集合为空");
}

判断集合是否包含指定的数据

if(colors.contains("Blue")) {System.out.println("包含蓝色");
}

HashSet集合转换为数组

// 转换为Object数组
Object[] colorArray = colors.toArray();// 转换为指定类型数组
String[] colorStringArray = colors.toArray(new String[0]);

应用案例

// 网站用户注册系统,确保用户名唯一
HashSet<String> usernames = new HashSet<String>();
usernames.add("user1");
usernames.add("user2");// 检查新用户名是否可用
String newUsername = "user1";
if(usernames.contains(newUsername)) {System.out.println("用户名已存在");
} else {usernames.add(newUsername);System.out.println("注册成功");
}

ArrayList集合和HashSet集合的异同

相同点

  1. 都是Java集合框架的一部分
  2. 都实现了Collection接口
  3. 都允许添加、删除、检查元素是否存在等基本操作
  4. 都支持迭代器遍历

不同点

特性ArrayListHashSet
允许重复元素
维护插入顺序
查找性能O(n) 线性查找O(1) 哈希查找
添加性能O(1) 末尾添加,O(n)中间插入O(1)
删除性能O(n)O(1)
内存使用更高效需要额外内存维护哈希表
元素访问通过索引只能通过遍历或迭代器
实现接口ListSet
线程安全性非线程安全非线程安全
排序支持保持插入顺序无序

选择建议

  • 如果需要维护插入顺序或允许重复元素,使用ArrayList
  • 如果需要快速查找、删除或确保元素唯一性,使用HashSet
  • 如果既需要List特性又需要Set特性,可以考虑LinkedHashSet(维护插入顺序的Set)
http://www.lqws.cn/news/464761.html

相关文章:

  • 【自动鼠标键盘控制器|支持图像识别】
  • 从代码学习深度学习 - 预训练BERT PyTorch版
  • 文本分类与聚类:让信息“各归其位”的实用方法
  • 最具有实际意义价值的比赛项目
  • CMS与G1的并发安全秘籍:如何在高并发的垃圾回收中保持正确性?
  • 【开源初探】基于 Qwen2.5VL的文档解析工具:docext
  • 【Linux-shell】探索Dialog 工具在 Shell 图形化编程中的高效范式重构
  • synchronized 和 ReentrantLock 的区别
  • 探索 Oracle Database 23ai 中的 SQL 功能
  • 团结引擎 1.5.0 更新 | OpenHarmony 平台开发体验全面升级,突破游戏类应用帧率限制
  • CertiK联创顾荣辉将于港大活动发表演讲,分享Web3安全与发展新视角
  • (LeetCode 面试经典 150 题) 80. 删除有序数组中的重复项 II (双指针、栈)
  • AI与SEO关键词协同进化
  • SQL关键字三分钟入门:INSERT INTO —— 插入数据详解
  • Armbian 开机启动点灯脚本
  • 【C++特殊工具与技术】局部类
  • 从事登高架设作业需要注意哪些安全事项?
  • 57-Oracle SQL Profile(23ai)实操
  • 内容搜索软件AnyTXT.Searcher忘记文件名也能搜,全文检索 1 秒定位文件
  • Java求职者面试指南:微服务技术与源码原理深度解析
  • Rabbitmq集成springboot,手动确认消息basicAck、basicNack、basicReject的使用
  • 在微信小程序wxml文件调用函数实现时间转换---使用wxs模块实现
  • WevServer实现:异步日志写与HTTP连接
  • Zephyr 调试实用指南:日志系统、Shell CLI 与 GDB 全面解析
  • CLion开发Qt桌面程序_git的简单使用_小团体
  • 闲庭信步使用SV搭建图像测试平台:第五课——使用task
  • pyqt logger类与界面分开
  • 从语义到推荐:大语言模型(LLM)如何驱动智能选车系统?
  • Mac电脑-Markdown编辑器-Typora
  • c++26新功能—hive容器