亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

每日幾道java新手入門(mén)面試題,通往自由的道路

 更新時(shí)間:2021年07月05日 14:38:32   作者:興趣使然的草帽路飛  
這篇文章主要為大家分享了最有價(jià)值的是幾道java面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,對(duì)hashCode方法的設(shè)計(jì)、垃圾收集的堆和代進(jìn)行剖析,感興趣的小伙伴們可以參考一下

1、請(qǐng)你說(shuō)一下什么是面向?qū)ο螅?/h2>

Java是面向?qū)ο蟮木幊陶Z(yǔ)言,不同于C語(yǔ)言是面向過(guò)程的。對(duì)于面向?qū)ο蠛兔嫦蜻^(guò)程的區(qū)別,舉一個(gè)簡(jiǎn)單的例子說(shuō)明一下(我們以洗衣機(jī)洗衣服為例):

面向過(guò)程:面向過(guò)程的編程方式,程序會(huì)將要完成的某一個(gè)任務(wù)拆解成一系列的小步驟 (函數(shù)),如:

  • ① 打開(kāi)洗衣機(jī):method01()
  • ② 放入要洗的衣服:method02()
  • ③ 放入洗衣服:method03()
  • ④ 清洗:method04()
  • ⑤ 烘干:method05()

面向?qū)ο螅好嫦驅(qū)ο蟮木幊谭绞剑绦驎?huì)將要完成的洗衣機(jī)洗衣服的任務(wù)拆分成如下兩個(gè)對(duì)象:

  • 人(Person):Person在洗衣機(jī)洗衣服這個(gè)程序任務(wù)中有三個(gè)作用,分別是打開(kāi)洗衣機(jī)、放入要洗的衣服、放入洗衣粉。
  • 洗衣機(jī)(Machine):Machine在洗衣機(jī)洗衣服這個(gè)程序任務(wù)中有兩個(gè)作用,分別是清洗烘干。

從上面這個(gè)例子能看出,面向過(guò)程的編程方式比較直接且高效,而面向?qū)ο蟮木幊谭绞礁讖?fù)用、擴(kuò)展和維護(hù)!

2、請(qǐng)你簡(jiǎn)述一下面向?qū)ο蟮娜齻€(gè)基本特征?

繼承:承是Java中面向?qū)ο笞铒@著的一個(gè)特征,繼承是從已有的類中派生出新的類,新的類可以吸收已有的屬性、行為,并擴(kuò)展新的能力。Java中不支持多繼承,但是接口可以支持多實(shí)現(xiàn)。

封裝:將同一類事物的特征和功能包裝在一起,只對(duì)外暴露需要調(diào)用的接口。封裝也稱為信息的隱藏,在Java中接口是體現(xiàn)封裝最常用的方法,在接口中我們沒(méi)有任何功能的實(shí)現(xiàn)(具體實(shí)現(xiàn)都交給實(shí)現(xiàn)類),只是定義了一系列抽象的方法聲明用于外部調(diào)用。

多態(tài):封裝和繼承都是為多態(tài)來(lái)服務(wù)的,多態(tài)是指同一個(gè)行為具有多個(gè)不同的表現(xiàn)形式。在Java中方法的重載和重寫(xiě)是實(shí)現(xiàn)多態(tài)的2種方式。

重載發(fā)生在一個(gè)類中,同名的方法如果有不同的參數(shù)列表(參數(shù)類型不同、參數(shù)個(gè)數(shù)不同或者二者都不同)則視為重載。方法重載體現(xiàn)了編譯時(shí)的多態(tài)性。

  • 重寫(xiě)發(fā)生在子類與父類之間,重寫(xiě)要求子類被重寫(xiě)方法與父類被重寫(xiě)方法有相同的返回類型,重載對(duì)返回類型沒(méi)有特殊的要求。方法重寫(xiě)體現(xiàn)了運(yùn)行時(shí)的多態(tài)性。
  • 多態(tài)的三要素:繼承 、重寫(xiě)、父類指向子類引用!

3、為什么說(shuō) Java 是一種半解釋半編譯的程序設(shè)計(jì)語(yǔ)言呢?

什么是編譯形語(yǔ)言,什么又是解釋形語(yǔ)言?

  • 編譯型語(yǔ)言:把做好的源程序全部編譯成二進(jìn)制代碼的可運(yùn)行程序。然后,就可以直接運(yùn)行這個(gè)程序。執(zhí)行速度快效率高,依靠編譯器,跨平臺(tái)性稍差
  • 解釋型語(yǔ)言:把已經(jīng)做好的源程序,翻譯一句,執(zhí)行一句,直到結(jié)束。執(zhí)行速度慢效率低,依靠編譯器,但是跨平臺(tái)性稍好。

