Java基礎(chǔ)總結(jié)(一)

git pull 和git fetch的區(qū)別

image.png

Java 基礎(chǔ)

  1. JDK 和 JRE 有什么區(qū)別?
JDK:Java Development Kit 的簡(jiǎn)稱,Java 開(kāi)發(fā)工具包,提供了 Java 的開(kāi)發(fā)環(huán)境和運(yùn)行環(huán)境。
JRE:Java Runtime Environment 的簡(jiǎn)稱,Java 運(yùn)行環(huán)境,為 Java 的運(yùn)行提供了所需環(huán)境。
具體來(lái)說(shuō) JDK 其實(shí)包含了 JRE,
同時(shí)還包含了編譯 Java 源碼的編譯器 Javac,
還包含了很多 Java 程序調(diào)試和分析的工具。
簡(jiǎn)單來(lái)說(shuō):如果你需要運(yùn)行 Java 程序,只需安裝 JRE 就可以了,
如果你需要編寫(xiě) Java 程序,需要安裝 JDK。

image.png
  1. == 和 equals 的區(qū)別是什么?
    「== 解讀」:對(duì)于基本類型和引用類型 == 的作用效果是不同的,如下所示:
    基本類型:比較的是值是否相同;
    引用類型:比較的是引用是否相同;
代碼示例:
String x = "string";
String y = "string";
String z = new String("string");
System.out.println(x==y); // true
System.out.println(x==z); // false
System.out.println(x.equals(y)); // true
System.out.println(x.equals(z)); // true
代碼解讀:因?yàn)?x 和 y 指向的是同一個(gè)引用,所以 == 也是 true,而 new String()方法則重寫(xiě)開(kāi)辟了內(nèi)存空間,所以 == 結(jié)果為 false,而 equals 比較的一直是值,所以結(jié)果都為 true。

「equals 解讀」:equals 本質(zhì)上就是 ==,只不過(guò) String 和 Integer 等重寫(xiě)了 equals 方法,把它變成了值比較??聪旅娴拇a就明白了。

首先來(lái)看默認(rèn)情況下 equals 比較一個(gè)有相同值的對(duì)象,代碼如下:
classCat{
    publicCat(String name){
        this.name = name;
    }
 
    private String name;
 
    public String getName(){
        return name;
    }
 
    publicvoidsetName(String name){
        this.name = name;
    }
}
 
Cat c1 = new Cat("王磊");
Cat c2 = new Cat("王磊");
System.out.println(c1.equals(c2)); // false
輸出結(jié)果出乎我們的意料,竟然是 false?這是怎么回事,看了 equals 源碼就知道了,源碼如下:

publicbooleanequals(Object obj){
        return (this == obj);
}
原來(lái) equals 本質(zhì)上就是 ==。

那問(wèn)題來(lái)了,兩個(gè)相同值的 String 對(duì)象,為什么返回的是 true?代碼如下:

String s1 = new String("老王");
String s2 = new String("老王");
System.out.println(s1.equals(s2)); // true
同樣的,當(dāng)我們進(jìn)入 String 的 equals 方法,找到了答案,代碼如下:

publicbooleanequals(Object anObject){
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = value.length;
        if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}
原來(lái)是 String 重寫(xiě)了 Object 的 equals 方法,把引用比較改成了值比較。

「總結(jié)」 :== 對(duì)于基本類型來(lái)說(shuō)是值比較,對(duì)于引用類型來(lái)說(shuō)是比較的是引用;而 equals 默認(rèn)情況下是引用比較,只是很多類重新了 equals 方法,比如 String、Integer 等把它變成了值比較,所以一般情況下 equals 比較的是值是否相等。

  1. 兩個(gè)對(duì)象的 hashCode() 相同,則 equals() 也一定為 true,對(duì)嗎?
    不對(duì),兩個(gè)對(duì)象的 hashCode() 相同,equals() 不一定 true。
代碼示例:
String str1 = "通話";
String str2 = "重地";
System. out. println(String. format("str1:%d | str2:%d",  str1. hashCode(),str2. hashCode()));
System. out. println(str1. equals(str2));
執(zhí)行的結(jié)果:

