首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 集合框架經典面試實戰題:去重、隨機生成、Map 對應與綜合應用

     編輯:Java 綜合教學

題目一:生成 10 個長度 10、字符互不重復、字符串互不重復的隨機字符串

思路拆解

  1. 構建字符池:a-z、A-Z、0-9 共 62 個字符 → ArrayList<Character> 支持隨機索引。
  2. 單字符串去重:用 HashSet<Character> 存放字符,size() < 10 循環隨機取字符池元素 add() 自動去重。
  3. 多字符串去重:用 HashSet<String> 存放生成的字符串,size() < 10 循環調用單字符串生成方法。
  4. 轉 List 返回:new ArrayList<>(hashSet) 保證順序性 (HashSet 無序)。

核心代碼

public static ArrayList<Character> buildCharPool() {
    ArrayList<Character> pool = new ArrayList<>();
    for (char c = 'a'; c <= 'z'; c++) pool.add(c);
    for (char c = 'A'; c <= 'Z'; c++) pool.add(c);
    for (char c = '0'; c <= '9'; c++) pool.add(c);
    return pool;
}

public static String genUniqueStr(ArrayList<Character> pool, int len) {
    Set<Character> set = new HashSet<>();
    while (set.size() < len) {
        set.add(pool.get((int) (Math.random() * pool.size())));
    }
    StringBuilder sb = new StringBuilder();
    set.forEach(sb::append);
    return sb.toString();
}

public static List<String> genUniqueStrs(int count, int len) {
    ArrayList<Character> pool = buildCharPool();
    Set<String> set = new HashSet<>();
    while (set.size() < count) set.add(genUniqueStr(pool, len));
    return new ArrayList<>(set);
}

題目二:生成 4 個 8 位數字組成、位數不重復、字符串互不重復的隨機字符串

兩種實現對比

方案核心 API優點缺點
HashSet + 隨機數HashSet<Character>、Math.random()代碼簡單、自動去重隨機碰撞概率隨長度增大而上升
StringBuilder + containsStringBuilder、contains()可控生成順序、無碰撞contains() O(n),總體 O(n²)

StringBuilder 版本

public static String genDigitStrSB(int len) {
    StringBuilder sb = new StringBuilder();
    while (sb.length() < len) {
        int digit = (int) (Math.random() * 10);
        if (!sb.toString().contains(String.valueOf(digit))) {
            sb.append(digit);
        }
    }
    return sb.toString();
}

題目三:隨機編號與商品名稱 Map 綁定 (LinkedHashMap 保序)

public static void main(String[] args) {
    String[] goods = {"可樂", "啤酒", "烤鴨", "蒼老師"};
    List<String> codes = genUniqueStrs(4, 8); // 復用題二邏輯
    Map<String, String> map = new LinkedHashMap<>(); // 保持插入順序
    for (int i = 0; i < goods.length; i++) {
        map.put(codes.get(i), goods[i]);
    }
    map.forEach((k, v) -> System.out.println(k + " : " + v));
}

核心考點總結

  1. 集合選型:去重 → HashSet;保序去重 → LinkedHashSet;排序去重 → TreeSet;鍵值綁定 → HashMap;保序鍵值 → LinkedHashMap;排序鍵值 → TreeMap。
  2. 隨機生成:Math.random() 返回 [0,1),乘以上限再強轉 int;字符池用 List 支持 get(index) 隨機訪問。
  3. 字符串拼接:循環拼接必須用 StringBuilder,避免 String += 產生大量中間對象。
  4. 泛型規範:ArrayList<Character> 而非原始類型,編譯期類型安全。

進階擴展:線程安全版本

多線程環境下替換為:

  • Collections.synchronizedSet(new HashSet<>()) 或 ConcurrentHashMap.newKeySet() (Java 8+)。
  • ThreadLocalRandom.current().nextInt(bound) 替代 Math.random() (性能更高、無競爭)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved