国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java基礎(chǔ)(筆記)

PrototypeZ / 2937人閱讀

摘要:拆箱將包裝類型轉(zhuǎn)換為基本類型的過程。否則會拋出異常。默認(rèn)采用單鏈表解決沖突,如果鏈表長度超過,將單鏈表轉(zhuǎn)換為紅黑樹。內(nèi)部使用紅黑樹實(shí)現(xiàn),存儲映射。紅黑樹減弱了對平衡的要求,降低了保持樹平衡需要的開銷,在實(shí)際應(yīng)用中,統(tǒng)計(jì)性能超過平衡二叉樹。

引言

在學(xué)習(xí)《Java編程的邏輯》一書時(shí)記錄的一些筆記,掃清了一些Java基礎(chǔ)的知識盲區(qū),感謝作者馬俊昌老師。

數(shù)據(jù)類型
序號 數(shù)據(jù)類型 大小(位) 包裝類 默認(rèn)值 數(shù)據(jù)范圍
1 byte 8 Byte 0 -128 ~ 127
2 short 16 Short 0 -32768 ~ 32767
3 int 32 Integer 0 -2147483648 ~ 2147483647
4 long 64 Long 0L -9223372036854775808 ~ 9223372036854775807
5 boolean 8 Boolean false true/false
6 char 16 Character 0 ~ 65535
7 float 32 Float 0.0F 1.4E-45 ~ 3.4028235E38
8 double 64 Double 0.0D 4.9E-324 ~ 1.7976931348623157E308
裝/拆箱

裝箱:將基本類型轉(zhuǎn)換為包裝類的過程。

拆箱:將包裝類型轉(zhuǎn)換為基本類型的過程。

Java 5以后引入了自動裝箱和拆箱技術(shù):

Integer a = 100;
int b = a;

自動裝箱/拆箱是Java編譯器提供的能力,背后,它會替換為調(diào)用對應(yīng)的valueOf/xxx-Value方法,比如,上面的代碼會被Java編譯器替換為:

Integer a = Integer.valueOf(100);
int b = a.intValue();
valueOf

一般建議使用valueOf方法。

new每次都會創(chuàng)建一個(gè)新對象,而除了FloatDouble外的其他包裝類,都會緩存包裝類對象,減少需要創(chuàng)建對象的次數(shù),節(jié)省空間,提升性能。

緩存

IntegerCache表示Integer緩存,其中的cache變量是一個(gè)靜態(tài)Integer數(shù)組,在靜態(tài)初始化代碼塊中被初始化。

默認(rèn)情況下,保存了-128~127256個(gè)整數(shù)對應(yīng)的Integer對象。

valueOf代碼中,如果數(shù)值位于被緩存的范圍,即默認(rèn)-128~127,則直接從Integer-Cache中獲取已預(yù)先創(chuàng)建的Integer對象,只有不在緩存范圍時(shí),才通過new創(chuàng)建對象。

序號 數(shù)據(jù)類型 數(shù)據(jù)緩存
1 Boolean true, false
2 Byte -128 ~ 127
3 Short -128 ~ 127
4 Integer -128 ~ 127
5 Long -128 ~ 127
6 Character 0 ~ 127
7 Float 無緩存
8 Double 無緩存
Switch語句 支持的數(shù)據(jù)類型

Java 5之前,只支持byte、short、intchar四種。

Java 5中,引入了枚舉類型。因?yàn)槊杜e類的ordinal返回一個(gè)int值。

Java 7中,支持String類型,使用StringhashCode方法。

原因

switch的效率相對較高,編譯后使用跳轉(zhuǎn)表實(shí)現(xiàn)。

跳轉(zhuǎn)表有序,可以二分查找,所以支持的數(shù)據(jù)類型都是整數(shù),枚舉和String也是轉(zhuǎn)換為int值。

跳轉(zhuǎn)表的存儲空間是32位,容納不下long,所以switch不支持long類型。

接口

接口中變量修飾符是public static final。

接口中方法修飾符是public abstract。

java 8允許在接口里定義默認(rèn)方法default和靜態(tài)方法static。

java 9允許默認(rèn)方法和靜態(tài)方法可以是private。

序列化 條件

一個(gè)類的對象要想序列化成功,必須滿足兩個(gè)條件:

該類必須實(shí)現(xiàn)java.io.Serializable接口。

該類的所有屬性必須是可序列化的。如果不想序列化,則將該屬性注明為transient。

否則會拋出NotSerializableException異常。

注意

虛擬機(jī)是否允許反序列化,不僅取決于類路徑和功能代碼是否一致,一個(gè)非常重要的一點(diǎn)是兩個(gè)類的序列化ID是否一致。

