成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

最最最常見的Java面試題總結(jié)——第二周

yearsj / 3189人閱讀

摘要:與都繼承自類,在中也是使用字符數(shù)組保存字符串,,這兩種對象都是可變的。采用字節(jié)碼的好處語言通過字節(jié)碼的方式,在一定程度上解決了傳統(tǒng)解釋型語言執(zhí)行效率低的問題,同時又保留了解釋型語言可移植的特點。

String和StringBuffer、StringBuilder的區(qū)別是什么?String為什么是不可變的? String和StringBuffer、StringBuilder的區(qū)別

可變性
 
String類中使用字符數(shù)組:private final char value[]保存字符串,所以String對象是不可變的。StringBuilder與StringBuffer都繼承自AbstractStringBuilder類,在AbstractStringBuilder中也是使用字符數(shù)組保存字符串,char[]value,這兩種對象都是可變的。
  

線程安全性

String中的對象是不可變的,也就可以理解為常量,線程安全。AbstractStringBuilder是StringBuilder與StringBuffer的公共父類,定義了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。StringBuffer對方法加了同步鎖或者對調(diào)用的方法加了同步鎖,所以是線程安全的。StringBuilder并沒有對方法進行加同步鎖,所以是非線程安全的。
  

性能

每次對String 類型進行改變的時候,都會生成一個新的String對象,然后將指針指向新的String 對象。StringBuffer每次都會對StringBuffer對象本身進行操作,而不是生成新的對象并改變對象引用。相同情況下使用StirngBuilder 相比使用StringBuffer 僅能獲得10%~15% 左右的性能提升,但卻要冒多線程不安全的風險。

對于三者使用的總結(jié):

如果要操作少量的數(shù)據(jù)用 = String

單線程操作字符串緩沖區(qū) 下操作大量數(shù)據(jù) = StringBuilder

多線程操作字符串緩沖區(qū) 下操作大量數(shù)據(jù) = StringBuffer

String為什么是不可變的嗎?

簡單來說就是String類利用了final修飾的char類型數(shù)組存儲字符,源碼如下圖所以:

    /** The value is used for character storage. */
    private final char value[];
String真的是不可變的嗎?

我覺得如果別人問這個問題的話,回答不可變就可以了。
下面只是給大家看兩個有代表性的例子:

1) String不可變但不代表引用不可以變

        String str = "Hello";
        str = str + " World";
        System.out.println("str=" + str);

結(jié)果:

str=Hello World

解析:

實際上,原來String的內(nèi)容是不變的,只是str由原來指向"Hello"的內(nèi)存地址轉(zhuǎn)為指向"Hello World"的內(nèi)存地址而已,也就是說多開辟了一塊內(nèi)存區(qū)域給"Hello World"字符串。

2) 通過反射是可以修改所謂的“不可變”對象

        // 創(chuàng)建字符串"Hello World", 并賦給引用s
        String s = "Hello World";

        System.out.println("s = " + s); // Hello World

        // 獲取String類中的value字段
        Field valueFieldOfString = String.class.getDeclaredField("value");

        // 改變value屬性的訪問權(quán)限
        valueFieldOfString.setAccessible(true);

        // 獲取s對象上的value屬性的值
        char[] value = (char[]) valueFieldOfString.get(s);

        // 改變value所引用的數(shù)組中的第5個字符
        value[5] = "_";

        System.out.println("s = " + s); // Hello_World

結(jié)果:

s = Hello World
s = Hello_World

解析:

用反射可以訪問私有成員, 然后反射出String對象中的value屬性, 進而改變通過獲得的value引用改變數(shù)組的結(jié)構(gòu)。但是一般我們不會這么做,這里只是簡單提一下有這個東西。

什么是反射機制?反射機制的應(yīng)用場景有哪些? 反射機制介紹

JAVA反射機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的任意一個方法和屬性;這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象的方法的功能稱為java語言的反射機制。

靜態(tài)編譯和動態(tài)編譯

靜態(tài)編譯:在編譯時確定類型,綁定對象

動態(tài)編譯:運行時確定類型,綁定對象

反射機制優(yōu)缺點

優(yōu)點: 運行期類型的判斷,動態(tài)加載類,提高代碼靈活度。

缺點: 性能瓶頸:反射相當于一系列解釋操作,通知 JVM 要做的事情,性能比直接的java代碼要慢很多。

反射的應(yīng)用場景

反射是框架設(shè)計的靈魂。

在我們平時的項目開發(fā)過程中,基本上很少會直接使用到反射機制,但這不能說明反射機制沒有用,實際上有很多設(shè)計、開發(fā)都與反射機制有關(guān),例如模塊化的開發(fā),通過反射去調(diào)用對應(yīng)的字節(jié)碼;動態(tài)代理設(shè)計模式也采用了反射機制,還有我們?nèi)粘J褂玫?Spring/Hibernate 等框架也大量使用到了反射機制。