str1:1179395 | str2:1179395
 
false
代碼解讀:很顯然“通話”和“重地”的 hashCode() 相同,然而 equals() 則為 false,因?yàn)樵谏⒘斜碇?,hashCode() 相等即兩個(gè)鍵值對(duì)的哈希值相等,然而哈希值相等,并不一定能得出鍵值對(duì)相等。
  1. final 在 Java 中有什么作用?
    final 修飾的類叫最終類,該類不能被繼承。
    final 修飾的方法不能被重寫(xiě)。
    final 修飾的變量叫常量,常量必須初始化,初始化之后值就不能被修改。

  2. Java 中的 Math. round(-1. 5) 等于多少?
    等于 -1,因?yàn)樵跀?shù)軸上取值時(shí),中間值(0.5)向右取整,所以正 0.5 是往上取整,負(fù) 0.5 是直接舍棄。

  3. String 屬于基礎(chǔ)的數(shù)據(jù)類型嗎?
    String 不屬于基礎(chǔ)類型,基礎(chǔ)類型有 8 種:byte、short、int、long、float、double、boolean、char( 從大到小的順序排列),而 String 屬于對(duì)象。

  4. Java 中操作字符串都有哪些類?它們之間有什么區(qū)別?
    操作字符串的類有:String、StringBuffer、StringBuilder。

String 和 StringBuffer、StringBuilder 的區(qū)別:
在于 String 聲明的是不可變的對(duì)象,每次操作都會(huì)生成新的 String 對(duì)象,然后將指針指向新的 String 對(duì)象,而 StringBuffer、StringBuilder 可以在原有對(duì)象的基礎(chǔ)上進(jìn)行操作,所以在經(jīng)常改變字符串內(nèi)容的情況下最好不要使用 String。

StringBuffer 和 StringBuilder 最大的區(qū)別在于:
StringBuffer 是線程安全的,
而 StringBuilder 是非線程安全的,但 StringBuilder 的性能卻高于 StringBuffer,所以在單線程環(huán)境下推薦使用 StringBuilder,多線程環(huán)境下推薦使用 StringBuffer。

  1. String str="i"與 String str=new String("i")一樣嗎?
    不一樣,因?yàn)閮?nèi)存的分配方式不一樣。
    String str="i"的方式,Java 虛擬機(jī)會(huì)將其分配到常量池中;
    而 String str=new String("i") 則會(huì)被分到堆內(nèi)存中。

  2. 如何將字符串反轉(zhuǎn)?
    使用 StringBuilder 或者 stringBuffer 的 reverse() 方法。

示例代碼:
// StringBuffer reverse
StringBuffer stringBuffer = new StringBuffer();
stringBuffer. append("abcdefg");
System. out. println(stringBuffer. reverse()); // gfedcba
// StringBuilder reverse
StringBuilder stringBuilder = new StringBuilder();
stringBuilder. append("abcdefg");
System. out. println(stringBuilder. reverse()); // gfedcba
  1. String 類的常用方法都有那些?
indexOf():返回指定字符的索引。
charAt():返回指定索引處的字符。
replace():字符串替換。
trim():去除字符串兩端空白。
split():分割字符串,返回一個(gè)分割后的字符串?dāng)?shù)組。
getBytes():返回字符串的 byte 類型數(shù)組。
length():返回字符串長(zhǎng)度。
toLowerCase():將字符串轉(zhuǎn)成小寫(xiě)字母。
toUpperCase():將字符串轉(zhuǎn)成大寫(xiě)字符。
substring():截取字符串。
equals():字符串比較。
  1. 抽象類必須要有抽象方法嗎?
    不需要,抽象類不一定非要有抽象方法。
示例代碼:
abstract classCat{
    publicstaticvoidsayHi(){
        System. out. println("hi~");
    }
}

