天天看點

Java基礎面試題幹貨系列(一)Java基礎

創作不易,如果覺得這篇文章對你有幫助,各位老鐵點個贊呗,您的支援是我創作的最大動力!

文章目錄

  • Java基礎
    • 前言
    • 1 下面的代碼建立了幾個對象
    • 2 String對象是如何保證其對象的内容不可改變
    • 3 計算機組成有哪些
    • 4 計算機存儲機關換算關系
    • 5 Java語言特性
    • 6 Java中,JDK、JRE、JVM各自是什麼,以及之間有什麼關系
    • 7 Java的加載與執行
    • 8 Java關鍵字有哪些?
    • 9 Java中辨別符
    • 10 Java字元編碼

Java基礎

前言

最近,感覺壓力比較大,是以挑戰下基礎面試題,加深下自己對基礎知識的了解。Java基礎知識實在是太多了,這裡打算持續更新,總結下常見的面試題。

部落客打算每期更新10個知識點,後續慢慢疊代更新。

注:

前期是以知識點總結為主,裡面會混合一些實際的面試題。部落客這裡總結的目的在于,應付面試的同時,可以鞏固自己的基礎知識,工作幾年的人都知道,如果稍微不留神,慢慢的,你的基礎知識忘記的差不多了

1 下面的代碼建立了幾個對象

以上代碼,實際上建立了2個對象,JVM首先會在對象池中建立一個對象,然後根據對象池中的對象,在堆中建立一個對象。

String str1 = new String("Hello");
String str2 = new String("Hello");
           

這段代碼,實際上建立了3個對象,JVM首先會在對象池中建立一個對象,而對象池中的對象,都是被共享的,是以str1和str2在對象池中,其實是同一個對象。通過new的方式,在堆中,又建立了對象str1,對象str2,str1和str2這兩個引用,屬于不同的記憶體位址,堆中建立了2個對象,綜上所述,以上代碼片建立了3個對象。

2 String對象是如何保證其對象的内容不可改變

這個問題在基礎中,也算是很常見的了,這裡做一下總結。

看本例子之前,給夥伴們腦補下基礎知識:

==

在基本資料類型中,比較的值是否相等,在引用資料類型中,比較的是記憶體位址是否相等(也即是執行的是不是同一個對象)。而

equals

比較的内容是否相等

private static void test8() {
		String str1 = new String("hello");
		String str2 = new String("hello");
		String str3 = str1;

		// str1和str2都使用new建立了對象,是以JVM會在堆中會建立兩個不同的對象,是以屬于不同的記憶體空間,str1和str2指向堆中的是,兩個不同的記憶體位址,是以結果為false
		System.out.println("str1 == str2:" + (str1 == str2));// false
		// 這個輸出語句str1.equals(str2)是調用了String類中的equals方法,該方法用于比較兩個字元串對象的内容是否相等,結果為true。
		System.out.println("str1.equals(str2):" + str1.equals(str2));// true

		// 将str1指派給了str3,指的是将str1對象的引用,指派給了str3,這時候str1和str3,記憶體位址相同,指向堆中的同一塊記憶體,是以這裡傳回true
		System.out.println("str1 == str3:" + (str1 == str3));// true
		// str1和str3指向堆中的同一塊記憶體,是以值的内容相等,結果是true
		System.out.println("str1.equals(str3):" + str1.equals(str3));// true

		// 重點來了,String對象的不可變特性,這裡修改了str1的内容
		str1 = "world";

		// 對于上面的 String str3 = str1
		// 這一行代碼,小夥伴們會不會有這樣的疑問,既然str1和str3具有相同的記憶體位址,引用的是堆中的同一個對象,為什麼str1的值被改變了,str3的值并不會被改變呢?
		System.out.println("str1的值 = :" + str1);// str1的值 = :world
		System.out.println("str3的值 = :" + str3);// str3的值 = :hello

		// 這裡修改了str1的内容,這就涉及到了Java中String對象的不可變性
		System.out.println("str1 == str3:" + (str1 == str3));// false
		// 這裡内容已經不一樣了,是以傳回false
		System.out.println("str1.equals(str3):" + str1.equals(str3));// false
	}
           

該怎麼了解Java中String對象的不可變性呢,簡單來說就是:

一旦一個String對象被建立并且被初始化(指派)了,這個對象的值就不會再改變

一旦一個String對象在記憶體中建立,它将是不可改變的,所有的String類中方法并不是改變String對象自己,而是重新建立一個新的String對象。

也就是說str1 = “world”,并不是改變了原有對象的值,而是在對象池中,建立了一個新的字元串共享對象,這個對象的值是world,并把這個對象的引用指派給了str1,而str3這個引用依然指向的是原來的那個對象,是以這時候str1和str3是兩個不同的記憶體位址。

總結:

