java登神之階之順序表

一、了解List接口

在Java中,List接口是一個非常重要的集合框架接口,它繼承自Collection接口(Collection接口繼承Iterable接口)。List接口定義了一個有序集合,允許我們存儲元素集合。并且可以根據元素的索引來訪問集合中的元素。這意味著List中的每個元素都有其固定的位置,可以通過索引來訪問和修改。

List接口的實現類有很多,其中最常用的有ArrayList和LinkedList。它們各自有不同的特點和性能表現:

ArrayList:基于動態數組的實現,隨機訪問性能很好,但在列表的開頭和中間插入、刪除元素時性能較差,因為需要移動其他元素。
LinkedList:基于鏈表的實現,在插入、刪除元素時性能較好,尤其是當這些操作發生在列表的開頭或中間時,但在隨機訪問元素時性能較差。

二、順序表

2.1 線性表

線性表是n個具有相同特征的數據元素的

有限序列。線性表是一種在實際中廣泛使用的數據結構,常見的線性表:順序表,鏈表,棧,隊列…
線性表在邏輯上時線性結構,也就是說連續的一條直線。但是在物理結構上并不一定是連續的。線性表在物理上存儲時,通常以數組和鏈式結構的形式存儲。

2.2 順序表

順序表是用一段物理地址連續的存儲單元依次存儲數據元素的線性結構,一般情況下采用數組存儲,在數組上完成增刪改查。

?粗略了解

public interface IList {//給數組增加新元素public void add(int data);//判斷數組數據是否為滿boolean isFull();// 在 pos 位置新增元素public void add(int pos, int data);// 判定是否包含某個元素public boolean contains(int toFind);// 查找某個元素對應的位置public int indexOf(int toFind);// 獲取 pos 位置的元素public int get(int pos);// 給 pos 位置的元素設為 valuepublic void set(int pos, int value);//刪除第一次出現的關鍵字keypublic void remove(int toRemove);// 獲取順序表長度public int size() ;// 清空順序表public void clear();// 打印順序表,注意:該方法并不是順序表中的方法,為了方便看測試結果給出的public void display() ;
}

細節實現?