上面代碼,抽象類并沒(méi)有抽象方法但完全可以正常運(yùn)行。

  1. 普通類和抽象類有哪些區(qū)別?
    普通類不能包含抽象方法,抽象類可以包含抽象方法。
    抽象類不能直接實(shí)例化,普通類可以直接實(shí)例化。
  2. 抽象類能使用 final 修飾嗎?
    不能,定義抽象類就是讓其他類繼承的,如果定義為 final 該類就不能被繼承,這樣彼此就會(huì)產(chǎn)生矛盾,所以 final 不能修飾抽象類,如下圖所示,編輯器也會(huì)提示錯(cuò)誤信息:


    image.png
  3. 接口和抽象類有什么區(qū)別?
    實(shí)現(xiàn):抽象類的子類使用 extends 來(lái)繼承;接口必須使用 implements 來(lái)實(shí)現(xiàn)接口。
    構(gòu)造函數(shù):抽象類可以有構(gòu)造函數(shù);接口不能有。
    實(shí)現(xiàn)數(shù)量:類可以實(shí)現(xiàn)很多個(gè)接口;但是只能繼承一個(gè)抽象類。
    訪問(wèn)修飾符:接口中的方法默認(rèn)使用 public 修飾;抽象類中的方法可以是任意訪問(wèn)修飾符。
  4. Java 中 IO 流分為幾種?
    按功能來(lái)分:輸入流(input)、輸出流(output)。
    按類型來(lái)分:字節(jié)流和字符流。

字節(jié)流和字符流的區(qū)別是:字節(jié)流按 8 位傳輸以字節(jié)為單位輸入輸出數(shù)據(jù),字符流按 16 位傳輸以字符為單位輸入輸出數(shù)據(jù)。

  1. BIO、NIO、AIO 有什么區(qū)別?
    BIO:Block IO 同步阻塞式 IO,就是我們平常使用的傳統(tǒng) IO,它的特點(diǎn)是模式簡(jiǎn)單使用方便,并發(fā)處理能力低。
    NIO:Non IO 同步非阻塞 IO,是傳統(tǒng) IO 的升級(jí),客戶端和服務(wù)器端通過(guò) Channel(通道)通訊,實(shí)現(xiàn)了多路復(fù)用。
    AIO:Asynchronous IO 是 NIO 的升級(jí),也叫 NIO2,實(shí)現(xiàn)了異步非堵塞 IO ,異步 IO 的操作基于事件和回調(diào)機(jī)制。

  2. Files的常用方法都有哪些?

Files. exists():檢測(cè)文件路徑是否存在。
Files. createFile():創(chuàng)建文件。
Files. createDirectory():創(chuàng)建文件夾。
Files. delete():刪除一個(gè)文件或目錄。
Files. copy():復(fù)制文件。
Files. move():移動(dòng)文件。
Files. size():查看文件個(gè)數(shù)。
Files. read():讀取文件。
Files. write():寫(xiě)入文件。
  1. 成員變量和局部變量的區(qū)別 有3處
    a. 作用的領(lǐng)域不同:成員變量作用在整個(gè)類的內(nèi)部,如果訪問(wèn)權(quán)限允許 類外也可以使用;局部變量作用限于定義它的方法內(nèi)部;
    b. 初始值不同:成員變量 如果創(chuàng)建時(shí)未賦值 系統(tǒng)自動(dòng)賦予初始值;局部變量要想使用 必須先賦值。
    c. 優(yōu)先級(jí)不同:局部變量具有更高的優(yōu)先級(jí)
    PS: 同一個(gè)類中的成員變量可以和局部變量名相同,但是 同一個(gè)類中的成員變量和同一個(gè)方法中的局部變量名是唯一的。
[Spring 攔截器和過(guò)濾器的區(qū)別]

**1、實(shí)現(xiàn)原理不同**
過(guò)濾器和[攔截器]底層實(shí)現(xiàn)方式大不相同,
過(guò)濾器 是基于函數(shù)回調(diào)的,
攔截器 則是基于Java的反射機(jī)制(動(dòng)態(tài)代理)實(shí)現(xiàn)的。

**2、使用范圍不同**
過(guò)濾器Filter 的使用要依賴于Tomcat等容器,導(dǎo)致它只能在web程序中使用。
而攔截器(Interceptor) 它是一個(gè)Spring組件,并由Spring容器管理,并不依賴Tomcat等容器,是可以單獨(dú)使用的;不僅能應(yīng)用在web程序中,也可以用于Application、Swing等程序中。

