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);

<>表示集合中存储的数据类型(泛型)。想要使集合能够支持所有类型的数据(包括小数、整数、字符串等),可以使用。需要注意的是,集合类型仅支持引用类型,基本数据类型如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);

<>表示集合中存储的数据类型(泛型)。想要使集合能够支持所有类型的数据(包括小数、整数、字符串等),可以使用。需要注意的是,集合类型仅支持引用类型,基本数据类型如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. 都支持迭代器遍历

不同点

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

选择建议

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

你可能感兴趣的:(Java,java,开发语言)