天天看點

java學習(4)-一些集合類和基礎類的簡單描述

文章目錄

    • 說明
    • Scanner類
    • 匿名類對象
    • Random類
    • 對象數組
    • ArrayList
    • LinkedList
    • HashSet
    • LinkedSet
    • TreeSet
    • HashMap
    • HashTable
    • TreeMap
    • String類
    • ==和equals的差別
    • static關鍵字
    • Arrays類
    • Math類

說明

因為是個人複習java的總結,是以結構稍顯雜亂,有些語句過于口語化.

對于被标題描述誤導進入的讀者表示抱歉,已盡量修改描述至恰當.

幫助文檔中可以查找所有的api 注意學會自主檢視文檔

Scanner類

用于監視鍵盤輸入,擷取内容到程式中,也就是輸入的api

首先需要導入scanner的包

一般文法為

Scanner sc = new Scanner(System.in);
int i = sc.nextInt();
           

  具體看api 注意謹慎使用close()方法,因為sc擷取的其實是同一個final的輸入流,一旦close之後再次擷取就還是那個被關閉的狀态,就無法擷取輸入内容.

匿名類對象

其實就是在new對象的時候不對其進行指派到棧中索引的一種建立對象方式,隻是使用一次之後就不能再找到這個對象.

Random類

用來生成随機數的類,需要導入util下Random包

基本文法

Random r = new Random();
int num = r.nextInt();
           

  有正負兩種範圍,具體範圍是左閉右開的,構造方法為單個參數的時候确定的是右範圍,左範圍為0.

具體使用見api

對象數組

其實就是将對象存放進數組中,然後擷取數組中内容再調用方法.

但是數組一旦建立,長度就無法改變,是以接下來是ArrayList等更為友善的類

List Map Set Queue其實都是collection的子接口,而不是具體的實作類,具體的實作類在接口之下實作

List總共分為ArrayList,LinkedList和Vector

其中ArrayList和Vector的底層都是用數組實作,都是可變長度的數組,隻是ArrayList線程不安全,Vector線程安全但是效率相對較低

ArrayList

  ArrayList其實就是一個可變長度的數組,具體構造方法等見api 之後了解api不再提

  ArrayList可以使用泛型

  泛型就是對于集合中元素資料類型的限制,限制之後隻能往這個集合中傳入特定類型的資料.基本寫法:ArrayList list = new ArrayList<>();在jdk1.7之後可以省略右邊泛型的類型書寫

  泛型需要注意限制的類型必須是包裝類,即在包中的類對象,擁有一些方法或屬性,而不能是基本資料類型,int要使用Int

  使用之後可以直接傳入int類型資料,包裝類會自動包裝之後存儲,在輸出的時候在自動轉換成基本資料類型輸出.

  ArrayList添加元素使用的是add()方法,這個方法傳回類型是boolean,因為要判斷泛型

其中常用的方法有 get(), remove(), size().

  當直接列印ArrayList對象的時候,得到的是所有内容的集合,差別于數組列印得到的是位址

  ArrayList雖然是可變的數組,但是在使用的時候一般會先給定一個範圍,避免在擴大數組的時候造成不必要的大量的數組複制時間.

  最後需要注意ArrayList不是線程安全的,其底層其實是基于數組實作的,是以其通路的速度比較快,相比于LinkedList需要順序查找,ArrayList可以直接通路而不需要移動指針.

LinkedList

  LinkedList其實就是雙向連結清單,其組成就是有前後指向的一串連接配接資料表

  是以其查找速度不是很好,但是如果對元素進行插入的時候,其相比于ArrayList速度要快很多,ArrayList需要在插入元素的時候,移動後面受到影響的元素,而LikedList可以直接通過改變前後指向在任意位置插入元素,當然末尾插入元素的開銷兩者是一樣的.删除兩個list也是一樣的道理

Set集合包含HashSet,LinkedSet,TreeSet.

  都是不允許存在重複對象的容器,null值也隻能唯一.其中HashSet和LinkedSet是無序的,而TreeSet是通過compare()進行一個比較實作的有序

HashSet

  底層是哈希表,線程不安全

  其本質是一個哈希表來存儲的結構,對于存入的元素會進行hashcode的判斷,如果不同則認為是不同的元素,但是hash算法的設定不同,可能造成hash值相同,這時會調用equal判斷是否重複,然後對于不重複的元素存在多種方法,向後順延或者再次hash或者價值.

  因其工作原理,需要注意對于自定義類,要重寫其hashCode()進而使得該類對象具有不同的hash值,并且再重寫equal方法,這樣有助于在hash判斷出現偶然是,equal判斷兩個對象是否是你認為的相同

LinkedSet