一個String對象在堆記憶體中建立以後,就不能被改變了。正因為

String對象的不可變性

,如果需要對字元串進行大量的修改、添加字元、删除字元等操作時,盡量不要使用String對象,因為這樣會頻繁的建立新的String對象,浪費大量的不必要的記憶體,也需要耗時來執行垃圾回收,進而導緻程式的執行效率下降。

如果我們需要可改變的字元串,則需要使用字元串生成器StringBuffer或者StringBuilder。

注意:String對象的所有方法都不會改變其本身,而是會傳回一個新的String對象

想要了解更多,可以檢視我的另一篇博文:Java中的String是不可變的

3 計算機組成有哪些

  • 硬體

    硬體又包含:

    輸入裝置

    輸出裝置

    儲存設備

    CPU

    其他裝置

    輸入裝置常見的:滑鼠、鍵盤、麥克風………

    輸出裝置常見的:顯示器、音響、列印機……

    儲存設備常見的:硬碟、記憶體條、U盤……

    CPU(中央處理器)包含:運算器、控制器

    其他裝置常見的:機箱

  • 軟體

    軟體又分為:

    系統軟體

    應用軟體

    系統軟體常見的:Win7、Win10、Win8、Linux、Mac

    應用軟體常見的:QQ、微信等

    應用軟體包含兩種結構:

    C/S(Client/Server):用戶端/伺服器

    先下載下傳,然後在安裝,最後才可以使用,如:Idea…

    B/S(Browser/Server):浏覽器/伺服器

    如:淘寶、JD……

4 計算機存儲機關換算關系

計算機中使用二進制存儲資訊,也就是0和1,而平時呢,我們使用最多的是十進制。底層中,一個位元組使用8個二進制位去存儲。

機關換算關系:

大機關 小機關
1byte 8bit
1KB 1024byte
1MB 1024KB
1GB 1024MB
1TB 1024GB

5 Java語言特性

  • 簡單

    Java舍棄了C++中難以掌握并不安全的功能,如:指針、多繼承等

    Java語言底層是C++實作的

  • 面向對象

    Java和C++一樣,是一種面向對象程式設計語言

  • 安全性

    如:運作時堆棧溢出,強制類型檢查

  • 健壯性

    Java語言在運作過程中産生的垃圾會自動回收,簡稱GC機制。而C語言沒有自動回收機制,申請的資源,需要手動回收。

  • 可移植性

    Java程式編譯一次,不做任何修改時可以到處運作,也就是跨平台。隻需要在不同作業系統上安裝不同JVM

6 Java中,JDK、JRE、JVM各自是什麼,以及之間有什麼關系

JDK:Java開發工具包,裡面有好多類庫,開發時可以直接使用。另外,JDK裡含有JRE。

JRE:Java的運作時環境。跟客戶部署應用時,其實隻配置JRE環境即可運作。

JVM:Java虛拟機(不能單獨安裝),JVM在不同的環境下版本略有不同。

7 Java的加載與執行

Java加載執行過程:首先通過源碼檔案(.java字尾),手動或者通過ide把源檔案編譯為位元組碼(.class字尾)檔案,JVM通過類加載器運作位元組碼檔案,把位元組碼檔案解釋為1001等二進制,與不同環境下的底層系統進行互動。

如下圖所示:

Java基礎面試題幹貨系列(一)Java基礎

Java關鍵字是電腦語言裡事先定義的,有特别意義的辨別符,有時又叫保留字,還有特别意義的變量。Java的關鍵字對Java的編譯器有特殊的意義,他們用來表示一種資料類型,或者表示程式的結構等,關鍵字不能用作變量名、方法名、類名、包名和參數。

8 Java關鍵字有哪些?

Java關鍵字是電腦語言裡事先定義的,有特别意義的辨別符,有時又叫保留字,還有特别意義的變量。Java的關鍵字對Java的編譯器有特殊的意義,他們用來表示一種資料類型,或者表示程式的結構等,關鍵字不能用作變量名、方法名、類名、包名和參數。

java中關鍵字共53個(其中包含兩個保留字const,goto),另外,Java還有3個保留字:true、false、null。它們不是關鍵字,而是文字。和關鍵字一樣,它們也不可以作為辨別符使用。

Java關鍵字與含義基礎對照:

關鍵字 含義

abstract

表明類或者成員方法具有抽象屬性
assert 斷言,用來進行程式調試

boolean

基本資料類型之一,布爾類型

break

提前跳出一個塊
byte 基本資料類型之一,位元組類型

case

用在switch語句之中,表示其中的一個分支

catch

用在異常進行中,用來捕捉異常
char 基本資料類型之一,字元類型

class

聲明一個類
const 保留關鍵字,沒有具體含義

continue

回到一個塊的開始處
default 預設,例如,用在switch語句中,表明一個預設的分支,也可用在接口中預設方法(jdk1.8以後)