舉例:①我們在使用JDBC連接數(shù)據(jù)庫時使用Class.forName()通過反射加載數(shù)據(jù)庫的驅(qū)動程序;②Spring框架也用到很多反射機制,最經(jīng)典的就是xml的配置模式。Spring 通過 XML 配置模式裝載 Bean 的過程:1) 將程序內(nèi)所有 XML 或 Properties 配置文件加載入內(nèi)存中;
2)Java類里面解析xml或properties里面的內(nèi)容,得到對應(yīng)實體類的字節(jié)碼字符串以及相關(guān)的屬性信息; 3)使用反射機制,根據(jù)這個字符串獲得某個類的Class實例; 4)動態(tài)配置實例的屬性

推薦閱讀:

Reflection:Java反射機制的應(yīng)用場景

Java基礎(chǔ)之—反射(非常重要)

什么是JDK?什么是JRE?什么是JVM?三者之間的聯(lián)系與區(qū)別

這幾個是Java中很基本很基本的東西,但是我相信一定還有很多人搞不清楚!為什么呢?因為我們大多數(shù)時候在使用現(xiàn)成的編譯工具以及環(huán)境的時候,并沒有去考慮這些東西。

JDK: 顧名思義它是給開發(fā)者提供的開發(fā)工具箱,是給程序開發(fā)者用的。它除了包括完整的JRE(Java Runtime Environment),Java運行環(huán)境,還包含了其他供開發(fā)者使用的工具包。

JRE: 普通用戶而只需要安裝JRE(Java Runtime Environment)來運行Java程序。而程序開發(fā)者必須安裝JDK來編譯、調(diào)試程序。

JVM: 當我們運行一個程序時,JVM負責將字節(jié)碼轉(zhuǎn)換為特定機器代碼,JVM提供了內(nèi)存管理/垃圾回收和安全機制等。這種獨立于硬件和操作系統(tǒng),正是java程序可以一次編寫多處執(zhí)行的原因。

區(qū)別與聯(lián)系:

JDK用于開發(fā),JRE用于運行java程序 ;

JDK和JRE中都包含JVM ;

JVM是java編程語言的核心并且具有平臺獨立性。

什么是字節(jié)碼?采用字節(jié)碼的最大好處是什么?

先看下java中的編譯器和解釋器:   

Java中引入了虛擬機的概念,即在機器和編譯程序之間加入了一層抽象的虛擬的機器。這臺虛擬的機器在任何平臺上都提供給編譯程序一個的共同的接口。編譯程序只需要面向虛擬機,生成虛擬機能夠理解的代碼,然后由解釋器來將虛擬機代碼轉(zhuǎn)換為特定系統(tǒng)的機器碼執(zhí)行。在Java中,這種供虛擬機理解的代碼叫做字節(jié)碼(即擴展名為.class的文件),它不面向任何特定的處理器,只面向虛擬機。每一種平臺的解釋器是不同的,但是實現(xiàn)的虛擬機是相同的。Java源程序經(jīng)過編譯器編譯后變成字節(jié)碼,字節(jié)碼由虛擬機解釋執(zhí)行,虛擬機將每一條要執(zhí)行的字節(jié)碼送給解釋器,解釋器將其翻譯成特定機器上的機器碼,然后在特定的機器上運行。這也就是解釋了Java的編譯與解釋并存的特點。

Java源代碼---->編譯器---->jvm可執(zhí)行的Java字節(jié)碼(即虛擬指令)---->jvm---->jvm中解釋器----->機器可執(zhí)行的二進制機器碼---->程序運行。

采用字節(jié)碼的好處:   

Java語言通過字節(jié)碼的方式,在一定程度上解決了傳統(tǒng)解釋型語言執(zhí)行效率低的問題,同時又保留了解釋型語言可移植的特點。所以Java程序運行時比較高效,而且,由于字節(jié)碼并不專對一種特定的機器,因此,Java程序無須重新編譯便可在多種不同的計算機上運行。

Java和C++的區(qū)別

我知道很多人沒學過C++,但是面試官就是沒事喜歡拿咱們Java和C++比呀!沒辦法?。?!就算沒學過C++,也要記下來!

都是面向?qū)ο蟮恼Z言,都支持封裝、繼承和多態(tài)

Java不提供指針來直接訪問內(nèi)存,程序內(nèi)存更加安全

Java的類是單繼承的,C++支持多重繼承;雖然Java的類不可以多繼承,但是接口可以多繼承。

Java有自動內(nèi)存管理機制,不需要程序員手動釋放無用內(nèi)存

接口和抽象類的區(qū)別是什么?

接口的方法默認是public,所有方法在接口中不能有實現(xiàn),抽象類可以有非抽象的方法

接口中的實例變量默認是final類型的,而抽象類中則不一定

一個類可以實現(xiàn)多個接口,但最多只能實現(xiàn)一個抽象類

一個類實現(xiàn)接口的話要實現(xiàn)接口的所有方法,而抽象類不一定

接口不能用new實例化,但可以聲明,但是必須引用一個實現(xiàn)該接口的對象 從設(shè)計層面來說,抽象是對類的抽象,是一種模板設(shè)計,接口是行為的抽象,是一種行為的規(guī)范。