那么為什么說(shuō)Java 是編譯型語(yǔ)言呢?

第一個(gè)觀點(diǎn)認(rèn)為 Java 是編譯型語(yǔ)言,因?yàn)镴ava程序想要運(yùn)行,那么第一步就是要使用Javac進(jìn)行編譯(將Java源文件編譯成.class二進(jìn)制文件)。沒(méi)有經(jīng)過(guò)編譯的.java文件,是沒(méi)辦法運(yùn)行的!

那么為什么又說(shuō)Java 是解釋型語(yǔ)言呢?

那么第二個(gè)觀點(diǎn)則是認(rèn)為Java是解釋型語(yǔ)言,Java經(jīng)過(guò)編譯,Javac .java源文件編譯成.class二進(jìn)制文件之后,仍然需要借助 JVM 的解釋執(zhí)行。

綜合上面兩個(gè)觀點(diǎn)來(lái)看,Java似乎既有編譯型語(yǔ)言的特點(diǎn),又有解釋型語(yǔ)言的特點(diǎn),也沒(méi)有看到哪本權(quán)威的書(shū)籍上認(rèn)定Java就是哪一種類型的語(yǔ)言。

4、請(qǐng)你說(shuō)一下Java中的8大基本類型是那些?

如圖所示:

8種基本數(shù)據(jù)類型和取值范圍:

基本類型 大小(位/bit) 字節(jié)數(shù)(byte) 最小值 最大值 默認(rèn)值 包裝器類型
boolean - - false true false Boolean
char 16 bits 2 bytes Unicode 0 Unicode 2^16-1 Character
byte 8 bits 1 byte -2^7 2^7-1 0 Byte
short 16 bits 2 bytes -2~15 2^15-1 0 Short
int 32 bits 4 bytes -2^31 2^31-1 0 Integer
long 64 bits 8 bytes -2^63 2^63-1 0 Long
float 32 bits 4 bytes 0.0 Fload
double 64 bits 8 bytes 0.0 Double

注意:對(duì)于boolean值,在Java規(guī)范中并沒(méi)有給出其儲(chǔ)存大小,在《Java虛擬機(jī)規(guī)范》中給出了4個(gè)字節(jié),和boolean數(shù)組1個(gè)字節(jié)的定義,具體還要看虛擬機(jī)實(shí)現(xiàn)是否按照規(guī)范來(lái),所以1個(gè)字節(jié)、4個(gè)字節(jié)都是有可能的。除了void之外,其他8種基本數(shù)據(jù)類型被稱為八大基本數(shù)據(jù)類型。

圖中從左向右的轉(zhuǎn)換都是隱式轉(zhuǎn)換,無(wú)需再代碼中進(jìn)行強(qiáng)制轉(zhuǎn)換。從右向左均要進(jìn)行強(qiáng)制類型轉(zhuǎn)換,才能通過(guò)編譯。強(qiáng)制轉(zhuǎn)換會(huì)丟失精度。

5、請(qǐng)你講講抽象類和接口有什么區(qū)別?

(一) 繼承方面:

  • 抽象類只能單繼承;而接口可以多實(shí)現(xiàn);

(二) 成員屬性方面

  • 抽象類中可以有普通屬性,也可以有常量;
  • 接口中的成員變量全部默認(rèn)是常量,使用public static final修飾,這個(gè)可以省略不寫(xiě);

(三) 代碼塊方面:

  • 抽象類可以含初始化塊;接口不能含初始化塊;

(四) 構(gòu)造函數(shù)方面:

  • 抽象類可以有構(gòu)函數(shù),但是這里的構(gòu)造函數(shù)不是用來(lái)創(chuàng)建對(duì)象的,而且用來(lái)被實(shí)現(xiàn)類調(diào)用進(jìn)行初始化操作的;
  • 接口不能有構(gòu)造函數(shù);

(五) 方法方面:

  • 接口在JDK1.8之后可以定義抽象方法(無(wú)方法體)、default 修飾的默認(rèn)方法(有方法體)、static修飾的靜態(tài)方法(有方法體),

JDK1.8以前是只能有抽象方法。

public interface Test { 
    static void test() { 
    } 
    default void test2(){ 
    } 
    void test3();// 默認(rèn)是abstract修飾 
}

抽象類中除了靜態(tài)方法和抽象方法外還可以有普通方法。