判斷是否滿

    @Overridepublic boolean isFull() {//相等返回true;反之,返回falsereturn useSize== array.length;}

給數組增加新元素?

    public void add(int data) {//首先需要先判斷數組是否已經存滿if(isFull()){grow();}array[useSize]=data;useSize++;}

在 pos 位置新增元素

這里需要先考慮插入數組下標是否合理,所以需要自己寫一個自定義異常!

//自定義的數組下標插入異常
class PosExpection extends RuntimeException{public PosExpection(String message){super(message);}
}
//自定義的異常:判斷數組是否為空
class EmptyException extends RuntimeException{public EmptyException(String message){super(message);}
}
    //這個是私有方法,只是為了在這個類中檢查數組下標是否合理,// 所以用private修飾private void checkPos(int pos) throws PosExpection{if(pos < 0 || pos >= useSize){throw new PosExpection("數組下標異常");}}@Overridepublic void add(int pos, int data) {try {checkPos(pos);//如果插入數組下表沒問題,則判斷是否需要擴容if(isFull()){grow();}}catch (PosExpection e){System.out.println("插入數組下標不合理...");e.printStackTrace();}//這里挪動數組,將Pos下標之后的數組往后挪for (int i = useSize-1; i >=pos ; i--) {array[i+1]= array[i];}array[pos]=data;}

判定是否包含某個元素

    @Overridepublic boolean contains(int toFind) {for (int i = 0; i < useSize; i++) {if(array[i]==toFind){return true;}}return false;}

查找某個元素對應的位置

    @Overridepublic int indexOf(int toFind) {for (int i = 0; i < useSize; i++) {if(array[i]==toFind){return i;}}return 0;}

獲取 pos 位置的元素

    @Overridepublic int get(int pos) {try {checkPos(pos);return array[pos];}catch (PosExpection e){System.out.println("數組下標不合理...");e.printStackTrace();}return 0;}

給 pos 位置的元素設為 value

    public void set(int pos, int value) {try {checkPos(pos);array[pos]=value;}catch (PosExpection e){System.out.println("數組下標不合理...");e.printStackTrace();}}

刪除第一次出現的關鍵字key

    @Overridepublic void remove(int toRemove) {int pos=indexOf(toRemove);if(pos==-1){return;}for (int i = pos; i <useSize-1 ; i++) {array[i]=array[i+1];}useSize--;}

獲取順序表長度

    @Overridepublic int size() {return useSize;}

清空順序表

     // 清空順序表public void clear() {for (int i = 0; i < this.usedSize; i++) {this.elem[i] = 0;}this.usedSize = 0; // 注意有效數組長度也要清零}

打印順序表

?@Overridepublic void display() {for (int i = 0; i < useSize; i++) {System.out.print(array[i]+" ");}//這里不能for-each遍歷,// 用for-each遍歷不管數組里面有沒有數據,都會遍歷出和數組大小一樣的元素,對應下標沒有元素會用0來代替。
//        for (int x:
//             array) {
//            System.out.println(x+" ");
//        }}?

三、ArrayList類

在集合框架中,ArrayList是一個類,實現了List接口
ArrayList實現了List接口,而List接口在數據結構的角度上就是線性表的一種抽象。因此,ArrayList可以看作是順序表在Java集合框架中的一種具體實現

?

ArrayList是通過泛型的方式實現的,使用前必須先實例化。
ArrayList實現了RandomAccess接口,表明ArrayList類支持隨機訪問。
ArrayLIst實現了Cloneable接口,表明ArrayLIst支持Clone的。
ArrayLIst實現了Serializable接口,表明ArrayLIst支持可序列化。
ArrayLIst不是線程安全的,在單線程下是可以使用的。
ArrayLIst是一段連續的空間,并且可以動態擴容,是一個動態類型的線性表

ArrayLIst方法

構造方法

public static void main(String[] args) {
// ArrayList創建 ,推薦寫法 // 構造一個空的列表List<Integer> list1 = new ArrayList<>();
// 構造一個具有10個容量的列表List<Integer> list2 = new ArrayList<>(10);list2.add(1);list2.add(2);list2.add(3);
// list2.add("hello");  // 編譯失敗 , List<Integer>已經限定了 ,list2中只能存儲整形元素
// list3構造好之后 ,與list中的元素一致ArrayList<Integer> list3 = new ArrayList<>(list2);
// 避免省略類型 ,否則 :任意類型的元素都可以存放 ,使用時將是一場災難List list4 = new ArrayList();list4.add("111");list4.add(100);
}

?常用方法

?

public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("JavaSE");list.add("JavaWeb");list.add("JavaEE");list.add("JVM");list.add("測試課程");System.out.println(list);
// 獲取list中有效元素個數System.out.println(list.size());
// 獲取和設置index位置上的元素 ,注意index必須介于[0, size)間System.out.println(list.get(1));list.set(1, "JavaWEB");System.out.println(list.get(1));
// 在list的index位置插入指定元素 ,index及后續的元素統一往后搬移一個位置list.add(1, "Java數據結構");System.out.println(list);
// 刪除指定元素 ,找到了就刪除 ,該元素之后的元素統一往前搬移一個位置list.remove("JVM");System.out.println(list);
// 刪除list中index位置上的元素 ,注意index不要超過list中有效元素個數,否則會拋出下標越界異常list.remove(list.size() - 1);System.out.println(list);
// 檢測list中是否包含指定元素 ,包含返回true ,否則返回falseif (list.contains("測試課程")) {list.add("測試課程");}
// 查找指定元素第一次出現的位置:indexOf從前往后找 ,lastIndexOf從后往前找list.add("JavaSE");System.out.println(list.indexOf("JavaSE"));System.out.println(list.lastIndexOf("JavaSE"));
// 使用list中[0, 4)之間的元素構成一個新的SubList返回,但是和ArrayList共用一個elementData數組List<String> ret = list.subList(0, 4);System.out.println(ret);list.clear();System.out.println(list.size());
}

?ArrayList的遍歷
ArrayList 可以使用三方方式遍歷: for循環+下標、foreach、使用迭代器

public static void main(String[] args) {List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);
// 使用下標+for遍歷for (int i = 0; i < list.size(); i++) {System.out.print(list.get(i) + " ");}System.out.println();
// 借助foreach遍歷for (Integer integer : list) {System.out.print(integer + " ");}System.out.println();Iterator<Integer> it = list.listIterator();while (it.hasNext()) {System.out.print(it.next() + " ");}System.out.println();
}

ArrayList的擴容機制?

ArrayList是一個動態類型的順序表,即:在插入元素的過程中會自動擴容。以下是ArrayList源碼中擴容方式:
源碼理解:

Object[] elementData;  // 存放元素的空間
private static ? nal
Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};  // 默認空間 private static ? nalint DEFAULT_CAPACITY = 10;  // 默認容量大小public boolean add(E e) {ensureCapacityInternal(size + 1);  // Increments modCount!! elementData[size++] = e;return true;
}private void ensureCapacityInternal(int minCapacity) {ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}private static int calculateCapacity(Object[] elementData, int minCapacity) {if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {return Math.max(DEFAULT_CAPACITY, minCapacity);}return minCapacity;
}private void ensureExplicitCapacity(int minCapacity) {modCount++;// over?ow-conscious codeif (minCapacity - elementData.length > 0) grow(minCapacity);
}private static ? nalint
MAX_ARRAY_SIZE =Integer.MAX_VALUE -8;private void grow(int minCapacity) {
// 獲取舊空間大小int oldCapacity = elementData.length;
// 預計按照1.5倍方式擴容int newCapacity = oldCapacity + (oldCapacity >> 1);
// 如果用戶需要擴容大小 超過 原空間1.5倍 ,按照用戶所需大小擴容if (newCapacity - minCapacity < 0)newCapacity = minCapacity;
// 如果需要擴容大小超過MAX_ARRAY_SIZE ,重新計算容量大小if (newCapacity - MAX_ARRAY_SIZE > 0)newCapacity = hugeCapacity(minCapacity);
// 調用copyOf擴容elementData = Arrays.copyOf(elementData, newCapacity);
}private static int hugeCapacity(int minCapacity) {
// 如果minCapacity小于0 ,拋出OutOfMemoryError異常if (minCapacity < 0)throw new OutOfMemoryError();return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;
}