序列化并不保存靜態(tài)變量。

父類如果沒有實(shí)現(xiàn)Serializable接口時(shí),反序列化時(shí),會調(diào)用父類無參的構(gòu)造函數(shù)。

Externalizable

Externalizable接口繼承自java.io.Serializable

public interface Externalizable extends java.io.Serializable {

    void writeExternal(ObjectOutput out) throws IOException;

    void readExternal(ObjectInput in) throws IOException, ClassNotFoundException;
}

實(shí)現(xiàn)Externalizable接口后,序列化的細(xì)節(jié)由開發(fā)人員自己實(shí)現(xiàn)。

并且Externalizable的優(yōu)先級比Serializable的優(yōu)先級高。

異常

try/catch/finally語法中,catch不是必需的,也就是可以只有tryfinally,表示不捕獲異常,異常自動向上傳遞,但finally中的代碼在異常發(fā)生后也執(zhí)行。

java 7開始支持:多個(gè)異常之間可以用|操作符:

try {
    // 可能拋出ExceptionA和ExceptionB
} catch (ExceptionA | ExceptionB e) {
    // 異常處理邏輯
}
try-with-resources

java 7提供了一種新的語法,稱之為try-with-resources。

這種語法針對實(shí)現(xiàn)了java.lang.AutoCloseable接口的對象,接口定義:

public interface AutoCloseable {
    void close() throws Exception;
}

語法形式如下:

try (AutoCloseable resource = new FileInputStream("yunzhi.txt")) {
    // 使用資源
}

資源resource的聲明和初始化放在try語句內(nèi),不用再調(diào)用finally,在執(zhí)行完try語句后,會自動調(diào)用資源的close方法。

String

String類內(nèi)部用一個(gè)字符數(shù)組表示字符串,實(shí)例變量定義為:

private final char value[];
常量字符串
System.out.println("yunzhi.club".length());
System.out.println("yunzhi.club".contains("yunzhi"));
System.out.println("yunzhi.club".indexOf("yunzhi"));

實(shí)際上,這些常量就是String類型的對象,在內(nèi)存中,它們被放在一個(gè)共享的地方,這個(gè)地方稱為字符串常量池,它保存所有的常量字符串,每個(gè)常量只會保存一份,被所有使用者共享。

當(dāng)通過常量的形式使用一個(gè)字符串的時(shí)候,使用的就是常量池中的那個(gè)對應(yīng)的String類型的對象。

+/+=

Java中,String可以直接使用++=運(yùn)算符,這是Java編譯器提供的支持,背后,Java編譯器一般會生成StringBuilder,++=操作會轉(zhuǎn)換為append。

String hello = "hello";
hello += ", world";
System.out.println(hello);

背后,Java編譯器一般會轉(zhuǎn)換為:

StringBuilder hello = new StringBuilder("hello");
hello.append(", world");
System.out.println(hello.toString());

對于簡單的情況,可以直接使用String++=,對于復(fù)雜的情況,尤其是有循環(huán)的時(shí)候,應(yīng)該直接使用StringBuilder。

為什么要定義為不可變類呢?

不可變使得程序更為簡單安全,因?yàn)椴挥貌傩臄?shù)據(jù)被意外改寫的可能,可以安全地共享數(shù)據(jù),尤其是在多線程的環(huán)境下。

Map和Set HashMap

效率高。

無序,因?yàn)?b>hash值是無序的。

默認(rèn)采用單鏈表解決沖突,如果鏈表長度超過8,將單鏈表轉(zhuǎn)換為紅黑樹。

負(fù)荷系數(shù)
static final float DEFAULT_LOAD_FACTOR = 0.75f;
為什么容量是2的冪

申請內(nèi)存時(shí),減少內(nèi)存碎片。

進(jìn)行移位操作,效率高。

tab[i = (n - 1) & hash],使用n-1&運(yùn)算,提高效率。

其他

擴(kuò)容的條件:實(shí)際節(jié)點(diǎn)數(shù)大于等于容量的0.75,就是負(fù)荷系數(shù)。

因?yàn)椴煌姹镜?b>JDK計(jì)算的hash值可能是不同的。只存儲了數(shù)組的容量、實(shí)際節(jié)點(diǎn)數(shù)量和各個(gè)節(jié)點(diǎn)的key value值。

HashSet

元素不重復(fù)。

添加、刪除、判斷元素是否存在都是O(1)的復(fù)雜度。

無序。

HashSet內(nèi)部是調(diào)用HashMap來實(shí)現(xiàn)的,核心就是利用HashMap中的key不能相同進(jìn)行去重,key就是Set中的值,value存了一個(gè)空對象。

TreeMap