**3、觸發(fā)時(shí)機(jī)不同**
過(guò)濾器Filter是在請(qǐng)求進(jìn)入容器后,但在進(jìn)入servlet之前進(jìn)行預(yù)處理,請(qǐng)求結(jié)束是在servlet處理完以后。
攔截器 Interceptor 是在請(qǐng)求進(jìn)入servlet后,在進(jìn)入Controller之前進(jìn)行預(yù)處理的,Controller 中渲染了對(duì)應(yīng)的視圖之后請(qǐng)求結(jié)束。

**4、攔截的請(qǐng)求范圍不同**
過(guò)濾器Filter執(zhí)行了兩次,攔截器Interceptor只執(zhí)行了一次。
這是因?yàn)檫^(guò)濾器幾乎可以對(duì)所有進(jìn)入容器的請(qǐng)求起作用,
而攔截器只會(huì)對(duì)Controller中請(qǐng)求或訪問(wèn)static目錄下的資源請(qǐng)求起作用。

**5、注入Bean情況不同**
這是因?yàn)榧虞d順序?qū)е碌膯?wèn)題,
攔截器加載的時(shí)間點(diǎn)在springcontext之前,而B(niǎo)ean又是由spring進(jìn)行管理。

**6、控制執(zhí)行順序不同**
過(guò)濾器用@Order注解控制執(zhí)行順序,通過(guò)@Order控制過(guò)濾器的級(jí)別,值越小級(jí)別越高越先執(zhí)行。
攔截器默認(rèn)的執(zhí)行順序,就是它的注冊(cè)順序,也可以通過(guò)Order手動(dòng)設(shè)置控制,值越小越先執(zhí)行

1、攔截器是基于java的反射機(jī)制的,而過(guò)濾器是基于函數(shù)回調(diào)(職責(zé)鏈)

2、過(guò)濾器依賴于servlet容器,而攔截器不依賴于servlet容器

3、攔截器只能對(duì)action請(qǐng)求起作用,而過(guò)濾器則可以對(duì)幾乎所有的請(qǐng)求起作用

4、攔截器可以訪問(wèn)action上下文、值棧里的對(duì)象,而過(guò)濾器不能

5、在action的生命周期中,攔截器可以多次被調(diào)用,而過(guò)濾器只能在容器初始化時(shí)被調(diào)用一次

執(zhí)行順序 :過(guò)濾前 - 攔截前 - Action處理 - 攔截后 - 過(guò)濾后。個(gè)人認(rèn)為過(guò)濾是一個(gè)橫向的過(guò)程,首先把客戶端提交的內(nèi)容進(jìn)行過(guò)濾(例如未登錄用戶不能訪問(wèn)內(nèi)部頁(yè)面的處理);過(guò)濾通過(guò)后,攔截器將檢查用戶提交數(shù)據(jù)的驗(yàn)證,做一些前期的數(shù)據(jù)處理,接著把處理后的數(shù)據(jù)發(fā)給對(duì)應(yīng)的Action;Action處理完成返回后,攔截器還可以做其他過(guò)程(還沒(méi)想到要做啥),再向上返回到過(guò)濾器的后續(xù)操作

image.png
image.png
image.png

image.png

image.png

=============================================================

容器

  1. Java 容器都有哪些?
    Java 容器分為 Collection 和 Map 兩大類,其下又有很多子類,如下所示:

Collection
List
ArrayList
LinkedList
Vector
Stack
Set
HashSet
LinkedHashSet
TreeSet
Map
HashMap
LinkedHashMap
TreeMap
ConcurrentHashMap
Hashtable

  1. Collection 和 Collections 有什么區(qū)別?
    Collection 是一個(gè)集合接口,它提供了對(duì)集合對(duì)象進(jìn)行基本操作的通用接口方法,所有集合都是它的子類,比如 List、Set 等。
    Collections 是一個(gè)包裝類,包含了很多靜態(tài)方法,不能被實(shí)例化,就像一個(gè)工具類,比如提供的排序方法:Collections. sort(list)。
  2. List、Set、Map 之間的區(qū)別是什么?
    List、Set、Map 的區(qū)別主要體現(xiàn)在兩個(gè)方面:元素是否有序、是否允許元素重復(fù)。