【總結】

  1. 檢測是否真正需要擴容,如果是調用grow準備擴容
  2. 預估需要庫容的大小
    初步預估按照1.5倍大小擴容
    如果用戶所需大小超過預估1.5倍大小,則按照用戶所需大小擴容 。
    真正擴容之前檢測是否能擴容成功,防止太大導致擴容失敗
  3. 使用copyOf進行擴容

?

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

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

相關文章

redux_舊版本

reduxjs/toolkit&#xff08;RTK&#xff09;是 Redux 官方團隊推出的一個工具集&#xff0c;旨在簡化 Redux 的使用和配置。它于 2019 年 10 月 正式發布&#xff0c;此文章記錄一下redux的舊版本如何使用&#xff0c;以及引入等等。 文件目錄如下&#xff1a; 步驟 安裝依…

MySQL:SQL優化實際案例解析(持續更新)

文章目錄 一、MySQL&#xff1a;SQL優化1、時間格式化問題&#xff08;字符串&#xff09;2、in/inner join的問題 一、MySQL&#xff1a;SQL優化 1、時間格式化問題&#xff08;字符串&#xff09; -- 優化前 SELECT * FROM test_table WHERE date_format( begin_time, %Y-%…

【含文檔+PPT+源碼】基于Python的美食數據的設計與實現

項目介紹 本課程演示的是一款基于Python的美食數據分析系統&#xff0c;主要針對計算機相關專業的正在做畢設的學生與需要項目實戰練習的 Java 學習者。 包含&#xff1a;項目源碼、項目文檔、數據庫腳本、軟件工具等所有資料 帶你從零開始部署運行本套系統 該項目附帶的源碼…

vue調整表格樣式之深度修改

舉例&#xff1a; <div class"grid-item"><h3>日數據</h3><el-table :data"dailyData" v-loading"loading"><el-table-column label"銷售姓名" align"center" prop"salesName" />…

【Go每日一練】統計字符出現的次數

&#x1f47b;創作者&#xff1a;丶重明 &#x1f47b;創作時間&#xff1a;2025年3月9日 &#x1f47b;擅長領域&#xff1a;運維 目錄 1.&#x1f636;?&#x1f32b;?題目&#xff1a;統計字符出現的次數2.&#x1f636;?&#x1f32b;?代碼中可用的資源3.&#x1f636;…

uniapp在APP平臺(Android/iOS)選擇非媒體文件

TOC 背景 在我們APP開發過程中&#xff0c;經常會有這樣一個需求場景&#xff1a;從手機中選擇文件然后進行上傳&#xff0c;這些文件主要分為兩類&#xff0c;媒體文件和非媒體文件。而媒體文件選擇在APP平臺我們可以使用uni.chooseImage和uni.chooseVideo這兩個API來實現。…

【eNSP實戰】配置交換機端口安全

拓撲圖 目的&#xff1a;讓交換機端口與主機mac綁定&#xff0c;防止私接主機。 主機PC配置不展示&#xff0c;按照圖中配置即可。 開始配置之前&#xff0c;使用PC1 ping 一遍PC2、PC3、PC4、PC5&#xff0c;讓交換機mac地址表刷新一下記錄。 LSW1查看mac地址表 LSW1配置端…

卡爾曼濾波算法從理論到實踐:在STM32中的嵌入式實現

摘要&#xff1a;卡爾曼濾波&#xff08;Kalman Filter&#xff09;是傳感器數據融合領域的經典算法&#xff0c;在姿態解算、導航定位等嵌入式場景中廣泛應用。本文將從公式推導、代碼實現、參數調試三個維度深入解析卡爾曼濾波&#xff0c;并給出基于STM32硬件的完整工程案例…

Redis----大key、熱key解決方案、腦裂問題