TreeMap按鍵有序,為了實(shí)現(xiàn)有序,要求要么鍵實(shí)現(xiàn)Comparable接口,要么創(chuàng)建TreeMap時(shí)傳遞一個(gè)Comparator對象。

內(nèi)部使用紅黑樹實(shí)現(xiàn),存儲映射。

紅黑樹

紅黑樹是一種平衡二叉樹,但它不是高度平衡的,而是大致平衡的。確保任意一條從根到葉子節(jié)點(diǎn)的路徑,沒有任何一條的路徑的長度會比其他路徑長過兩倍。

紅黑樹減弱了對平衡的要求,降低了保持樹平衡需要的開銷,在實(shí)際應(yīng)用中,統(tǒng)計(jì)性能超過平衡二叉樹。

TreeSet

TreeSet內(nèi)部是基于TreeMap的,實(shí)現(xiàn)了有序。

LinkedHashMap

HashMap的子類,內(nèi)部使用雙向鏈表維護(hù)鍵值對的順序,每個(gè)鍵值對既位于哈希表中,也位于這個(gè)雙向鏈表中。

支持插入順序維護(hù)或訪問順序維護(hù)。

插入順序:先添加的在前面,后添加的在后面,修改操作不影響順序。

訪問順序:對一個(gè)鍵值對進(jìn)行get/put操作,該鍵值對會移動到鏈表末尾,最末尾的是最近訪問的,最開始的是最久沒有訪問的。

LinkedHashSet

HashSet的子類,內(nèi)部采用LinkedHashMap實(shí)現(xiàn)。

EnumMap

一個(gè)key是枚舉類型的Map。

內(nèi)部使用了兩個(gè)長度相同的數(shù)組,一個(gè)存鍵,一個(gè)存儲對應(yīng)的值,值為null表示沒有該鍵值對。鍵都有一個(gè)對應(yīng)的索引,根據(jù)索引可直接訪問和操作其鍵的值,效率高。

EnumSet

EnumSet的實(shí)現(xiàn)和EnumMap沒有任何關(guān)系!

采用位向量實(shí)現(xiàn)。0代表沒有存這個(gè)枚舉值,1代表存了這個(gè)枚舉值,效率很高。

PriorityQueue

優(yōu)先級隊(duì)列,內(nèi)部采用堆實(shí)現(xiàn)。和其他需要比較的操作一樣,要么實(shí)現(xiàn)Comparable接口,要么創(chuàng)建時(shí)傳遞一個(gè)Comparator對象。

適用場景 TOP K問題

維護(hù)一個(gè)最小堆,堆的根節(jié)點(diǎn)是最小的,即第K大元素。

每次有新數(shù)據(jù)來,和根節(jié)點(diǎn)比,如果小,不操作,如果大,替換根節(jié)點(diǎn),調(diào)整堆。調(diào)整的復(fù)雜度為O(logK)。

求中值元素

維護(hù)一個(gè)最大堆和最小堆,假設(shè)當(dāng)前中位數(shù)為M,最大堆維護(hù)<=M的元素,最小堆維護(hù)>=M的元素,但兩堆中都不包含M

新數(shù)據(jù)來時(shí),如果<=M,放到最大堆中,如果>=M,放到最小堆中。

數(shù)據(jù)加入之后,如果兩堆元素相差>=2,將M加入到元素少的堆中,元素多的堆的根節(jié)點(diǎn)移除作為新的中值元素。

集合關(guān)系圖

之前一直很怕這張圖,但是隨著積累,圖中的類我們也逐漸地學(xué)會并掌握了。

Collections

Collections常用方法。

查找和替換
方法名 方法描述
binarySearch 二分查找
max 最大值
min 最小值
frequency 集合中元素出現(xiàn)次數(shù)
indexOfSubList lastIndexOfSubList 在原List中查找目標(biāo)List的位置
disjoint 集合是否有交集
replaceAll List中元素替換
排序和調(diào)整順序
方法名 方法描述
sort 排序
swap 元素交換
reverse 列表反轉(zhuǎn)
shuffle 洗牌,隨機(jī)打亂順序
rotate 循環(huán)移位
適配器
方法名 方法描述
emptyList emptySet emptyMap emptyIterator 返回空的集合,使用時(shí)比返回null更合理,更安全
singleton singletonList singletonMap 將單一對象轉(zhuǎn)化為標(biāo)準(zhǔn)容器接口對象
裝飾器
方法名 方法描述
unmodifiableCollection unmodifiableList unmodifiableMap unmodifiableSet 讓容器只讀
synchronizedCollection synchronizedList synchronizedMap synchronizedSet 讓容器線程安全,不是最優(yōu)實(shí)現(xiàn)。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/75954.html

相關(guān)文章

  • java&javaweb學(xué)習(xí)筆記(匯總)

    摘要:我的學(xué)習(xí)筆記匯總標(biāo)簽筆記分為兩大部分和筆記內(nèi)容主要是對一些基礎(chǔ)特性和編程細(xì)節(jié)進(jìn)行總結(jié)整理,適合了解基礎(chǔ)語法,想進(jìn)一步深入學(xué)習(xí)的人如果覺得不錯(cuò),請給,這也是對我的鼓勵,有什么意見歡迎留言反饋目錄基礎(chǔ)鞏固筆記反射基礎(chǔ)鞏固筆記泛型基礎(chǔ)鞏 我的java&javaweb學(xué)習(xí)筆記(匯總) 標(biāo)簽: java [TOC] 筆記分為兩大部分:javase和javaweb javase javawe...

    yagami 評論0 收藏0
  • Java入門請不要放棄,學(xué)習(xí)路線以及側(cè)重點(diǎn)分析

    摘要:而面向搜索引擎,就是我們要及時(shí)的使用百度谷歌遇到問題無法解決,先別急著放棄,可以去網(wǎng)絡(luò)尋找答案,你的坑大部分別人都已經(jīng)走過了,大部分都可以找到合適的解決方案。 showImg(https://segmentfault.com/img/remote/1460000019236352?w=866&h=456); 前言: ●眾多的語言,到底哪一門才是適合我的?●我們?yōu)槭裁匆獙W(xué)習(xí)Java語言呢...

    mochixuan 評論0 收藏0
  • Java核心技術(shù)筆記 語言基礎(chǔ)

    摘要:變量聲明變量變量名規(guī)則字母開頭,由字母或數(shù)字構(gòu)成的序列,中的字母包括或者某種語言中代表字母的任何字符,數(shù)字包括或者某種語言中代表數(shù)字的任何字符。刪除原始字符串頭部和尾部空格。中斷控制流程,使用在和循環(huán)中,用于提前中斷循環(huán)。 《Java核心技術(shù) 卷Ⅰ》 第3章 Java 的基本程序設(shè)計(jì)結(jié)構(gòu) 一些規(guī)則 類命名:CamelCase 駝峰命名法,以及必須是字母開頭,后面跟字母和數(shù)字的任意組合...

    lindroid 評論0 收藏0
  • Java筆記基礎(chǔ)數(shù)據(jù)類型

    摘要:的基礎(chǔ)類型主要分為四大類,八小類。四大類分別為整數(shù)型,浮點(diǎn)數(shù)類型,布爾類型字符類型。是最常用的整數(shù)數(shù)據(jù)類型。布爾類型布爾類型有兩個(gè)值和,用來判定的邏輯條件?;A(chǔ)類型的數(shù)據(jù),直接存放在棧內(nèi)存?;A(chǔ)類型的方法傳參是通過值拷貝的方法。 Java的基礎(chǔ)類型主要分為四大類,八小類。四大類分別為整數(shù)型,浮點(diǎn)數(shù)類型,布爾類型,字符類型。其中整數(shù)型有四中,容量從小到大分別為:byte,short,in...

    PingCAP 評論0 收藏0
  • 基礎(chǔ)java學(xué)習(xí)筆記

    摘要:區(qū)分大小寫語句以英文分號結(jié)尾一環(huán)境搭建安裝建議和設(shè)置環(huán)境變量添加用戶變量二使用創(chuàng)建工作空間,即選擇適合的,如創(chuàng)建在目錄下創(chuàng)建運(yùn)行有方法的類,在試圖中查看結(jié)果三第一個(gè)類方法必須這樣寫一個(gè)類里面可以有多個(gè)方法,但只能有一個(gè)方法,方法里的代碼決定 1、java區(qū)分大小寫2、語句以英文分號(;)結(jié)尾一、環(huán)境搭建1、安裝JDK(建議java SE)和Eclipse for java2、設(shè)置環(huán)境變...

    xiangzhihong 評論0 收藏0
  • Java基礎(chǔ)語法筆記

    摘要:注該筆記適合有基礎(chǔ)或者有復(fù)習(xí)需求的小伙伴哦預(yù)習(xí)的話建議直接看視頻俺舅是鏈接邀請碼太過簡單的知識點(diǎn)都被作者扔到回收站了所以這些知識點(diǎn)都是精華呦一快捷鍵與常見問題運(yùn)行當(dāng)前程序其它運(yùn)行方法右鍵小蟲子圖像右邊的圖標(biāo)運(yùn)行錯(cuò)誤運(yùn)行 ...

    maochunguang 評論0 收藏0

發(fā)表評論

0條評論

PrototypeZ

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<