三者之間的區(qū)別,如下表:


image.png
  1. HashMap 和 Hashtable 有什么區(qū)別?
    存儲(chǔ):HashMap 運(yùn)行 key 和 value 為 null,而 Hashtable 不允許。
    線程安全:Hashtable 是線程安全的,而 HashMap 是非線程安全的。
    推薦使用:在 Hashtable 的類注釋可以看到,Hashtable 是保留類不建議使用,推薦在單線程環(huán)境下使用 HashMap 替代,如果需要多線程使用則用 ConcurrentHashMap 替代。
HashMap和ConcurrentHashMap區(qū)別

Addison911

于 2021-07-17 10:45:31 發(fā)布

4147
 收藏 10
文章標(biāo)簽: java
版權(quán)
1.HashMap是線程非安全的,ConcurrentHashMap是線程安全的。

2.ConcurrentHashMap將整個(gè)Hash桶進(jìn)行了分段segment,也就是講這個(gè)大的數(shù)組分成了幾個(gè)小的片段segment,而且每個(gè)小的片段segment上面都有鎖存在,那么在插入元素的時(shí)候需要先找到應(yīng)該插入到哪個(gè)segment片段,然后再這個(gè)片段上面進(jìn)行插入,而且這里還需要獲取segment鎖。

3.ConcurrentHashMap讓鎖的力度更精細(xì)一些,并發(fā)性能更好。

Concurrent HashMap線程安全嗎,Concurrent HashMap如何保證線程安全?

1.Hash Table容器在競(jìng)爭(zhēng)激烈的兵法環(huán)境下表現(xiàn)出效率低下的原因是所有訪問(wèn)HashTable的線程都必須競(jìng)爭(zhēng)同一把鎖,那加入容器里有多把鎖,每一把鎖用于鎖容器其中一部分?jǐn)?shù)據(jù),那么當(dāng)多線程訪問(wèn)容器里不同數(shù)據(jù)段數(shù)據(jù)時(shí),線程就不會(huì)存在競(jìng)爭(zhēng)鎖,從而可以有效提高有效提高并發(fā)訪問(wèn)效率,這就是ConcurrentHashMap所使用的鎖分段技術(shù),首先將數(shù)據(jù)分成一段一段的存儲(chǔ),然后給每一段數(shù)據(jù)配一把鎖,當(dāng)一個(gè)線程占用鎖訪問(wèn)其中一個(gè)數(shù)據(jù)片段的時(shí)候,其他的數(shù)據(jù)也能被其他線程訪問(wèn)。

2.get操作的高效之處在于整個(gè)get過(guò)程不需要加鎖,除非讀到的值是空的才會(huì)加鎖重讀,get方法里將要使用的共享變量都定義成volatile,如用于統(tǒng)計(jì)當(dāng)前Segment大小的count字段和用于存儲(chǔ)值的HashEntry的value。定義成volatile的變量,能夠在線程之間保持可見(jiàn)性,能夠被多線程同時(shí)讀,并且保證不會(huì)讀到過(guò)期的值,但是只能被單線程寫(xiě)(友一種情況可以背多線程寫(xiě),就是寫(xiě)入的值不依賴于原值),在get操作里只需要讀不需要寫(xiě)共享變量count和value,所以可以不用加鎖。