成員變量與局部變量的區(qū)別有那些?

從語法形式上,看成員變量是屬于類的,而局部變量是在方法中定義的變量或是方法的參數(shù);成員變量可以被public,private,static等修飾符所修飾,而局部變量不能被訪問控制修飾符及static所修飾;但是,成員變量和局部變量都能被final所修飾;

從變量在內(nèi)存中的存儲方式來看,成員變量是對象的一部分,而對象存在于堆內(nèi)存,局部變量存在于棧內(nèi)存

從變量在內(nèi)存中的生存時間上看,成員變量是對象的一部分,它隨著對象的創(chuàng)建而存在,而局部變量隨著方法的調(diào)用而自動消失。

成員變量如果沒有被賦初值,則會自動以類型的默認值而賦值(一種情況例外被final修飾但沒有被static修飾的成員變量必須顯示地賦值);而局部變量則不會自動賦值。

重載和重寫的區(qū)別

重載: 發(fā)生在同一個類中,方法名必須相同,參數(shù)類型不同、個數(shù)不同、順序不同,方法返回值和訪問修飾符可以不同,發(fā)生在編譯時。   

重寫: 發(fā)生在父子類中,方法名、參數(shù)列表必須相同,返回值范圍小于等于父類,拋出的異常范圍小于等于父類,訪問修飾符范圍大于等于父類;如果父類方法訪問修飾符為private則子類就不能重寫該方法。

字符型常量和字符串常量的區(qū)別

1) 形式上:
字符常量是單引號引起的一個字符
字符串常量是雙引號引起的若干個字符
2) 含義上:
字符常量相當于一個整形值(ASCII值),可以參加表達式運算
字符串常量代表一個地址值(該字符串在內(nèi)存中存放位置)
3) 占內(nèi)存大小
字符常量只占一個字節(jié)
字符串常量占若干個字節(jié)(至少一個字符結(jié)束標志)

資源分享

精選互聯(lián)網(wǎng)架構(gòu)師視頻、十多套精選實戰(zhàn)項目視頻、黑馬內(nèi)部視頻、極客學院+北風網(wǎng)+黑馬大數(shù)據(jù)工程師視頻、5套精選Java面試指南視頻等等。

關(guān)注微信公眾號“Java面試通關(guān)手冊”回復(fù)關(guān)鍵字“1"即可免費領(lǐng)?。?/strong>

開源文檔推薦

Java-Guide: Java面試通關(guān)手冊(Java學習指南)Java Interview Customs Manual (Java Study Guide)。star:1.9k。

Github地址:https://github.com/Snailclimb/Java-Guide

文檔定位:一個專門為Java后端工程師準備的開源文檔,相信不論你是Java新手還是已經(jīng)成為一名Java工程師都能從這份文檔中收獲到一些東西。

參考:

https://segmentfault.com/a/11...

https://blog.csdn.net/sinat_3...

你若盛開,清風自來。 歡迎關(guān)注我的微信公眾號:“Java面試通關(guān)手冊”,一個有溫度的微信公眾號。公眾號有大量資料,回復(fù)關(guān)鍵字“1”你可能看到想要的東西哦!

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/76724.html

相關(guān)文章

  • 常見Java基礎(chǔ)知識面試總結(jié)

    摘要:地址面試必備最最最常見的面試題總結(jié)第一周一中的值傳遞和引用傳遞非常重要首先要明確的是對象傳遞數(shù)組類接口是引用傳遞,原始類型數(shù)據(jù)整型浮點型字符型布爾型傳遞是值傳遞。這個哈希碼的作用是確定該對象在哈希表中的索引位置。 showImg(https://segmentfault.com/img/remote/1460000015923339?w=922&h=519); 這里會分享一些出現(xiàn)頻率極...

    syoya 評論0 收藏0
  • 【回顧九月份二周】 前端你該知道事兒

    摘要:順便一說,這首歌的原唱是秋田,中島當年嗓子壞了,才有這歌。中文是直接翻譯來的,作曲是秋田。一部電影春夏秋冬又一春春夏秋冬又一春是由金基德執(zhí)導(dǎo),金英民吳英秀金基德主演的一部韓國電影。年月日于韓國上映。 原鏈接: http://bluezhan.me/weekly/#/9-2 1、web前端 Angular vs. React vs. Vue: A 2017 comparison 9 S...

    sixgo 評論0 收藏0
  • 【回顧九月份二周】 前端你該知道事兒

    摘要:順便一說,這首歌的原唱是秋田,中島當年嗓子壞了,才有這歌。中文是直接翻譯來的,作曲是秋田。一部電影春夏秋冬又一春春夏秋冬又一春是由金基德執(zhí)導(dǎo),金英民吳英秀金基德主演的一部韓國電影。年月日于韓國上映。 原鏈接: http://bluezhan.me/weekly/#/9-2 1、web前端 Angular vs. React vs. Vue: A 2017 comparison 9 S...

    levius 評論0 收藏0

發(fā)表評論

0條評論

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