黑馬教程強化day2-1

目錄

  • 一、Set集合
    • 1.Set集合特點
    • 2.Set集合分類
    • 3.hashSet底層原理:(基于哈希表存儲數據的)
      • 代碼演示
    • 5.hashSet集合元素的去重操作(有些情況搞不動)
      • 代碼演示
    • 6.LinkedHashSet的底層原理(不常用,所以沒有代碼演示)
    • 7.TreeSet的底層原理
      • 代碼演示

一、Set集合

1.Set集合特點

無序:添加數據的順序和獲取出的數據順序不一致;不重復;不索引。

2.Set集合分類

  • Hashset:無序、不重復、無索引
  • LinkedHashSet:有序、不重復、無索引
  • TreeSet:排序(從小到大派、不重復、無索引

注意:Set常用到的方法,基本上就是Collection提供的,自己幾乎沒有額外新增一些常用功能。

3.hashSet底層原理:(基于哈希表存儲數據的)

(1)哈希值:就是一個int類型的隨機值,java中每個對象都有一個哈希值。java中的所有對象,都可以調用Object類提供的hashCode方法,返回該對象的哈希值。
格式:

public  int hashCode():

(2)對象哈希值的特點:

  • 同一個對象多次調用hashCode()方法返回的哈希值是相同的。
  • 不同的對象,它們的哈希值大概率不相等,但也有可能會相等(哈希碰撞).

(3)哈希表:

  • JDK8之前:哈希表=數組+鏈表
  • JDK8開始:哈希表=數組+鏈表+紅黑樹
  • 哈希表是一種增刪改查數據,性能都比較好的數據結構。

(4)過程:(jDK8之前)

  • 1.使用HashSet創建一個默認長度為16的數組,默認加載因子為0.75,數組名table。(注意:ArrayList創建的長度是10)
  • 2.使用元素的哈希值對數組的長度做運算計算出應存入的位置。
  • 3.判斷當前位置是否為null,如果是null直接存入
  • 4.如果不為null,表示有元素,則調用equals方法比較,相等,不存;不相等,存入;
  • 注意:JDK8之前,新元素存入數組,占老元素位置,老元素掛下面;JDK8之后,新元素直接掛在老元素下面。
  • 5.如果存入的數據超過16*0.75,就會擴容為原來的2倍。
  • JDK8之后,當鏈表長度超過8,且數組長度》=64時,自動將鏈表轉成紅黑樹。

紅黑樹:就是可以自平衡的二叉樹,紅黑樹是一種增刪改查數據性能相對較好的結構。

代碼演示

package com.item.demo1hashset;import java.util.*;
public class SetDemo1 {public static void main(String[] args) {Set<String> set =new HashSet<>();//一行經典的代碼set.add("java");set.add("java");set.add("鴻蒙");set.add("鴻蒙");set.add("電商設計");set.add("電商設計");set.add("新媒體");set.add("大數據");System.out.println(set);//[java, 新媒體, 鴻蒙, 電商設計, 大數據]System.out.println("============");Set<String> set1 =new LinkedHashSet<>();set1.add("java");set1.add("java");set1.add("鴻蒙");set1.add("鴻蒙");set1.add("電商設計");set1.add("電商設計");set1.add("新媒體");set1.add("大數據");System.out.println(set1);//[java, 鴻蒙, 電商設計, 新媒體, 大數據]System.out.println("============");Set<Double> set2 =new TreeSet<>();//一行經典的代碼set2.add(5.1);set2.add(5.1);set2.add(1.0);set2.add(2.0);set2.add(1.0);set2.add(3.0);set2.add(2.0);set2.add(5.4);System.out.println(set2);//[1.0, 2.0, 3.0, 5.1, 5.4]System.out.println("=============");String s1="acd";String s2="abc";System.out.println(s1.hashCode());//96386System.out.println(s1.hashCode());//96386System.out.println(s2.hashCode());//96354System.out.println(s2.hashCode());//96354}
}

5.hashSet集合元素的去重操作(有些情況搞不動)

需求:
創建一個存儲學生對象的集合,存儲多個學生對象,要求:多個學生對象的成員變量值相同時,我們就認為是同一個對象,要求只保留一個。
分析:
1.定義學生類,創建HashSet集合對象,創建學生對象。
2.把學生添加到集合。
結論:如果希望Set集合認為2個內容一樣的對象是重復的,必須重寫對象的hashCode()和equals()方法

代碼演示

主類代碼:

package com.item.demo1hashset;
import java.util.*;
public class SetDemo2 {public static void main(String[] args) {Student s1 = new Student("小王", 18, "北京", "123456");Student s2 = new Student("小李", 19, "北京", "987654");Student s3 = new Student("小王", 18, "北京", "123456");Student s4 = new Student("小李", 189, "北京", "987654");Set<Student> set = new HashSet<Student>();set.add(s1);set.add(s2);set.add(s3);set.add(s4);System.out.println(set);//在沒有寫equals和hashcode方法時,沒有去重!!!,因為這些在java里面每次創建一個新的對象,則地址不一樣,存入也不一樣。}
}

Student類代碼:

package com.item.demo1hashset;import java.util.Objects;public class Student {private String name;private int age;private String address;private String phone;public Student() {}public Student(String name, int age, String address, String phone) {this.name = name;this.age = age;this.address = address;this.phone = phone;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}//這里寫入equals和hashCode方法@Overridepublic boolean equals(Object o) {//1.如果自己和自己比返回trueif (this == o) return true;//2.如果o為空或者o不是Student類型返回falseif (o == null || getClass() != o.getClass()) return false;//3.將o轉換成Student類型Student student = (Student) o;//4.比較屬性是否相同return age == student.age && Objects.equals(name, student.name) && Objects.equals(address, student.address) && Objects.equals(phone, student.phone);}@Overridepublic int hashCode() {return Objects.hash(name, age, address, phone);}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", address='" + address + '\'' +", phone='" + phone + '\'' +'}'+"\n";}
}

6.LinkedHashSet的底層原理(不常用,所以沒有代碼演示)

依然是基于哈希表(數組、鏈表、紅黑樹)實現的。
但是,它的每個元素都額外的多了一個雙鏈表的機制記錄它前后元素的位置。

7.TreeSet的底層原理

基于紅黑樹實現的排序
注意:
1.對于數值類型:Integer,Double,默認按照數值本身的大小進行升序排序
2.對于字符串類型,默認按照首字符的編號升序排序
3.對于自定義類型如Student對象,TreeSet默認是無法直接排序的。
解決方法:
1.對象類實現一個Comparable比較接口,重寫compare方法,指定大小比較規則。
2.public TreeSet(Comparator c)集合自帶比較器Comparator對象,指定比較規則。

代碼演示

主類代碼:

package com.item.demo1hashset;import java.util.*;
public class SetDemo3 {public static void main(String[] args){Set<Teacher> teachers1=new TreeSet<>();teachers1.add(new Teacher("小王", 18,3245.2));teachers1.add(new Teacher("小李", 19,3345.3));teachers1.add(new Teacher("小孫", 20,3609.4));teachers1.add(new Teacher("小張", 18,2780.3));System.out.println(teachers1);//不修改就無法去重//解決方法2:Set<Teacher> teachers=new TreeSet<>(new Comparator<Teacher>() {@Overridepublic int compare(Teacher o1, Teacher o2) {return Double.compare(o2.getSalary(), o1.getSalary());//降序}});//繼續簡化//Set<Teacher> teachers=new TreeSet<>((o1, o2)->Double.compare(o2.getSalary(), o1.getSalary()));teachers.add(new Teacher("小王", 18,3245.2));teachers.add(new Teacher("小李", 19,3345.3));teachers.add(new Teacher("小孫", 20,3609.4));teachers.add(new Teacher("小張", 18,2780.3));System.out.println(teachers);//解決方法//1,對象類實現一個Comparable比較接口,重寫compare方法,指定大小比較規則。//2.public TreeSet(Comparator c)集合自帶比較器Comparator對象,指定比較規則。//解決方法2:Set<Teacher> teachers2=new TreeSet<>();teachers2.add(new Teacher("小王", 18,3245.2));teachers2.add(new Teacher("小李", 19,3345.3));teachers2.add(new Teacher("小孫", 20,3609.4));teachers2.add(new Teacher("小張", 18,2780.3));System.out.println(teachers);}
}

Teacher類代碼:

package com.item.demo1hashset;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Teacher implements Comparable<Teacher>{private String name;private int age;private double salary;@Overridepublic String toString() {return "Teacher{" +"name='" + name + '\'' +", age=" + age +", salary=" + salary +'}'+"\n";}//解決方法1:重寫方法,比較兩個對象的大小@Overridepublic int compareTo(Teacher o) {//按照年齡升序return this.getAge()-o.getAge();}
}

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

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

相關文章

【實習總結】C++ 通過pugi::xml庫對xml文件進行操作

目錄 相關背景 pugi::xml簡概 將配置信息寫入xml文件 讀取xml文件中的配置信息 相關背景 當我們需要將某些配置信息寫入項目目錄下的xml文件&#xff0c;或者再程序啟動時&#xff0c;加載項目下已有的的配置信息&#xff08;.xml&#xff09;&#xff0c;此時&#xff0c;我…

Linux文件回收機制:安全刪除文件不怕誤刪

Linux文件回收機制&#xff1a;安全刪除文件不怕誤刪 文章目錄 Linux文件回收機制&#xff1a;安全刪除文件不怕誤刪一、Linux默認沒有“回收站”&#xff1f;二、打造你自己的Linux回收站1. 建立回收站目錄2. 創建軟刪除命令remove3. 定時清理回收站4. 替換rm命令5. 完整腳本 …

數據結構排序

目錄 1、插入排序 2、希爾排序 3、堆排序 4、直接選擇排序 5、快排 6、歸并排序 補&#xff1a;計數排序 1、插入排序 void InsertSort(int* arr, int n) {int i 0;for (int i 0; i 1 < n; i){int end i;int tmp arr[end 1];while (end > 0){if (arr[end] &…

Spring聲明式事務生效是有條件滴!

在日常工作中&#xff0c;經常使用Transactional 注解進行事務的聲明&#xff0c;但如果發現事務未生效&#xff0c;可以從下面幾個方面進行排查。 常見失效場景總結 場景原因解決方案內部方法調用繞過了Spring代理注入自身或使用AopContextprivate方法AOP無法增強改為public方…

Code Composer Studio快捷鍵

文本編輯 編輯、查找、替換功能快捷鍵 功能快捷鍵撤銷CutZ重做CutY剪切CtrlX復制CtrlC粘貼CtrlV刪除Delete全選CtrlA代碼塊選中AltShiftA查找、替換Ctrl F查找下一個匹配的字符串CtrlK查找上一個匹配的字符串CtrlShiftK查看接口注釋&#xff08;文檔&#xff09;F2查看函數幫…

從認識AI開始-----生成對抗網絡(GAN):通過博弈機制,引導生成

前言 生成對抗網絡&#xff08;GAN&#xff09;是lan J. Goodfellow團隊在2014年提出的生成架構&#xff0c; 該架構自誕生起&#xff0c;就產生了很多的話題&#xff0c;更是被稱為生成對抗網絡是“新世紀以來機器學習領域內最有趣的想法”。如今&#xff0c;基于生成對抗網絡…

限流算法java實現

參考教程&#xff1a;2小時吃透4種分布式限流算法 1.計數器限流 public class CounterLimiter {// 開始時間private static long startTime System.currentTimeMillis();// 時間間隔&#xff0c;單位為msprivate long interval 1000L;// 限制訪問次數private int limitCount…

Maven 構建性能優化深度剖析:原理、策略與實踐

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家&#xff0c;歷代文學網&#xff08;PC端可以訪問&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移動端可微信小程序搜索“歷代文學”&#xff09;總架構師&#xff0c;15年工作經驗&#xff0c;精通Java編…

JS手寫代碼篇---手寫深拷貝

17、深拷貝 深拷貝與淺拷貝最大的不同就是對象的屬性是嵌套對象&#xff0c;會新建一個對象 步驟&#xff1a; 判斷是否為對象判斷是否為i數組或者對象&#xff0c;給新的有個容器遍歷循環&#xff0c;如果是對象要遍歷循環&#xff0c;采用遞歸 function deepCopy(obj){// …

【react實戰】如何實現監聽窗口大小變化

在日常開發場景中&#xff0c;監聽窗口變化是一個比較常見又很重要的業務功能&#xff0c;其實實現起來也很簡單&#xff0c;今天就來記錄一下具體的實現以及注意事項。 實現思路 在 React 中&#xff0c;可以通過監聽 window 的 resize 事件來檢測可視區域&#xff08;viewp…

AVCap視頻處理成幀和音頻腳本

###############處理原視頻&#xff0c;使其格式和原數據一樣 import os import cv2 import subprocess import json from PIL import Image from pydub import AudioSegmentimport sys import shutil # &#x1f539; 第一步&#xff1a;強制檢測并設置FFmpeg路徑 &#x1f5…

數據冗余對企業運營的隱性成本

從客戶管理到供應鏈優化&#xff0c;再到市場分析&#xff0c;數據無處不在&#xff0c;數據已成為企業運營的核心驅動力。然而&#xff0c;隨著企業IT系統的多樣化和數據量的激增&#xff0c;數據冗余&#xff08;Data Redundancy&#xff09;問題逐漸浮出水面&#xff0c;成為…

HTML原生日期插件增加周次顯示

<div id="app" class="box box-info" style="border-top-color:white;"><!-- // 日期部分 --><div class="date-picker-container" style="position: relative; max-width: 200px;"><!-- 日期輸入框 -…

滲透測試PortSwigger Labs:遭遇html編碼和轉義符的反射型XSS

1 處是我們輸入的標簽被服務器 html 編碼后返回&#xff0c;被瀏覽器當作字符串顯示出來&#xff0c;無法執行 javascript 2 處是唯一能控制的地方&#xff0c;正好在script標簽范圍內&#xff0c;可以嘗試構造 依然存在轉移單引號&#xff0c;我們輸入轉義符\讓服務器添加的轉…

Ansible 錯誤處理:確保高效自動化

當 Ansible 收到命令的非零返回碼或模塊故障時,默認情況下,它會停止在該主機上的執行,并在其他主機上繼續執行。但是,在某些情況下,您可能需要不同的行為。有時非零返回碼表示成功。有時您希望一臺主機上的故障導致所有主機上的執行停止。Ansible 提供了處理這些情況的工具…

【無標題】NP完全問題的拓撲對偶統一解法 ——四色問題到P=NP的普適框架

NP完全問題的拓撲對偶統一解法 ——四色問題到PNP的普適框架 **摘要** 本文提出基于**拓撲膨脹-收縮對偶性**的計算理論框架&#xff0c;突破傳統NP完全性理論局限。通過將離散組合問題轉化為連續幾何問題&#xff0c;并引入規范場量子求解機制&#xff0c;實現四色問題、子…

【Zephyr 系列 19】打造 BLE 模塊完整 SDK:AT 命令系統 + 狀態機 + NVS + OTA 一體化構建

??關鍵詞:Zephyr、BLE 模塊、SDK 構建、AT 命令框架、有限狀態機、Flash 配置、MCUboot OTA ??面向讀者:希望將 BLE 項目標準化、封裝化、支持量產使用的開發團隊與架構師 ??預計字數:5500+ 字 ?? 背景與目標 在完成多個 BLE 功能模塊后,一個企業級產品往往需要:…

機器學習核心概念速覽

機器學習基本概念 有監督學習分類、回歸無監督學習聚類、降維 一維數組 import numpy as np data np.array([1,2,3,4,5]) print(data) print(data.shape) print(len(data.shape))[1 2 3 4 5] (5,) 1二維數組 data2 np.array([[1,2,3],[4,5,6]]) print(data2) print(data2…

在 Java 中實現一個標準 Service 接口,并通過配置動態選擇具體實現類供 Controller 調用

在 Java 中實現一個標準 Service 接口&#xff0c;并通過配置動態選擇具體實現類供 Controller 調用&#xff0c;是解耦和靈活擴展的常見設計模式。 需求分析 當你需要開發一個需要靈活切換業務實現的系統&#xff0c;比如不同環境使用不同策略&#xff08;如測試環境用Mock實…

input+disabled/readonly問題

背景&#xff1a; vue2elementui <el-input v-model"inputForm.projectName" class"input-font" :disabled"projectDisabled" placeholder"請選擇" :readonly"isReadonly"><el-button slot"append"…