do

用在do-while循環結構中

double

基本資料類型之一,雙精度浮點數類型

else

用在條件語句中,表明當條件不成立時的分支

enum

枚舉

extends

表明一個類型是另一個類型的子類型,這裡常見的類型有類和接口

final

用來說明最終屬性,表明一個類不能派生出子類,或者成員方法不能被覆寫,或者成員域的值不能被改變,用來定義常量

finally

用于處理異常情況,用來聲明一個基本肯定會被執行到的語句塊
float 基本資料類型之一,單精度浮點數類型

for

一種循環結構的引導詞
goto 保留關鍵字,沒有具體含義

if

條件語句的引導詞

implements

表明一個類實作了給定的接口

import

表明要通路指定的類或包

instanceof

用來測試一個對象是否是指定類型的執行個體對象

int

基本資料類型之一,整數類型

interface

接口

long

基本資料類型之一,長整數類型
native 用來聲明一個方法是由與計算機相關的語言(如C/C++/FORTRAN語言)實作的

new

用來建立新執行個體對象

package

private

一種通路控制方式:私用模式

protected

一種通路控制方式:保護模式

public

一種通路控制方式:共用模式

return

從成員方法中傳回資料
short 基本資料類型之一,短整數類型

static

表明具有靜态屬性
strictfp 用來聲明FP_strict(單精度或雙精度浮點數)表達式遵循IEEE 754算術規範

super

表明目前對象的父類型的引用或者父類型的構造方法

switch

分支語句結構的引導詞

synchronized

表明一段代碼需要同步執行

this

指向目前執行個體對象的引用

throw

抛出一個異常

throws

聲明在目前定義的成員方法中所有需要抛出的異常
transient 聲明不用序列化的成員域

try

嘗試一個可能抛出異常的程式塊

void

聲明目前成員方法沒有傳回值
volatile 表明兩個或者多個變量必須同步地發生變化

while

用在循環結構中

關鍵字參考原文連結:https://blog.csdn.net/Myuhua/article/details/81411707

9 Java中辨別符

定義:在Java中,可以自己命名的都是辨別符。辨別符就是一個名字,可以對類名(接口名)、變量名稱、方法名稱、參數名稱等進行修飾。

這個知識點一般在面試的筆試題中會遇到。

辨別符的命名規則:

  • 辨別符由數字、字母、下劃線_或$組成
  • 辨別符必須以字母、下劃線或者美元符号$開頭,不能以數字開頭。
  • Java關鍵字不能作為辨別符
  • 辨別符區分大小寫
  • 辨別符理論上沒有長度限制,但是,最好見名知意,不要太長,否則影響可讀性

10 Java字元編碼

字元編碼定義:

字元編碼按某種格式某種規定将資料存在計算機中。是現實世界中文字和計算機轉換規則的表示方式。

常用字元編碼:

  • GB2312 / GBK / GB18030

    都是中文編碼,這三種編碼從容量上來看,是一種包含關系,從左至右,容量有小到大。

    這三種字元集的主要差別,可參考連結:https://www.zhihu.com/question/19677619

  • ISO-8859-1

    主要是西歐語言中的字元編碼,相容ASCII

  • ASCII

    定義:ASCII ((American Standard Code for Information Interchange): 美國資訊交換标準代碼)是基于拉丁字母的一套電腦編碼系統,主要用于顯示現代英語和其他西歐語言。它是最通用的資訊交換标準,并等同于國際标準ISO/IEC 646。ASCII第一次以規範标準的類型發表是在1967年,最後一次更新則是在1986年,到目前為止共定義了128個字元。

    ASCII碼值:65~90為26個大寫英文字母(控制字元),97~122号為26個小寫英文字母(控制字元)

    比如:英文小寫字母a對應的值97,b對應的值98。英文大寫字母A對應的碼值65,B對應的碼值66。控制字元0,對應的碼值為48

    想了解更詳細的ASCII碼,可以看考博文:ASCII碼

  • Unicode

    統一全球所有國家的文字編碼

    Unicode編碼共有三種具體實作:

    分别為utf-8,utf-16,utf-32,其中utf-8占用一到四個位元組,utf-16占用二或四個位元組,utf-32占用四個位元組。Unicode 碼在全球範圍的資訊交換領域均有廣泛的應用。

    char字元

    ,底層占用兩個位元組,采用的是Unicode編碼,實作方式為UTF-16。

    注意:java源代碼采用Unicode編碼

寫部落格是為了記住自己容易忘記的東西,另外也是對自己工作的總結,希望盡自己的努力,做到更好,大家一起努力進步!

如果有什麼問題,歡迎大家一起探讨,代碼如有問題,歡迎各位大神指正!

給自己的夢想添加一雙翅膀,讓它可以在天空中自由自在的飛翔!