二者相同之處

  • 接口與抽象類都不能被實(shí)例化,需要被其他進(jìn)行實(shí)現(xiàn)或繼承。
  • 接口與抽象類里面都能包含抽象方法,實(shí)現(xiàn)接口或繼承抽象類的子類都必須實(shí)現(xiàn)這些抽象方法。

6、請(qǐng)判斷當(dāng)一個(gè)對(duì)象被當(dāng)作參數(shù)傳遞給一個(gè)方法后,此方法可改變這個(gè)對(duì)象的屬性,并可返回變化后的結(jié)果,那么這里到底是值傳遞還是引用傳遞?

是值傳遞。java 編程語(yǔ)言只有值傳遞參數(shù)。當(dāng)一個(gè)對(duì)象實(shí)例作為一個(gè)參數(shù)被傳遞到方法中時(shí),參數(shù)的值就是對(duì)該對(duì)象的引用。對(duì)象的內(nèi)容可以在被調(diào)用的方法中改變,但對(duì)象的引用是永遠(yuǎn)不會(huì)改變的。

java中只有值傳遞,基本類型傳遞的是值的副本,引用類型傳遞的是引用的副本

7、請(qǐng)你說(shuō)一下JVM/JRE/JDK的區(qū)別?

直接看一張圖就可以理解他們的區(qū)別了:

  • JVM = Java虛擬機(jī)
  • JRE = JVM + 基礎(chǔ)類庫(kù)
  • JDK = JVM + 基礎(chǔ)類庫(kù) + 編譯工具

8、請(qǐng)你說(shuō)一下方法重載和方法重寫(xiě)的區(qū)別?

重載:方法重載發(fā)生在同一個(gè)類中,重載的方法之間方法名必須相同,參數(shù)列表不同(參數(shù)的類型、參數(shù)的個(gè)數(shù)),方法的返回值和訪問(wèn)修飾符可以不同,發(fā)生在編譯時(shí)期(方法重載實(shí)現(xiàn)了編譯時(shí)多態(tài))。

重寫(xiě):方法重寫(xiě)發(fā)生在子父類中,子類重寫(xiě)父類的方法,方法名稱必須相同,參數(shù)列表也必須相同,方法的返回值小于等于父類方法的返回值,訪問(wèn)修飾符方位大于等于父類方法(如果父類方法修飾符為private,則子類就無(wú)法重寫(xiě)了)。

9、請(qǐng)你說(shuō)一下List接口和Set接口的區(qū)別?

  • List:有序、可重復(fù)集合。按照對(duì)象插入的順尋保存數(shù)據(jù),允許多個(gè)Null元素對(duì)象,可以使用iterator迭代器遍歷,也可以使用get(int index)方法獲取指定下標(biāo)元素。
  • Set:無(wú)序、不可重復(fù)集合只允許有一個(gè)Null元素對(duì)象,取元素時(shí),只能使用iterator迭代器逐一遍歷。
  • Map: key-value 鍵值對(duì)形式的集合,添加或獲取元素時(shí),需要通過(guò)key來(lái)檢索到value。

Collecttion 集合體系結(jié)構(gòu)簡(jiǎn)圖:

在這里插入圖片描述

10、為什么重寫(xiě)了equals()方法還需要重寫(xiě)hashCode()方法?

equals()只是判斷對(duì)象屬性是否相同,hashCode()要判斷二者地址是否相同。java中如果要判斷兩個(gè)對(duì)象是否相等,需要同時(shí)滿足地址 + 屬性都相同!

  • 如果兩個(gè)對(duì)象相同(即:用 equals() 比較返回true),那么它們的 hashCode 值一定要相同;
  • 如果兩個(gè)對(duì)象的 hashCode 相同,它們并不一定相同;

舉例子:

只重寫(xiě) equals() 方法,不重寫(xiě) hashcode() 方法:

public class Student {
	private String name;
	private int age;
	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	// 省略 get,set方法...
}

執(zhí)行下面的程序看看效果:

public class hashTest {
	@Test
	public void test() {
		Student stu1 = new Student("Jimmy",24);
		Student stu2 = new Student("Jimmy",24);
		System.out.println("兩位同學(xué)是同一個(gè)人嗎?"+stu1.equals(stu2));
		System.out.println("stu1.hashCode() = "+stu1.hashCode());
		System.out.println("stu1.hashCode() = "+stu2.hashCode());
	}
}

