標籤:試題 1.2 決定 事物 java api 儲存 高度 啟動方式 news
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中有幾種基礎資料型別 (Elementary Data Type)?
8種
2.1.4. 物件導向的特徵有哪些方面
有四大基本特徵:封裝、抽象、繼承、多態
1)封裝,即將對象封裝成一個高度自治和相對封閉的個體,對象狀態(屬性)由這個對象自己的行為(方法)來讀取和改變。
張三這個人,他的姓名等屬性,要有自己提供的擷取和改變的方法來操作,(getter,setter)
2)抽象就是找出一些事物的相似和共性之處,然後將這些事物歸為一個類,這個類只考慮這些事物的相似和共性之處,並且會忽略與當前主題和目標無關的那些方面,將注意力集中在與當前目標有關的方面。
就是把現實生活中的對象,抽象為類。
3)在定義一個類的時候,可以在一個已經存在的類的基礎之上來進行,把這個已經存在的類所定義的內容作為自己的內容,並可以加入若干新的內容,或修改原來的方法使之更適合特殊的需要,這就是繼承
4)多態是指程式中定義的引用變數所指向的具體類型和通過該引用變數發出的方法調用在編程時並不確定,而是在程式運行期間才確定,即一個引用變數倒底會指向哪個類的執行個體對象,該引用變數發出的方法調用到底是哪個類中實現的方法,必須在由程式運行期間才能決定。
靠的是父類或者介面的引用變數可以指向子類或者具體實作類別的執行個體對象,而程式調用的方法在運行期間才動態綁定,就是引用變數所指向的具體執行個體對象的方法,也就是記憶體裡正在啟動並執行那個對象的方法,而不是引用變數的類型定義的方法。
原則:圍著比較抽象問題的時候,要舉例說明
2.1.5 有了基礎資料型別 (Elementary Data Type),為什麼還要封裝類型?
基礎資料型別 (Elementary Data Type),java中提供了8中基礎資料型別 (Elementary Data Type),boolean int float等
封裝類型:每一個基礎資料型別 (Elementary Data Type)都會一一對應一個封裝類型,
boolean—Boolean
int—Integer
裝箱和拆箱
把基本的資料類型轉換成對應的封裝類型,
Integer i = 1;自動裝箱,實際上在編譯時間會調用Integer.valueOf方法來裝箱
拆箱:就是把封裝類型轉換為基礎資料型別 (Elementary Data Type), 基礎資料型別 (Elementary Data Type) 名稱 = 對應的封裝類型。
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方法究竟有什麼區別
非常經典的一個面試題?先說清楚一個,再說另外一個?
==用來判斷兩個變數之間的值是否相等,變數就可以分為基礎資料型別 (Elementary Data Type)變數,參考型別,如果是基礎資料型別 (Elementary Data Type)的變數直接比較值而參考型別要比較對應的引用的記憶體的首地址。
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面試②基礎部分