set、LinkedHashSet和TreeSet的區別、Map接口常見方法、Collections 工具類使用

DAY7.2 Java核心基礎

想學習Collection、list、ArrayList、Set、HashSet部分的小伙伴可以轉到
7.1集合框架、Collection、list、ArrayList、Set、HashSet和LinkedHashSet、判斷兩個對象是否相等文章查看
在這里插入圖片描述

set集合

在set集合中,處理LinkedHashSet是有序的,TreeSet的存放也是有序的,但是二者之間的有序亦有區

LinkedHashSet:元素的存儲順序和遍歷順序是一致的

TreeSet:內部元素會按照升序的方法進行排序,無論存入元素的順序是什么,都會按照升序進行輸出

public static void main(String[] args) {TreeSet<Integer> treeSet = new TreeSet<>();treeSet.add(1);treeSet.add(5);treeSet.add(3);treeSet.add(2);treeSet.add(1);treeSet.add(9);Iterator<Integer> iterator = treeSet.iterator();while (iterator.hasNext()){System.out.println(iterator.next());}System.out.println("***********************");LinkedHashSet<Integer> linkedHashSet = new LinkedHashSet<>();linkedHashSet.add(98);linkedHashSet.add(2);linkedHashSet.add(3);linkedHashSet.add(2);linkedHashSet.add(11);linkedHashSet.add(1);for (Integer integer : linkedHashSet) {System.out.println(integer);}
}

image-20250308171510286

可以看見treeSet自動排序了,而linkedHashSet按照添加順序輸出的,但是他們兩個都去除了重復元素,驗證了Set集合元素的唯一性

TreeSet 內部會自動按照升序對元素進行排列,所以添加到 TreeSet 集合中的元素必須具備排序的功能,無法排序的對象無法添加到 TreeSet 中的。

如果傳遞的是一個不能比較的對象:

public class test {public static void main(String[] args) {TreeSet treeSet = new TreeSet<>();treeSet.add(new A(6));treeSet.add(new A(2));treeSet.add(new A(3));treeSet.add(new A(4));}
}
class A{private int num;public A(int num) {this.num = num;}
}

image-20250308171942770

就會出現異常顯示無法是實現比較的接口

Comparable 是排序接口,實習了該接口的類就具備了排序的功能,對象就可以進行排序

如果要比較我們就需要在A對象類里面實現Comparable 接口

class A implements Comparable{private int num;public A(int num) {this.num = num;}/*** A.compareTo(B)* 返回值:* 1表示A大于B* 0表示A等于B* -1表示A小于B* @param o* @return*/@Overridepublic int compareTo(Object o) {if (o instanceof A){A a = (A) o;return this.num - a.num;}return 0;}@Overridepublic String toString() {return "A{" +"num=" + num +'}';}
}
public class test {public static void main(String[] args) {TreeSet treeSet = new TreeSet<>();treeSet.add(new A(6));treeSet.add(new A(2));treeSet.add(new A(3));treeSet.add(new A(4));Iterator iterator = treeSet.iterator();while (iterator.hasNext()){System.out.println(iterator.next());}}
}

這時候輸出:

image-20250308172236488

完美解決!

Map 接口

Set List 都是Collenction的子接口,Map接口是與Collenction完全獨立的一個體系

Set 、List、Collenction都是只能操作一個元素,而Map可以操作一對數據,以Key-Value形式存在

Map接口常見方法

方法描述
int size()獲取集合長度
boolean isEmpty()判斷集合是否為空
boolean containsKey(Object key)判斷集合中是否存在某個 key 值
boolean containsValue(Object key)判斷集合中是否存在某個 value 值
V get(Object key)取出集合中 key 對應的 value
V put(K key,V value)向集合中添加一組 key-value 的元素
V remove(Object key)刪除集合中 key 對應的 value
void clear()清除集合中的所有元素
Set keySet()取出集合中所有的 key,返回一個 Set 集合
Collection values()取出集合中所有的 value,返回一個 Collection 集合
Set entrySet()將 Map 對象轉為 Set 對象
int hashCode()獲取集合的散列值
boolean equals(Object o)比較兩個集合是否相等

Map是一個接口,無法被實例化創建對象,而需要通過實現類來創建對象

HashMap:存儲無序,key不能重復,值可以重復

TreeMap:存儲有序,key不能重復,值可以重復

測試方法:

public class test {public static void main(String[] args) {testMapMethods();}public static void testMapMethods() {Map<String, Integer> map = new HashMap<>();// 測試 put 方法map.put("a", 1);map.put("b", 2);map.put("c", 3);System.out.println("插入元素后: " + map);// 測試 size 方法System.out.println("集合大小: " + map.size());// 測試 isEmpty 方法System.out.println("集合是否為空: " + map.isEmpty());// 測試 containsKey 方法System.out.println("是否包含鍵 'a': " + map.containsKey("a"));System.out.println("是否包含鍵 'd': " + map.containsKey("d"));// 測試 containsValue 方法System.out.println("是否包含值 1: " + map.containsValue(1));System.out.println("是否包含值 4: " + map.containsValue(4));// 測試 get 方法System.out.println("鍵 'a' 對應的值: " + map.get("a"));System.out.println("鍵 'd' 對應的值: " + map.get("d"));// 測試 keySet 方法Set<String> keySet = map.keySet();System.out.println("所有鍵的集合: " + keySet);// 測試 values 方法System.out.println("所有值的集合: " + map.values());// 測試 hashCode 方法System.out.println("集合的哈希碼: " + map.hashCode());// 測試 remove 方法System.out.println("刪除鍵 'a' 對應的值: " + map.remove("a"));System.out.println("刪除后: " + map);// 測試 replace 方法System.out.println("將鍵 'b' 的值替換為 4: " + map.replace("b", 4));System.out.println("替換后: " + map);// 測試 clear 方法map.clear();System.out.println("清空后: " + map);System.out.println("清空后是否為空: " + map.isEmpty());}
}

輸出:

image-20250308173640595

朋友們可以自己取嘗試調用一下這些方法

TreeMap和HashMap差不多,但是這個會根據key排序

public static void main(String[] args) {TreeMap<Integer, String> map = new TreeMap<>();map.put(3, "Three");map.put(1, "One");map.put(2, "Two");map.put(2, "Two");System.out.println(map);
}

測試:

image-20250308230937789

Collections 工具類

集合除了可以存儲數據之外,還提供了很多方法來對數據進行操作,但是這些方法都有其局限性,實際操作起來不是很方便,JDK 提供了一個工具類 Collections,專門用來操作集合,添加元素、元素排序、替換元素。

Collections 常用方法

方法描述
sort根據集合泛型對應的類實現的 Comparable 接口對集合進行排序
sort根據 Comparator 接口對集合進行排序
binarySearch查找元素在集合中的下標,要求集合元素必須是升序排列
get根據下標找到集合中的元素
reverse對集合元素的順序進行反轉
swap交換集合中指定位置的兩個元素
fill將集合中的所有元素進行替換
min返回集合中最小的元素
max返回集合中最大的元素
replaceAll將集合中的所有元素進行替換
addAll向集合中添加元素

部分代碼示例:

sort方法:

// 定義一個實現了Comparable接口的類
class Person implements Comparable<Person> {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic int compareTo(Person p) {return Integer.compare(this.age, p.age);}@Overridepublic String toString() {return "Person{name='" + name + "', age=" + age + "}";}
}public class TestSort {public static void main(String[] args) {List<Person> list = new ArrayList<>();list.add(new Person("Alice", 25));list.add(new Person("Bob", 30));list.add(new Person("Charlie", 20));Collections.sort(list); // 根據age排序System.out.println(list);}
}

輸出:

image-20250308232212807

實現compareTo方法,然后可以使得按照age排序

binarySearch (查找元素下標,要求集合升序排列)

public static void main(String[] args) {List<Integer> list = Arrays.asList(1, 3, 5, 7, 9);int index = Collections.binarySearch(list, 5); // 返回元素5的索引System.out.println("Index of 5: " + index);
}

輸出:

image-20250308232348783

get (根據下標找到集合中的元素)

public static void main(String[] args) {List<String> list = Arrays.asList("apple", "orange", "banana");String element = list.get(1); // 獲取第二個元素System.out.println("Element at index 1: " + element);
}

reverse (反轉集合順序)

public static void main(String[] args) {List<String> list = Arrays.asList("apple", "orange", "banana");Collections.reverse(list);System.out.println("Reversed list: " + list);
}

image-20250308232514150

swap (交換指定位置的兩個元素)

public static void main(String[] args) {List<String> list = Arrays.asList("apple", "orange", "banana");Collections.swap(list, 0, 2); // 交換第一個和第三個元素System.out.println("Swapped list: " + list);
}

image-20250308232546509

fill (將集合中的所有元素替換為指定值)

public static void main(String[] args) {List<String> list = new ArrayList<>(Arrays.asList("apple", "orange", "banana"));Collections.fill(list, "fruit");System.out.println("Filled list: " + list);
}

image-20250308232612322

min (返回集合中最小的元素)、max (返回集合中最大的元素)

public static void main(String[] args) {List<Integer> list = Arrays.asList(5, 3, 8, 1, 9);Integer max = Collections.max(list);Integer min = Collections.min(list);System.out.println("Maximum value: " + max);System.out.println("Minimum value: " + min);
}

image-20250308232728922

replaceAll (將集合中的所有元素替換為指定值)

public static void main(String[] args) {List<String> list = Arrays.asList("apple", "orange", "banana");Collections.replaceAll(list, "apple", "fruit");System.out.println("Replaced list: " + list);
}

image-20250308232800876

addAll (向集合中添加所有指定元素)

public static void main(String[] args) {List<String> list = new ArrayList<>();List<String> toAdd = Arrays.asList("apple", "orange", "banana");Collections.addAll(list, "grape", "peach");// 或者使用addAll方法list.addAll(toAdd);System.out.println("Added list: " + list);
}

image-20250308232830429

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/72812.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/72812.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/72812.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

windows:curl: (60) schannel: SEC_E_UNTRUSTED_ROOT (0x80090325)

目錄 1. git update-git-for-windows 報錯2. 解決方案2.1. 更新 CA 證書庫2.2. 使用 SSH 連接&#xff08;推薦&#xff09;2.3 禁用 SSL 驗證&#xff08;不推薦&#xff09; 1. git update-git-for-windows 報錯 LenovoLAPTOP-EQKBL89E MINGW64 /d/YHProjects/omni-channel-…

《深度剖析架構蒸餾與邏輯蒸餾:探尋知識遷移的差異化路徑》

在人工智能模型優化的前沿領域&#xff0c;架構蒸餾與邏輯蒸餾作為知識蒸餾的關鍵分支&#xff0c;正引領著模型小型化與高效化的變革浪潮。隨著深度學習模型規模與復雜度的不斷攀升&#xff0c;如何在資源受限的情況下&#xff0c;實現模型性能的最大化&#xff0c;成為了學術…

先序二叉樹的線索化,并找指定結點的先序后繼

#include<stdio.h> #include<stdlib.h> #define elemType char //線索二叉樹結點 typedef struct ThreadNode{ elemType data; struct ThreadNode *lchild,*rchild; int ltag,rtag;//用來判斷一個結點是否有線索 }ThreadNode,*ThreadTree; //全局變量…

螞蟻集團轉正實習大模型算法崗內推

1.負責以大模型為代表的A轉術能力的建設和優化&#xff0c;打造業界領先的A(技術系統&#xff0c;主要職責包括A系統結構設計、RAG 系統開發、大模型凱練數據構建、大模型能力評測、大模型準理效果和效率優化等 2.緊密跟蹤、探索大模型方向前沿技術&#xff0c;依托豐富目體系化…

未授權漏洞大賞

ActiveMQ未授權訪問漏洞 漏洞描述 Apache ActiveMQ是美國阿帕奇&#xff08;Apache&#xff09;軟件基金會所研發的一套開源的消息中間件&#xff0c;它支持Java消息服務、集群、Spring Framework等。 Apache ActiveMQ管理控制臺的默認管理用戶名和密碼分別為admin和admin&am…

Python包結構與 `__init__.py` 詳解

1. 什么是 __init__.py&#xff1f; __init__.py 是Python包的標識文件&#xff0c;它告訴Python解釋器這個目錄應該被視為一個包&#xff08;Package&#xff09;。這個文件可以為空&#xff0c;也可以包含初始化代碼。 1.1 基本作用 包的標識 將普通目錄轉換為Python包允許…

Web前端開發——HTML基礎下

HTML語法 一表格1.基本格式2.美化表格合并居中屬性 二表單1.input2.select3.textarea4.button5.date6.color7.checkbox8.radio9.range10.number 一表格 1.基本格式 HTML表格由<table>標簽定義 其中行由<tr>標簽定義&#xff0c;單元格由<td>定義。我們先來…

小程序事件系統 —— 33 事件傳參 - data-*自定義數據

事件傳參&#xff1a;在觸發事件時&#xff0c;將一些數據作為參數傳遞給事件處理函數的過程&#xff0c;就是事件傳參&#xff1b; 在微信小程序中&#xff0c;我們經常會在組件上添加一些自定義數據&#xff0c;然后在事件處理函數中獲取這些自定義數據&#xff0c;從而完成…

安卓設備root檢測與隱藏手段

安卓設備root檢測與隱藏手段 引言 安卓設備的root權限為用戶提供了深度的系統控制能力&#xff0c;但也可能帶來安全風險。因此&#xff0c;許多應用&#xff08;如銀行軟件、游戲和流媒體平臺&#xff09;會主動檢測設備是否被root&#xff0c;并限制其功能。這種對抗催生了ro…

如何在Ubuntu上直接編譯Apache Doris

以下是在 Ubuntu 22.04 上直接編譯 Apache Doris 的完整流程&#xff0c;綜合多個版本和環境的最佳實踐&#xff1a; 注意&#xff1a;Ubuntu的數據盤VMware默認是20G&#xff0c;編譯不夠用&#xff0c;給到50G以上吧 一、環境準備 1. 安裝系統依賴 # 基礎構建工具鏈 apt i…

vuejs相關鏈接和格式化插件推薦

vue官網&#xff1a; https://cn.vuejs.org/ 配合路由設置&#xff1a; https://router.vuejs.org/zh/guide/ element plus (vue3) | element UI (vue2)&#xff1a; https://element-plus.org/zh-CN/#/zh-CN 構建工具vite&#xff1a; https://cn.vitejs.dev/ 右鍵選擇…

IDEA中Git版本回退終極指南:Reset與Revert雙方案詳解

目錄 前言一、版本回退前置知識二、Reset方案&#xff1a;整體改寫歷史1、IDEA圖形化操作&#xff08;推薦&#xff09;1.1、查看提交歷史1.2、選擇目標版本1.3、選擇回退模式1.3.1、Soft&#xff08;推薦&#xff09;1.3.2、Mixed1.3.3、Hard&#xff08;慎用&#xff09;1.3.…

PHP并發請求優化:使用`curl_multi_select()`實現高效的多請求處理

PHP并發請求優化&#xff1a;使用curl_multi_select()實現高效的多請求處理 背景 最近在項目中遇到一個需求&#xff0c;需要從多個 1 級網站&#xff08;超過 200 個&#xff09;獲取數據&#xff0c;并且是通過 POST 請求瞬間發送到這些網站上。開始時我直接使用了 curl_ex…

【leetcode hot 100 206】反轉鏈表

解法一&#xff1a;&#xff08;頭插法&#xff09;在遍歷鏈表時&#xff0c;將當前節點的 next 指針改為指向前一個節點。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val)…

【QT】-易錯點筆記-2025-2-7

1,QList<phy_simulator*> pList;為空不能append()追加,要先new,再用 QList<phy_simulator> pList為空時,確實不能調用 append() 方法。原因很簡單,QList 是一個類對象,在 C++ 中,指針本身并不代表它指向的對象。因此,當你有一個指向 QList<phy_simulato…

AI-Deepseek + PPT

01--Deepseek提問 首先去Deepseek問一個問題&#xff1a; Deepseek的回答&#xff1a; 在汽車CAN總線通信中&#xff0c;DBC文件里的信號處理&#xff08;如初始值、系數、偏移&#xff09;主要是為了 將原始二進制數據轉換為實際物理值&#xff0c;確保不同電子控制單元&…

實驗一:在Windows 10/11下配置和管理TCP/IP

目錄 1.【實訓目標】 2.【實訓環境】 3.【實訓內容】 4.【實訓步驟】 1.【實訓目標】 1.了解網絡基本配置中包含的協議、服務、客戶端。 2.了解Windows支持的網絡協議及參數設置方法。 3.掌握TCP/IP協議的配置。 2.【實訓環境】 硬件環境&#xff1a;每人一臺計算機&a…

Java直通車系列14【Spring MVC】(深入學習 Controller 編寫)

目錄 基本概念 編寫 Controller 的步驟和要點 1. 定義 Controller 類 2. 映射請求 3. 處理請求參數 4. 調用業務邏輯 5. 返回響應 場景示例 1. 簡單的 Hello World 示例 2. 處理路徑變量和請求參數 3. 處理表單提交 4. 處理 JSON 數據 5. 異常處理 基本概念 Cont…

EA - 開源工程的編譯

文章目錄 EA - 開源工程的編譯概述筆記環境備注x86版本EABase_x86EAAssert_x86EAThread_x86修改 eathread_atomic_standalone_msvc.h原始修改后 EAStdC_x86EASTL_x86EAMain_x86EATest_x86備注備注END EA - 開源工程的編譯 概述 EA開源了‘命令與征服’的游戲源碼 嘗試編譯. 首…

一招解決Pytorch GPU版本安裝慢的問題

Pytorch是一個流行的深度學習框架&#xff0c;廣泛應用于計算機視覺、自然語言處理等領域。安裝Pytorch GPU版本可以充分利用GPU的并行計算能力&#xff0c;加速模型的訓練和推理過程。接下來&#xff0c;我們將詳細介紹如何在Windows操作系統上安裝Pytorch GPU版本。 查看是否…