3.Pt方法首先定位到Segemnt,然后在Segment里進(jìn)行插入操作,插入操作需要經(jīng)歷兩個(gè)步驟,第一步判斷是否需要對(duì)Segment里的HashEntry數(shù)組進(jìn)行擴(kuò)容,第二步定位添加元素的位置然后放在HashEntry數(shù)組里。
————————————————
版權(quán)聲明:本文為CSDN博主「Addison911」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_39410595/article/details/118852427
  1. 如何決定使用 HashMap 還是 TreeMap?
    對(duì)于在 Map 中插入、刪除、定位一個(gè)元素這類操作,HashMap 是最好的選擇,因?yàn)橄鄬?duì)而言 HashMap 的插入會(huì)更快,但如果你要對(duì)一個(gè) key 集合進(jìn)行有序的遍歷,那 TreeMap 是更好的選擇。

  2. 說(shuō)一下 HashMap 的實(shí)現(xiàn)原理?
    HashMap 基于 Hash 算法實(shí)現(xiàn)的,我們通過(guò) put(key,value)存儲(chǔ),get(key)來(lái)獲取。當(dāng)傳入 key 時(shí),HashMap 會(huì)根據(jù) key. hashCode() 計(jì)算出 hash 值,根據(jù) hash 值將 value 保存在 bucket 里。當(dāng)計(jì)算出的 hash 值相同時(shí),我們稱之為 hash 沖突,HashMap 的做法是用鏈表和紅黑樹(shù)存儲(chǔ)相同 hash 值的 value。當(dāng) hash 沖突的個(gè)數(shù)比較少時(shí),使用鏈表否則使用紅黑樹(shù)。

  3. 說(shuō)一下 HashSet 的實(shí)現(xiàn)原理?
    HashSet 是基于 HashMap 實(shí)現(xiàn)的,HashSet 底層使用 HashMap 來(lái)保存所有元素,因此 HashSet 的實(shí)現(xiàn)比較簡(jiǎn)單,相關(guān) HashSet 的操作,基本上都是直接調(diào)用底層 HashMap 的相關(guān)方法來(lái)完成,HashSet 不允許重復(fù)的值。

  4. ArrayList 和 LinkedList 的區(qū)別是什么?
    數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn):ArrayList 是動(dòng)態(tài)數(shù)組的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn),而 LinkedList 是雙向鏈表的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)。
    隨機(jī)訪問(wèn)效率:ArrayList 比 LinkedList 在隨機(jī)訪問(wèn)的時(shí)候效率要高,因?yàn)?LinkedList 是線性的數(shù)據(jù)存儲(chǔ)方式,所以需要移動(dòng)指針從前往后依次查找。
    增加和刪除效率:在非首尾的增加和刪除操作,LinkedList 要比 ArrayList 效率要高,因?yàn)?ArrayList 增刪操作要影響數(shù)組內(nèi)的其他數(shù)據(jù)的下標(biāo)。
    綜合來(lái)說(shuō),在需要頻繁讀取集合中的元素時(shí),更推薦使用 ArrayList,而在插入和刪除操作較多時(shí),更推薦使用 LinkedList。

  5. 如何實(shí)現(xiàn)數(shù)組和 List 之間的轉(zhuǎn)換?
    數(shù)組轉(zhuǎn) List:使用 Arrays. asList(array) 進(jìn)行轉(zhuǎn)換。
    List 轉(zhuǎn)數(shù)組:使用 List 自帶的 toArray() 方法。
    代碼示例:

// list to array
List<String> list = new ArrayList<String>();
list. add("王磊");
list. add("的博客");
list. toArray();
// array to list
String[] array = new String[]{"王磊","的博客"};
Arrays. asList(array);
  1. ArrayList 和 Vector 的區(qū)別是什么?
    線程安全:Vector 使用了 Synchronized 來(lái)實(shí)現(xiàn)線程同步,是線程安全的,而 ArrayList 是非線程安全的。
    性能:ArrayList 在性能方面要優(yōu)于 Vector。
    擴(kuò)容:ArrayList 和 Vector 都會(huì)根據(jù)實(shí)際的需要?jiǎng)討B(tài)的調(diào)整容量,只不過(guò)在 Vector 擴(kuò)容每次會(huì)增加 1 倍,而 ArrayList 只會(huì)增加 50%。
  2. Array 和 ArrayList 有何區(qū)別?
    Array 可以存儲(chǔ)基本數(shù)據(jù)類型和對(duì)象,ArrayList 只能存儲(chǔ)對(duì)象。
    Array 是指定固定大小的,而 ArrayList 大小是自動(dòng)擴(kuò)展的。
    Array 內(nèi)置方法沒(méi)有 ArrayList 多,比如 addAll、removeAll、iteration 等方法只有 ArrayList 有。
  3. 在 Queue 中 poll()和 remove()有什么區(qū)別?
    相同點(diǎn):都是返回第一個(gè)元素,并在隊(duì)列中刪除返回的對(duì)象。
    不同點(diǎn):如果沒(méi)有元素 poll()會(huì)返回 null,而 remove()會(huì)直接拋出 NoSuchElementException 異常。
    代碼示例:

