1. 程式人生 > >java面試②基礎部分

java面試②基礎部分

實現 原則 setname ets works 簡單 htable 工廠 ==

2.1.1 簡單講一下java的跨平臺原理

由於各操作系統(windows,linux)支持的指令集,不是完全一致的,就會讓我們的程序在不同的操作系統上要執行不同程序代碼,java開發了適用不同操作系統及位數的java虛擬機來屏蔽系統之間的差異,提供了統一的接口,對於我們java開發者而言,你只需要在不同的系統上安裝對應的不同java虛擬機,這時你的java程序只要遵循java規範就可以在所有的操作系統上面運行java程序。

java通過不同的系統,不同版本,不同位數的java虛擬機(jvm),來屏蔽不同系統指令集差異而對外體現統一的接口(java API),對於我們普通java開發者而言,只需要按照接口開發即可,如果我系統需要部署不同的環境時,只需要在系統上按照對應版本虛擬機即可。

2.1.2 搭建一個java開發環境的步驟

java開發環境需要些什麽?

1. 適用我們開發環境的jdk

2. 對應開發環境eclipse

3. 需要web服務器(tomcat)

1)、下載對應組件

2)、安裝

jdk,安裝正常流程即可,配置我們的JAVA_HOME,因為後面的eclipse和tomcat會依賴這個變量。

Eclipse正常解壓就OK,設置workspace的默認編碼

Tomcat正常解壓就ok,把tomcat集成到eclipse中,安裝插件就OK,

....

svn/git

2.1.3 講一下java中int數據占幾個字節

java中有幾種基本數據類型?

8種

2.1.4. 面向對象的特征有哪些方面

有四大基本特征:封裝、抽象、繼承、多態

1)封裝,即將對象封裝成一個高度自治和相對封閉的個體,對象狀態(屬性)由這個對象自己的行為(方法)來讀取和改變。

張三這個人,他的姓名等屬性,要有自己提供的獲取和改變的方法來操作,(getter,setter)

2)抽象就是找出一些事物的相似和共性之處,然後將這些事物歸為一個類,這個類只考慮這些事物的相似和共性之處,並且會忽略與當前主題和目標無關的那些方面,將註意力集中在與當前目標有關的方面。

就是把現實生活中的對象,抽象為類。

3)在定義一個類的時候,可以在一個已經存在的類的基礎之上來進行,把這個已經存在的類所定義的內容作為自己的內容,並可以加入若幹新的內容,或修改原來的方法使之更適合特殊的需要,這就是繼承

4)多態是指程序中定義的引用變量所指向的具體類型和通過該引用變量發出的方法調用在編程時並不確定,而是在程序運行期間才確定,即一個引用變量倒底會指向哪個類的實例對象,該引用變量發出的方法調用到底是哪個類中實現的方法,必須在由程序運行期間才能決定。

靠的是父類或者接口的引用變量可以指向子類或者具體實現類的實例對象,而程序調用的方法在運行期間才動態綁定,就是引用變量所指向的具體實例對象的方法,也就是內存裏正在運行的那個對象的方法,而不是引用變量的類型定義的方法。

原則:圍著比較抽象問題的時候,要舉例說明

2.1.5 有了基本數據類型,為什麽還要包裝類型?

基本數據類型,java中提供了8中基本數據類型,boolean int float等

包裝類型:每一個基本數據類型都會一一對應一個包裝類型,

boolean—Boolean

int—Integer

裝箱和拆箱

把基本的數據類型轉換成對應的包裝類型,

Integer i = 1;自動裝箱,實際上在編譯時會調用Integer.valueOf方法來裝箱

拆箱:就是把包裝類型轉換為基本數據類型, 基本數據類型 名稱 = 對應的包裝類型。

int j = i 自動拆箱

int j = i.intValue()手動拆箱

自動拆箱:實際上會在編譯調用intValue

java是一個面向對象的語言,而基本的數據類型,不具備面向對象的特性。

Null Integer-->null int-->0 用Integer和int分別表示Person這個類的id

max 最大值

min 最小值

緩存值:對象緩存,Integer i = 1; Integer j = 1;--> i == j;

緩存-128~127

技術分享

2.1.6 說一下“==”和equals方法究竟有什麽區別

非常經典的一個面試題?先說清楚一個,再說另外一個?

==用來判斷兩個變量之間的值是否相等,變量就可以分為基本數據類型變量,引用類型,如果是基本數據類型的變量直接比較值而引用類型要比較對應的引用的內存的首地址。

equals:用來比較兩個對象長得是否一樣,判斷兩個對象的某些特征是否一樣。實際上就是調用對象的equals方法進行比較。

2.1.7 講一下String和StringBuilder的區別,StringBuffer和StringBuilder的區別?

1)在java中提供三個類String、StringBuilder、StringBuffer來表示和操作字符串,字符串就是多個字符的集合。

