一、引言


1.为什么这些是 Java 基础的重点?

ArrayList、HashMap 和泛型是Java集合框架的核心组成部分,广泛应用于实际开发中。

  • ArrayList:基于动态数组实现,支持快速随机访问,适合频繁查询和遍历的场景。
  • HashMap:基于哈希表实现,提供高效的键值对存储和检索,适合快速查找和数据映射。
  • 泛型:提供类型安全,避免运行时类型转换错误,增强代码的可读性和复用性。

2.它们在实际开发中的应用场景

  • 动态数据存储:当数据量不确定且需要频繁增删时,ArrayList比数组更灵活。
  • 快速访问:通过索引直接访问元素,适合需要高频读取的场景(如缓存)。
  • 集合操作:与Collections工具类配合,实现排序、查找等操作(如排行榜列表)。

二、ArrayList 详解

1. 什么是 ArrayList?

ArrayList 是 Java 集合框架中的一个动态数组实现,属于 java.util 包。它基于数组实现,支持动态扩容和随机访问,适合频繁查询和遍历的场景,但插入和删除操作效率较低。

2.核心特性

  • 动态扩容:初始容量默认为 10,当元素数量超过当前容量时,自动扩容至原来的 1.5 倍(JDK 1.8+)。
  • 有序性:保持元素的插入顺序。
  • 允许重复元素和 null 值
  • 非线程安全:多线程环境下需手动同步或使用 Collections.synchronizedList 包装。
// 创建 ArrayList
ArrayList<String> list = new ArrayList<>();

// 添加元素
list.add("A");          // 末尾添加
list.add(1, "B");       // 指定索引插入

// 访问元素
String element = list.get(0);  // 获取索引 0 的元素

// 删除元素
list.remove(0);         // 按索引删除
list.remove("B");       // 按值删除(首次出现)

// 其他操作
int size = list.size();         // 元素数量
boolean isEmpty = list.isEmpty(); // 是否为空
list.clear();                   // 清空列表

3.与数组对比

特性 ArrayList 数组(Array)
长度 动态可变 固定
内存管理 自动扩容/缩容 手动管理

三、HashMap详解

1.什么是HashMap?

HashMap 是 Java 中基于哈希表的 Map 接口实现,用于存储键值对(key-value pairs)。它允许使用 null 键和 null 值,并且是非线程安全的。

2.常用方法

  • put(K key, V value):插入键值对。
  • get(Object key):根据键获取值。
  • remove(Object key):删除指定键的映射。
  • containsKey(Object key):检查是否包含指定键。

例子

HashMap<String, Integer> map = new HashMap<>();
map.put("apple", 10);
map.put("banana", 20);
System.out.println(map.get("apple")); // 输出 10

3.注意事项

  1. 键对象必须正确实现 hashCode() 和 equals() 方法。
  2. 初始容量和负载因子需根据实际场景调整以减少扩容开销。
  3. Java 8 后引入红黑树优化,显著提升了哈希冲突时的性能。

四、泛型详解

1.什么是泛型?

泛型(Generics)是编程语言中用于增强代码复用性和类型安全的一种机制。允许在定义类、接口或方法时使用类型参数,实际使用时再指定具体类型。泛型的主要目的是在编译时检测类型错误,减少运行时类型转换的风险。

2.泛型的优势

  • 类型安全:编译时检查类型匹配,避免运行时类型转换错误。
  • 代码复用:同一套逻辑可适用于多种数据类型,减少重复代码。
  • 可读性:明确代码中使用的数据类型,提高代码可维护性。

3.泛型的基本语法

泛型类

public class Box<T> {
    private T content;
    public void setContent(T content) {
        this.content = content;
    }
    public T getContent() {
        return content;
    }
}
  • T是类型参数,使用时可以替换为具体类型(如IntegerString)。

泛型方法

public <T> void printArray(T[] array) {
    for (T element : array) {
        System.out.println(element);
    }
}
  • 方法声明中的<T>表示泛型类型,可在方法参数和返回值中使用。

泛型接口

public interface List<T> {
    void add(T item);
    T get(int index);
}

泛型的通配符

  • ?(无界通配符):表示未知类型,例如List<?>
  • ? extends T(上界通配符):表示类型为T或其子类。
  • ? super T(下界通配符):表示类型为T或其父类。

4.泛型的限制

  • 类型擦除:Java泛型在编译后会擦除类型信息,运行时无法获取泛型的具体类型。
  • 不能实例化泛型类型:例如new T()是非法的。
  • 不能用于静态上下文:静态方法或变量不能使用类的泛型类型参数。

5.泛型的应用场景

  • 集合框架:如ArrayList<T>HashMap<K,V>
  • 工具类:通用算法或数据处理逻辑。
  • 回调接口:如Comparator<T>

五、例题与答案

1.## 练习题 1:ArrayList 去重
题目 :去除 ArrayList 中的重复元素

ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(2);
list.add(3);
list.add(3);
list.add(3);

// 去除重复后应该变成: [1, 2, 3]

答案:

package test5_21;
import java.util.ArrayList;
import java.util.HashSet;
public class test2 {
    //去除arraylist中重复的元素
    //ArrayList<Integer> list = new ArrayList<>();
    //list.add(1);
    //list.add(2);
    //list.add(2);
    //list.add(3);
    //list.add(3);
    //list.add(3);
    //
    //// 去除重复后应该变成: [1, 2, 3]
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(2);
        list.add(3);
        list.add(3);
        list.add(3);

        // 去重核心代码
        //List 元素存入 HashSet,依托集合特性自动剔除重复值
        //清空原列表原有数据
        //把去重后的元素回填回 List
        HashSet<Integer> set = new HashSet<>(list);
        list.clear();
        list.addAll(set);

        System.out.println(list);

    }
}

2.//## 练习题 2:HashMap 统计单词出现次数

//题目 :统计一句话中每个单词出现的次数

//String str = "hello java hello world java java";

 // 预期结果:

// hello 出现了 2 次

// java 出现了 3 次

// world 出现了 1 次

package test5_23;
import java.util.HashMap;
import java.util.Map;

public class test1 {
    public static void main(String[] args) {
        String str = "hello java hello world java java";
        HashMap<String, Integer> map = new HashMap<>();
        // 按空格拆分单词
        String[] words = str.split(" ");

        for (String word : words) {
            // 单词不存在默认0,存在则取值,次数+1
            int count = map.getOrDefault(word, 0);
            map.put(word, count + 1);
        }

        // 遍历输出结果
        for (Map.Entry<String,Integer> entry : map.entrySet()) {
            System.out.println(entry.getKey() + ":" + entry.getValue() + "次");
        }


    }
}

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