Queue<String> queue = new LinkedList<String>();
queue. offer("string"); // add
System. out. println(queue. poll());
System. out. println(queue. remove());
System. out. println(queue. size());

  1. 哪些集合類是線程安全的?
    Vector、Hashtable、Stack 都是線程安全的,而像 HashMap 則是非線程安全的,不過(guò)在 JDK 1.5 之后隨著 Java. util. concurrent 并發(fā)包的出現(xiàn),它們也有了自己對(duì)應(yīng)的線程安全類,比如 HashMap 對(duì)應(yīng)的線程安全類就是 ConcurrentHashMap。

  2. 迭代器 Iterator 是什么?
    Iterator 接口提供遍歷任何 Collection 的接口。我們可以從一個(gè) Collection 中使用迭代器方法來(lái)獲取迭代器實(shí)例。迭代器取代了 Java 集合框架中的 Enumeration,迭代器允許調(diào)用者在迭代過(guò)程中移除元素。

  3. Iterator 怎么使用?有什么特點(diǎn)?
    Iterator 使用代碼如下:

List<String> list = new ArrayList<>();
Iterator<String> it = list. iterator();
while(it. hasNext()){
  String obj = it. next();
  System. out. println(obj);
}

Iterator 的特點(diǎn)是更加安全,因?yàn)樗梢源_保,在當(dāng)前遍歷的集合元素被更改的時(shí)候,就會(huì)拋出 ConcurrentModificationException 異常。

  1. Iterator 和 ListIterator 有什么區(qū)別?
    Iterator 可以遍歷 Set 和 List 集合,而 ListIterator 只能遍歷 List。
    Iterator 只能單向遍歷,而 ListIterator 可以雙向遍歷(向前/后遍歷)。
    ListIterator 從 Iterator 接口繼承,然后添加了一些額外的功能,比如添加一個(gè)元素、替換一個(gè)元素、獲取前面或后面元素的索引位置。
  2. 怎么確保一個(gè)集合不能被修改?
    可以使用 Collections. unmodifiableCollection(Collection c) 方法來(lái)創(chuàng)建一個(gè)只讀集合,這樣改變集合的任何操作都會(huì)拋出 Java. lang. UnsupportedOperationException 異常。

示例代碼如下:

List<String> list = new ArrayList<>();
list. add("x");
Collection<String> clist = Collections. unmodifiableCollection(list);
clist. add("y"); // 運(yùn)行時(shí)此行報(bào)錯(cuò)
System. out. println(list. size());

————————————————
版權(quán)聲明:本文為CSDN博主「十一技術(shù)斬」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/uuqaz/article/details/123502779

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.String、StringBuilder、StringBuffer的區(qū)別是什么,String為什么是不可變的?...
    MysticBoy閱讀 535評(píng)論 0 0
  • 1、Java語(yǔ)言的特點(diǎn) 1)Java是面向?qū)ο蟮恼Z(yǔ)言 2)與平臺(tái)無(wú)關(guān)性,一次編譯到處運(yùn)行 3)分布式,有一個(gè)豐富的...
    逛逛_堆棧閱讀 560評(píng)論 0 6
  • java是一門強(qiáng)類型語(yǔ)言(變量的使用要嚴(yán)格符合定義,所有變量都必須先定義后使用),java的內(nèi)存結(jié)構(gòu)是棧內(nèi)存...
    沈益達(dá)閱讀 576評(píng)論 1 2
  • 四、集合框架 1:String類:字符串(重點(diǎn)) (1)多個(gè)字符組成的一個(gè)序列,叫字符串。生活中很多數(shù)據(jù)的描述都采...
    平凡的柚子閱讀 145評(píng)論 0 0
  • 1、HTTP和HTTPS區(qū)別 HTTPS是HTTP協(xié)議的安全版本,HTTP協(xié)議的數(shù)據(jù)傳輸是明文的,是不安全的,HT...
    Johnson_Coding閱讀 292評(píng)論 0 0

友情鏈接更多精彩內(nèi)容