文章中相關知識點在往期已經更新過了&#xff0c;如果有友友不理解可翻看往期內容 出現腦裂問題怎么保證集群還是高可用的 什么是腦裂問題 腦裂說的就是當我們的主節點沒有掛&#xff0c;但是因為網絡延遲較大&#xff0c;然后和主節點相連的哨兵通信較差&#xff0c;之后主…

python總結(3)

創建自定義類 終于要創建自定義類了!下面是一個簡單的示例: class Person:def set_name(self, name):self.name namedef get_name(self):return self.namedef greet(self):print("Hello, world! Im {}.".format(self.name))這個示例包含三個方法定義&#xff0c;它…

word畢業論文“et al.”替換為“等”——宏

Sub 中文參考文獻改等()中文參考文獻改等 宏Selection.Find.ClearFormattingSelection.Find.Replacement.ClearFormattingWith Selection.Find.Text "([一-龥], )et al.".Replacement.Text "\1等.".Forward True.Wrap wdFindContinue.Format False.Ma…

網絡編程-----服務器(多路復用IO 和 TCP并發模型)

一、單循環服務器模型 1. 核心特征 while(1){newfd accept();recv();close(newfd);}2. 典型應用場景 HTTP短連接服務&#xff08;早期Apache&#xff09;CGI快速處理簡單測試服務器 3. 綜合代碼 #include <stdio.h> #include <sys/types.h> /* See NO…

typora高亮方案+鼠標側鍵一鍵改色

引言 在typora里面有一個自定義的高亮, <mark></mark>>但是單一顏色就太難看了, 我使用人工智能, 搜索全網藝術家, 匯集了幾種好看的格式,并且方便大家側鍵一鍵 調用, 是不是太方便啦 ! 示例 午夜模式 春意盎然 深海藍調 石墨文檔 秋日暖陽 蜜桃宣言 使用方法 …

swift -(5) 匯編分析結構體、類的內存布局

一、結構體 在 Swift 標準庫中&#xff0c;絕大多數的公開類型都是結構體&#xff0c;而枚舉和類只占很小一部分 比如Bool、 Int、 Double、 String、 Array、 Dictionary等常見類型都是結構體 ① struct Date { ② var year: Int ③ var month: Int ④ …

從零開始學機器學習——初探分類器

首先給大家介紹一個很好用的學習地址:https://cloudstudio.net/columns 在上一節中,我們已經完成了對所有經過均衡和清洗的菜品數據的準備工作。接下來,我們將考慮使用多種算法,也就是不同的分類器,來構建模型。我們將利用這個數據集和各種分類器,基于一組特定的配料,預…

黑色RGB是什么

>好的&#xff0c;用戶現在問的是“黑色rgb是什么”。我需要先理解用戶的問題。之前用戶在使用MATLAB調整網格線顏色時&#xff0c;可能看到了默認顏色是黑色&#xff0c;或者之前我提到過默認顏色是[0.15 0.15 0.15]&#xff0c;而用戶可能現在想知道黑色的RGB值具體是什么…

做到哪一步才算精通SQL

做到哪一步才算精通SQL-Structured Query Language 數據定義語言 DDL for StructCREATE&#xff1a;用來創建數據庫、表、索引等對象ALTER&#xff1a;用來修改已存在的數據庫對象DROP&#xff1a;用來刪除整個數據庫或者數據庫中的表TRUNCATE&#xff1a;用來刪除表中所有的行…

《深度解析DeepSeek-M8:量子經典融合,重塑計算能效格局》

在科技飛速發展的今天&#xff0c;量子計算與經典算法的融合成為了前沿領域的焦點。DeepSeek-M8的“量子神經網絡混合架構”&#xff0c;宛如一把鑰匙&#xff0c;開啟了經典算法與量子計算協同推理的全新大門&#xff0c;為諸多復雜問題的解決提供了前所未有的思路。 量子計算…

解決電腦問題(2)——主板問題

當電腦主板出現問題時&#xff0c;可以嘗試以下解決方法&#xff1a; 外觀檢查與清潔 檢查硬件連接&#xff1a;仔細查看主板上的各種硬件連接&#xff0c;包括 CPU、內存、顯卡、硬盤、電源等的連接線是否松動或損壞。確保所有插頭都牢固地插入相應的插槽中&#xff0c;如有松…

Java 大視界 -- Java 大數據在智能家居能源管理與節能優化中的應用(120)

&#x1f496;親愛的朋友們&#xff0c;熱烈歡迎來到 青云交的博客&#xff01;能與諸位在此相逢&#xff0c;我倍感榮幸。在這飛速更迭的時代&#xff0c;我們都渴望一方心靈凈土&#xff0c;而 我的博客 正是這樣溫暖的所在。這里為你呈上趣味與實用兼具的知識&#xff0c;也…