String是內容不可變的字符串,Stirng底層使用了一個不可變的字符數組(final char[]),

String str = new String(“bbb”); ----private final char value[]

而StringBuilder和StringBuffer是內容可以改變的字符串,StringBuilder和StringBuffer底層使用的是可變數組(沒有使用final來修飾)----char value[]

2)最經典就是拼接字符串

1.String進行拼接String c = “a”+”b”;

2.StringBuilder或StringBuffer

StriingBuilder sb = new StringBuilder();sb.append(“a”).append(“b”);

拼接字符串不能使用String進行拼接,要使用StirngBuilder或者StringBudder

3)Stringbuilder是線程不安全的,效率較高,而StringBuffer是線程安全的,效率較低。

技術分享

2.1.8 將一下java集合

java中的集合為value,key-value(Map)兩種

存值的又分為List和Set

List是有序的,可重復的。

Set是無序的,不可重復的。根據equals和hashcode判斷,也就是如果一個對象要存儲在Set中,必須重寫hashcode方法。

存key-value的為Map

2.1.9 ArrayList和LinketSet的區別

List常用的ArrayList和LinkedList。區別和使用場景

ArrayList底層使用的是數組,LinkedList使用的是鏈表。

數組查詢具有索引查詢特定元素比較快,而插入和刪除和修改比較慢(數組在內存中是一塊連續的內存,如果刪除插入需要移動內存)

鏈表不要求內存是連續的,在當前元素中存放下一個或者上一個的地址,查詢時需要從頭部開始,一個個的找,所以效率低,插入時不需要移動內存,只需改變指向即可,所以插入效率或者刪除效率高。

ArrayList使用在查詢比較多,但是插入和刪除比較少的情況,而LinkedList使用在查詢比較少而插入和刪除比較多的情況

2.1.10 講一下HashMap和HashTable的區別?HashMap和ConcurrentHashMap的卻別

1)HashMap和HashTable都可以使用來存儲key-value的數據。

2)HashMap是可以把null作為key或者value的,而hashTable是不可以的

3)HashMap是線程不安全的,效率高。HashTable是線程安全的,效率較低。

通過把整個Map分為N個segment(類似HashTable),可以提供相同的線程安全,但是效率提升N倍,默認提升16倍。

2.1.11 實現一個拷貝文件的工具類使用字節流還是字符流。

我們拷貝的文件不確定是只包含字符流,有可能有字節流(圖片、聲音、圖像等)。為了考慮通用性,要使用字節流。

2.1.12 講一下線程的幾種實現方式?

1.實現方式:

1)通過繼承Thread類實現一個線程。

2)通過實現Runable接口一個線程

繼承擴展性不強,java只支持單繼承,如果一個類繼承Thread就不能繼承其他的類了。

2.啟動方式:

Thread t = new Thread();繼承了Thread的對象/實現Runable的對象。

t.setName()設置一個線程名稱。

t.start();

啟動線程使用start方法,而啟動了以後執行的是run方法。

3.怎麽區分線程,在一個系統中有很多線程,每個線程都會打印日誌,我區分哪個線程打印的怎麽辦。

t.setName()”設置一個線程名稱”;這是一種規範,在創建線程完成後,都需要設置名稱。

技術分享

2.1.13 有沒有使用過線程並發庫?

簡單了解過。創建線程池。

java通過Excute提供四個靜態方法創建四種線程池,分別為:

newCachedThreadPool創建一個可緩存線程池,如果線程池長度超過處理需要,靈活回收空閑線程,無可回收,則新建線程。

newFixedThreadPool 創建一個定長線程池,可控制線程最大並發數,超出的線程會在隊列中等待。

newScheduledThreadPool 創建一個定長線程池,支持定時及周期性任務執行。

newSingleThreadExecutor 創建一個單線程化的線程池,它只會用唯一的工作線程來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先級)執行。

線程池的作用:

1)限定線程的個數,不會導致由於線程過多導致系統運行緩慢或者崩潰。

2)線程池不需要每次創建或者銷毀,節約資源。

3)線程池不需要每次創建,響應時間快。

連接池也是一樣

2.1.14 講一下什麽是設計模式?常用的設計模式有哪些?

設計模式就是經過前人無數次的實踐總結的,設計過程中可以反復使用的,可以解決特定問題設計方法。

單例模式:懶漢模式、 餓漢模式

1)構造方法私有化,讓除了自己類能創建外其他地方都不能創建

2)在自己的類中創建一個單實例(餓漢模式是一出來就創建單實例,而懶漢模式需要的時候才創建)

3)提供一個方法獲取該實例對象(創建需要進行方法同步)

工廠模式:Spring IOC 就是使用了工廠模式

對象的創建交給一個工廠去創建

代理模式:Spring AOP 就是使用的動態代理

包裝模式:

java面試②基礎部分