如果重寫(xiě)了 equals() 而未重寫(xiě) hashcode() 方法,可能就會(huì)出現(xiàn)兩個(gè)沒(méi)有關(guān)系的對(duì)象 equals 相同(因?yàn)?strong>equals都是根據(jù)對(duì)象的特征進(jìn)行重寫(xiě)的),但 hashcode 不相同的情況。因?yàn)榇藭r(shí) Student 類的 hashcode() 方法就是 Object 默認(rèn)的 hashcode()方 法,由于默認(rèn)的 hashcode()方法是根據(jù)對(duì)象的內(nèi)存地址經(jīng)哈希算法得來(lái)的,所以 stu1 != stu2,故兩者的 hashcode 值不一定相等。

根據(jù) hashcode 的規(guī)則,兩個(gè)對(duì)象相等其 hash 值一定要相等,矛盾就這樣產(chǎn)生了。上面我們已經(jīng)解釋了為什么要使用 hashcode 算法,所以即使字面量相等,但是產(chǎn)生兩個(gè)不同的 hashCode 值顯然不是我們想要的結(jié)果。

如果我們?cè)谥貙?xiě) equals() 時(shí),也重寫(xiě)了 hashCode() 方法:

public class Student {
	private String name;
	private int age;
	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	// 省略 get,set方法...
}

再來(lái)看執(zhí)行結(jié)果:

兩位同學(xué)是同一個(gè)人嗎?true
stu1.hashCode() = 71578563
stu1.hashCode() = 71578563

從 Student 類重寫(xiě)后的 hashcode() 方法中可以看出,重寫(xiě)后返回的新的 hash 值與 Student 的兩個(gè)屬性是有關(guān),這樣就確保了對(duì)象和對(duì)象地址之間的關(guān)聯(lián)性。

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • 使用maven命令實(shí)現(xiàn)下載依賴jar

    使用maven命令實(shí)現(xiàn)下載依賴jar

    這篇文章主要介紹了使用maven命令實(shí)現(xiàn)下載依賴jar方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 使用log4j2打印mybatis的sql執(zhí)行日志方式

    使用log4j2打印mybatis的sql執(zhí)行日志方式

    這篇文章主要介紹了使用log4j2打印mybatis的sql執(zhí)行日志方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • MybatisPlus使用queryWrapper如何實(shí)現(xiàn)復(fù)雜查詢

    MybatisPlus使用queryWrapper如何實(shí)現(xiàn)復(fù)雜查詢

    這篇文章主要介紹了MybatisPlus使用queryWrapper如何實(shí)現(xiàn)復(fù)雜查詢,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
    2022-01-01
  • IntelliJ IDEA 2020安裝使用教程詳解

    IntelliJ IDEA 2020安裝使用教程詳解

    這篇文章主要介紹了IntelliJ IDEA 2020安裝使用教程,本文通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • 混亂的Java日志體系及集成jar包梳理分析

    混亂的Java日志體系及集成jar包梳理分析

    這篇文章主要詳細(xì)的為大家梳理分析了剪不斷理還亂的Java日志體系,以及日志系統(tǒng)涉及到的繁雜的各種集成?jar?包,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-03-03
  • RocketMQ?broker?消息投遞流程處理PULL_MESSAGE請(qǐng)求解析

    RocketMQ?broker?消息投遞流程處理PULL_MESSAGE請(qǐng)求解析

    這篇文章主要為大家介紹了RocketMQ?broker?消息投遞流程處理PULL_MESSAGE請(qǐng)求源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • java使用htmlparser提取網(wǎng)頁(yè)純文本例子

    java使用htmlparser提取網(wǎng)頁(yè)純文本例子

    這篇文章主要介紹了java使用htmlparser提取網(wǎng)頁(yè)純文本例子,需要的朋友可以參考下
    2014-04-04
  • Java服務(wù)假死后續(xù)之內(nèi)存溢出的原因分析

    Java服務(wù)假死后續(xù)之內(nèi)存溢出的原因分析

    這篇文章主要介紹了Java服務(wù)假死后續(xù)之內(nèi)存溢出,本文給大家分享原因排查和故障解決方法,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • MyBatis如何使用PageHelper實(shí)現(xiàn)分頁(yè)查詢

    MyBatis如何使用PageHelper實(shí)現(xiàn)分頁(yè)查詢

    這篇文章主要介紹了MyBatis如何使用PageHelper實(shí)現(xiàn)分頁(yè)查詢,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • java如何刪除非空文件夾

    java如何刪除非空文件夾

    這篇文章主要介紹了java如何刪除非空文件夾問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06

最新評(píng)論