本質上是一個按照插入順序排序的雙連結清單,底層是HashMap,線程不安全

TreeSet

其實就是一個用tree結構來維護的set,其中對象使用升序來排序,通路和周遊速度很快

需要重寫存入的自定義類對象的compareTo來實作某種方式的排序

Map分為HashMap,HashTable,TreeMap等

其實本質上是鍵值的存儲模式,鍵作為辨別控制存入,具有唯一性,而值可以任意

HashMap

  其底層的本質實際上是數組加連結清單.首先由key進行hash然後擷取到存放的位置,再對存放位置盡心連結清單組接,但是對于過長的連結清單jdk8之後會将資料存到紅黑樹中,以增加檢索速度.

  因為其查詢時,實際上是根據key直接擷取到存儲位置,然後在存儲位置周遊擷取到值,如果連結清單太長,這麼效率就會降低,就失去了原本的意義.

HashTable

其實就是對于HashMap的補充,是一個線程安全版本的集合

TreeMap

其實也是根據key來進行樹結構的存儲

對于Map的周遊一般使用entrySet()來輔助進行,因為這個函數傳回的資料是鍵值組合形式的,在周遊中有益于根據鍵擷取值.

例子如下:

Iterator it = map.entrySet().iterator();
while(it.hasNext()){
Entry e =(Entry) it.next();
System.out.println("鍵"+e.getKey () + "的值為" + e.getValue());
}
           

String類

  所有使用雙引号包含的内容都作為String類的執行個體,其效果類似char[],但是其底層是用byte[]實作的

  字元串是共享的,因為字元串是存儲在堆中的字元常量池,當重複建立的時候會指向相同的位址.其實就是把字元串看作是一個類,把所有字元串類型的資料看作是對象.又因為上面提到所有雙引号的資料都看作是String類的執行個體,可以想到其實就是其他類new對象相同的原理.雙引号這種建立對象方法就是在堆中開辟一塊區域存放String對象,而這個對象實際上存放的也是位址,因為其底層是byte[]實作的.那麼對于相同的字元串來說,他們其實就是相同的對象,是以指向的是同一個對象位址,對象位址又指向同一個byte[].

  但是需要注意,雙引号這種建立對象方式和使用String類構造方法創造對象就存在差別,雙引号的對象是存放在堆中固定的字元串常量池區域,而使用構造方法創造的對象則是存放在堆中,是以兩者即使創造的是相同的字元串内容,他們也不會指向同一個對象.

==和equals的差別

  其實很簡單,==比較的是位址值,是以堆兩個對象比較的時候,比較的是兩個對象在堆中的位址.String也是同理,對于字元串常量池中的比較也是位址,但是因為其實作方式,是以很像是比較兩個字元串的内容,其實不是.

 emsp;equals則是比較字元串中的内容,是以對于不同的對象如果擁有相同的内容也會相等.

 emsp;另外需要注意使用問題,推薦使用String常量.equals(String對象)這種方式來書寫,也就是”hello”.equals(str);因為這麼寫的話,對于調用equals方法的對象而言一定不為空.如果反過來,那麼對于對象變量而言我們有可能在書寫或者輸入的時候造成對象為空,那麼就會造成空指針異常.

static關鍵字

  就是标記類中的共享值,類所有的對象都共用同一個.

  其修飾成員變量的時候,那麼就可以達到所有對象擁有同一個變量,比如說計數變量.

  其修飾成員方法的時候,就可以達到不通過對象調用方法的效果,也是類中所有對象的操作.調用不再需要建立對象調用.

  使用過程中需要一個問題,靜态不能直接通路非靜态.可以從記憶體上可以了解,在加載一個類的時候在方法區就會加載一些類的方法和變量基本資訊但不是位址,并且會加載類的靜态變量和方法存儲在方法區中的靜态區,然後每次調用的時候都會棧中根據類在方法區找到對應靜态内容,然後進行調用.

  是以這也造成了一個問題,線程安全問題.

  且靜态不能使用this,因為靜态是類調用而不是對象調用

  靜态代碼塊就是在類當中使用static{}包裝代碼,使得這部分代碼在使用該類的時候調用唯一的一次.也就是在加載該類的時候會調用一次靜态代碼塊,但是如果再次使用這個類,因為已經加載就不會再次執行.

典型的用途就是對于靜态變量的一次指派.

Arrays類

  就是一個與數組操作有關的工具類,其中包括一些.toString() sort等方法,對數組進行快捷操作.

Math類

一些數學操作

ceil()向上取整

floor()向下取整

round()四舍五入   實際上是将原來的數字加上 0.5 後再向下取整

abs()絕對值

如有錯誤歡迎讀者批評指正!!