?1、String類
?String不可變
java 中String是 immutable的,也就是不可變,一旦初始化,其引用指向的內容是不可變的。
也就是說,String str = “aa”;str=“bb”;第二句不是改變“aa”所存儲地址的內容,而是另外開辟了一個空間用來存儲“bb”;同時由str指向 原來的“aa”,現在已經不可達,GC時會自動回收。 因此String作為參數傳進來時候,str=?"test ok"; 實際給副本引用str指向了新分配的地址,該地址存儲“test ok”。 因此,原先的str仍然指向“good”
String不能被繼承?
String類由final修飾,所以不能被繼承。?
StringBuffer和StringBuilder
?StringBuffer、StringBuilder都代表可變的字符串對象。
它們有共同的父類?AbstractStringBuilder,并且兩個類的構造方法和成員方法也基本相同。
StringBuffer是線程安全的,而StringBuilder是非線程安全的,所以StringBuilder性能略高。
一般情況下,要創建一個內容可變的字符串,建議優先考慮StringBuilder類。?
new和“ ”
-
直接使用?"hello"?的字符串直接量時,JVM將會使用常量池來管理這個字符串;
-
當使用?new String("hello")?時,JVM會先使用常量池來管理?"hello"?直接量,再調用String類的構造器來創建一個新的String對象,新創建的String對象被保存在堆內存中。
顯然,采用new的方式會多創建一個對象出來,會占用更多的內存,所以一般建議使用直接量的方式創建字符串。?
2、接口
接口里只能包含抽象(abstract)方法、靜態(static)方法、默認(default)方法和私有(private)方法,不能為普通方法提供方法實現。
?接口里只能定義靜態常量(static final),不能定義普通成員變量。
接口里不包含構造器。
接口里不能包含初始化塊。
一個類可以直接實現多個接口。?
接口不能被實例化。
接口包含抽象方法,實現接口的普通子類都必須實現這些抽象方法。
?interface中的方法默認為public abstract 的 ,變量默認為public static final。
?3、Object的基本方法
Object類并不包含copy()方法,題目中描述的應該是clone()方法。
copy()方法屬于java.nio.file.Files類,其作用是將字節從文件復制到I /O流或從I /O流復制到文件。
4、Collection和Collections
5、Java概念
A、java異常和錯誤的基類Throwable,包括Exception和Error
C、java是面向對象的,但是不是所有的都是對象,基本數據類型就不是對象,所以才會有封裝類的;
D、如果是等待清理隊列中如果又被調用,則不會執行finallize方法
E、JAVA跨平臺性????實現在任意平臺的java程序都可以在其他平臺運行;采用高版本的JDK編寫的程序,在低版本的JRE中無法運行。
6、互斥鎖
A:用來給對象和方法或者代碼塊加鎖,當它鎖定一個方法或者一個代碼塊的時候,同一時刻最多只有一個線程執行這個段代碼。
B:對于volatile類型的變量,系統每次用到他的時候都是直接從對應的內存當中提取,**而不會利用cache當中的原有數值,**以適應它的未知何時會發生的變化,系統對這種變量的處理不會做優化——顯然也是因為它的數值隨時都可能變化的情況。
C:
?將內存中的java對象放到硬盤叫做序列化,硬盤到內存叫做反序列化;序列化(Serialize)(將java對象的狀態保存下來的過程);參與序列化和反序列化的對象,必須實現Serializable接口;凡是一個類實現了Serializable接口,建議給該類提供一個固定不變的序列化版本號。這樣,以后這個類即使代碼修改了,但是版本號不變,java虛擬機會認為是同一個類。序列化是通過實現java.io.Serializable接口來完成的。這個接口是一個標記接口,意味著它不包含任何方法
7、構造方法
子類的構造方法總是先調用父類的構造方法,如果子類的構造方法沒有明顯地指明使用父類的哪個構造方法,子類就調用父類不帶參數的構造方法。
而父類沒有無參的構造函數,所以子類需要在自己的構造函數中顯示的調用父類的構造函數。
因此需要在子類的構造方法中添加super(”nm“)?
在創造派生類的過程中首先創建基類對象,然后才能創建派生類。
創建基類即默認調用Base()方法,在方法中調用callName()方法,由于派生類中存在此方法,則被調用的callName()方法是派生類中的方法,此時派生類還未構造,所以變量baseName的值為null
答案:
子類構造方法在調用時必須先調用父類的,由于父類沒有無參構造,必須在子類中顯式調用,修改子類構造方法如下即可: public Derived(String s){ super("s"); System.out.print("D"); }
總結:
1.寫一個類,如果沒有寫構造函數,那么這類默認會有一個無參的構造函數。如果寫構造函數了,那么就不會有默認的無參構造函數, 以自己寫的構造函數為準。
2.子類在寫構造函數的時候,第一行必須用super 關鍵字調用父類的任一構造函數。
3.用super調用父類的構造函數時,如果調用的是父類無參構造函數,則super()可以不用寫,如果是有參構造函數,則必須使用super顯示調用。
?
A:靜態成員變量或靜態代碼塊>main方法>非靜態成員變量或非靜態代碼塊>構造方法
B:構造器本身并沒有任何返回值。
特點:
構造方法的方法名與類名相同
構造方法沒有返回值類型,也不寫void
構造方法可以重載
代碼塊:
分類:靜態代碼塊和實例代碼塊
靜態代碼塊:static修飾的代碼塊,在類加載時執行,且只執行一次。因為類就加載一次了。
實例代碼塊:沒有static修飾的代碼塊,創建對象時執行,每創建一次對象加載一次。
實例代碼塊在執行構造方法之前執行。所以優先級高于構造方法。
?8、static
static修飾的類可以被繼承。
?static關鍵字的作用是把類的成員變成類相關,而不是實例相關,即static修飾的成員屬于整個類,而不屬于單個對象。
static關鍵字不可修飾外部類,但可修飾內部類。?
-
類變量:它隨類的信息存儲在方法區,并不隨對象存儲在堆中,類變量可以通過類名來訪問,也可以通過對象名來訪問,但建議通過類名訪問它。
-
類方法:可以通過類名訪問,也可以通過對象名訪問,建議通過類名訪問它。
-
靜態塊:靜態塊屬于類,它在類加載的時候被隱式調用一次,之后便不會被調用了。
-
靜態內部類:被static修飾的內部類叫靜態內部類。靜態內部類可以包含靜態成員,也可以包含非靜態成員。靜態內部類不能訪問外部類的實例成員,只能訪問外部類的靜態成員。外部類的所有方法、初始化塊都能訪問其內部定義的靜態內部類。
9、設計模式
MVC只是將分管不同功能的邏輯代碼進行了隔離,增強了可維護和可擴展性,增強代碼復用性,因此可以減少代碼重復。但是不保證減少代碼量,多層次的調用模式還有可能增加代碼量。
一般來講,使用設計模式都會增加代碼量。
10、Spring的事務傳播
PROPAGATION_REQUIRED--支持當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。 PROPAGATION_SUPPORTS--支持當前事務,如果當前沒有事務,就以非事務方式執行。 PROPAGATION_MANDATORY--支持當前事務,如果當前沒有事務,就拋出異常。 PROPAGATION_REQUIRES_NEW--新建事務,如果當前存在事務,把當前事務掛起。 PROPAGATION_NOT_SUPPORTED--以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。 PROPAGATION_NEVER--以非事務方式執行,如果當前存在事務,則拋出異常。
?11、集合類,異常,子類
A:可以不必事先知道對象類型,默認就Object類型
C:不可以是變量,必須是被final修飾的常量
D:子類可以訪問父類受保護的成員?
12、線程
?A、ConcurrentHashMap實際上是?HashTable的升級版,使用segment來分段和管理鎖,并不是synchronized;
B、HashMap實現的接口有:Serializable, Cloneable, Map<K,V> ,沒有實現Collction
C、Arrays.asList()方法返回的列表是Arrays.ArrayList類型的,并不是java.util.ArrayList;?
A: HashSet 它不是線程安全的,屬于Set接口下的實現類,Set下的實現類特征就是無序,不允許存儲相同的對象
B: ConcurrentHashMap 它是線程安全的HashMap實現,特征也相似,其中存儲的值對象可以重復,鍵對象不能重復
C: Collection接口是List接口和Set接口的父接口,通常情況下不被直接使用
D: ArrayList線程不安全的,底層是數組實現,允許存放重復對象
基本上我們平常用到的都是非線程安全的集合類,因為要使線程安全,是要加鎖來實現的,勢必造成性能降低。如hashset、hashmap、arraylist、linkedlist、treemap、treeset、stringbulider等。
像stringbuhffer、vector、hashtable這些都是專用于多線程的,再者以concurrent(意為:同時發生的)為前綴的集合類大多是線程安全的。
答案為B
A: stop()方法是強制當前線程停止運行,并拋出ThreadDead錯誤。
B:中斷線程比較安全的做法是引入共享變量。
C:suspend()方法是臨時掛起當前線程。
D:yield()方法是使當前執行暫時停止執行而讓其他線程運行。
13、super和this關鍵字
super指向當前對象的父類對象
?B:super()必須在第一行的原因是:?子類是有可能訪問父類對象的,?比如在構造函數中使用父類對象的成員函數和變量,?在成員初始化使用了父類,?在代碼塊中使用了父類等等,?所以為保證在子類可以訪問父類對象之前,一定要完成對父類對象的初始化。
關于this()必須在第一行的原因,我們假設這樣一種情況,,類B是類A的子類, 如果this()可以在構造函數的任意行使用,?那么當程序運行到構造函數B()的第一行,發現沒有調用this()和super(),那么就會自動在第一行補齊super()?來完成對父類對象的初始化,?然后返回子類的構造函數繼續執行,?當運行到構造函數B()的"this() ;"時,?調用B類對象的構造函數,?還會對父類對象再次初始化!,這就造成了資源的浪費,以及某些意想不到的錯誤。
D:無論是this()還是super()指的都是對象,而static環境中是無法使用非靜態變量的。?
14、java classloader
?C:JVM在判定兩個class是否相同時,不僅要判斷兩個類名是否相同,而且要判斷是否由同一個類加載器實例加載的。
15、實例的調用
題目應該問的是錯誤的,選C
C;非靜態方法只能通過實例對象來調用,不能直接通過類名調用。靜態方法(static)才能通過類名直接調用
16、異或符號
^表示異或 就是相同是0 不同是1
14是1110
3是0011
所以14^3=1101,即輸出13
17、多態
?18、事務隔離級別
A:Java程序可以指定事務隔離級別,但實現隔離級別的是數據庫系統。
B:Hibernate是開放源代碼的對象關系映射框架,它對JDBC做了非常輕量級的封裝。
D:JDBC全稱是Java Database connect,它是一套用于執行SQL語句的Java API。
Hibernate和JDBC均是程序與數據庫連接的橋梁,無法實現事務隔離級別。
19、內存
首先理解一下內存泄漏的概念,內存泄漏就是對象引用消失了,對象內存卻沒有被回收。
A答案:FullGC 是老年代內存空間不足的時候,才會觸發的,老年代一般是生命周期較長的對象或者大對象,頻繁的 FullGC 不會可能會影響程序性能(因為內存回收需要消耗CPU等資源),但是并不會直接導致內存泄漏。
B 答案:JVM奔潰的可能是內存溢出引起的,也可能是其他導致 JVM崩潰的操作,例如設置了錯誤的JVM參數等。
C 答案:內存異常,最常見的 就是 StackOverFlow 了把,內存溢出,其實內存泄漏的最終結果就是內存溢出。所以,基本上C是對的答案。
D 答案:Java 進程異常消失,這個明顯不對的。
20、抽象類
接口里只能包含抽象方法、靜態方法、默認方法和私有方法,不能為普通方法提供方法實現;
抽象類則完全可以包含普通方法。
接口里只能定義靜態常量,不能定義普通成員變量;
抽象類里則既可以定義普通成員變量,也可以定義靜態常量。
?接口里不包含構造器;
抽象類里可以包含構造器,抽象類里的構造器并不是用于創建對象,而是讓其子類調用這些構造器來完成屬于抽象類的初始化操作。
?接口里不能包含初始化塊;
但抽象類則完全可以包含初始化塊。
?一個類最多只能有一個直接父類,包括抽象類;
但一個類可以直接實現多個接口,通過實現多個接口可以彌補Java單繼承的不足。
?接口和抽象類都不能被實例化,它們都位于繼承樹的頂端,用于被其他類實現和繼承。
?接口和抽象類都可以包含抽象方法,實現接口或繼承抽象類的普通子類都必須實現這些抽象方法。
抽象類中可以沒有抽象方法,但是抽象方法必須在抽象類中或者接口中。
21、流
已知zipname是一個壓縮文件名,則zipname在下列代碼中出現的正確位置是
ZipInputStream zin = new ZipInputStream(new FileInputStream(1));
ZipEntry entry;
while((entry=zin.getNextEntry(2))!=null){fileCombo.addItem(entry.getName(3));zin.closeEntry(4);
}
?答案為1
當需要輸入一個zip文件時,要將zip文件作為FileInputStrem構造方法的參數,即題目中的1處。
1、stream結尾都是字節流,reader和writer結尾都是字符流 兩者的區別就是讀寫的時候一個是按字節讀寫,一個是按字符。
2、在讀寫文件需要對內容按行處理,比如比較特定字符,處理某一行數據的時候一般會選擇字符流。
3、只是讀寫文件,和文件內容無關的,一般選擇字節流。
?
22、Socket
23、Volatile
? ? ? ?一般都是和const對應?
- volatile對應的變量可能在你的程序本身不知道的情況下發生改變
- 比如多線程的程序,共同訪問的內存當中,多個程序都可以操縱這個變量
- 你自己的程序,是無法判定何時這個變量會發生變化
volatile的措施,就是
1. 每次從內存中取值,不從緩存中什么的拿值。這就保證了用 volatile修飾的共享變量,每次的更新對于其他線程都是可見的。
2. volatile保證了其他線程的立即可見性,就沒有保證原子性。
3.由于有些時候對 volatile的操作,不會被保存,說明不會造成阻塞。不可用與多線程環境下的計數器。
A選項,volatile關鍵字對任意單個volatile變量的的讀寫操作可以保證原子性,但類似于volatile++這種復合操作就無法保證原子性了。如果需要對這種復合操作保證原子性,最好用synchronized關鍵字。即synchronized保證三大性,原子性,有序性,可見性,volatile保證有序性,可見性,不能保證原子性。
B選項,為了實現volatile的內存語義,編譯器在生成字節碼時會在指令序列中插入內存屏障來禁止特定類型的處理器重排序,以此來保證有序性。
C選項,可見性是指當多個線程并發訪問共享變量時,一個線程對共享變量的修改,其它線程能夠立即看到。對于一個volatile變量的讀,總是能看到對這個volatile變量最后的寫入,保證了可見性。
D選項為干擾選項。
- volatile關鍵字是線程同步的輕量級實現,所以volatile性能肯定比synchronized關鍵字要好。但是volatile關鍵字只能用于變量而synchronized關鍵字可以修飾方法以及代碼塊。synchronized關鍵字在JavaSE1.6之后進行了主要包括為了減少獲得鎖和釋放鎖帶來的性能消耗而引入的偏向鎖和輕量級鎖以及其它各種優化之后執行效率有了顯著提升,實際開發中使用 synchronized 關鍵字的場景還是更多一些。
- 多線程訪問volatile關鍵字不會發生阻塞,而synchronized關鍵字可能會發生阻塞
- volatile關鍵字能保證數據的可見性,但不能保證數據的原子性。synchronized關鍵字兩者都能保證。
- volatile關鍵字主要用于解決變量在多個線程之間的可見性,而 synchronized關鍵字解決的是多個線程之間訪問資源的同步性。
synchronized保證三大性,原子性,有序性,可見性
volatile保證有序性,可見性,不能保證原子性
數據庫事務正確執行的四個基本要素,ACID(原子性,一致性,隔離性,持久性)
synchronized不是修飾變量的 它修飾方法或代碼塊或對象
Volatile修飾變量
24、值類型和引用類型
?
25、this
this不能在static的方法中使用?
A的答案中變量雖然為private,但因為main函數在該類中,所以即使private也仍可使用
this可以出現在類的構造方法中,可以出現在非static修飾的成員方法中,可以代表實例對象本身,但不可以用來引用父類的成員變量
26、集合類
Collection
? ? -----List? 有序,可以重復
????????????? ?-----LinkedList ? ?非同步
????????????? ? ----ArrayList ? ? ?非同步,實現了可變大小的元素數組
????????????? ? ----Vector ? ? ? ? ?同步
?????????????????????????------Stack
? ? -----Set? ?無序,不允許有相同的元素
? ? ? ? ? ? ?----HashSet? ? ?線程不安全,存取速度快。底層是以哈希表實現的
? ? ? ? ? ? ?----TreeSet????????紅-黑樹的數據結構,默認對元素進行自然排序(String)。如果在比較的時候兩個對象返回值為0,那么元素重復。
? ? ? ? ? ? ----LinkedHashSet????????會保存插入的順序。
? ? ? ? ? ?-----sortedSet????????按升序維護其元素的集合
? ? -----Queue?????????代表一個先進先出(FIFO)的隊列
Map? ? ? ? 具有映射(key-value)結構
? ? -----HashTable????? ? 同步,實現一個key--value映射的哈希表;線程安全
? ? -----HashMap ? ? ? ? ?非同步;HashMap的實例有兩個參數影響其性能:“初始容量”,“加載因子”;通過拉鏈法解決哈希沖突;key-value都是儲存在entry數組中的
? ? ----WeakHashMap ? 改進的HashMap,實現了“弱引用”,如果一個key不被引用,則被GC回收
? ? -----TreeMap? ?按key排序,key不重復
? ? -----IdentityHashMap? key可重復
A: HashSet 它不是線程安全的,屬于Set接口下的實現類,Set下的實現類特征就是無序,不允許存儲相同的對象
B: ConcurrentHashMap 它是線程安全的HashMap實現,特征也相似,其中存儲的值對象可以重復,鍵對象不能重復
C: Collection接口是List接口和Set接口的父接口,通常情況下不被直接使用
D: ArrayList線程不安全的,底層是數組實現,允許存放重復對象
B、LinkedBlockingQueue是一個線程安全的阻塞隊列,實現了先進先出等特性。
C、PriorityQueue不允許null值,入隊和出隊的時間復雜度是O(log(n))。
D、
PriorityQueue是不同于先進先出隊列的另一種隊列。每次從隊列中取出的是具有最高優先權的元素。
ConcurrentLinkedQueue是一個基于鏈接節點的線程安全隊列,該隊列的元素遵循FIFO原則
?
27、 JVM
JVM 內存可簡單分為三個區:
1、堆區(heap):用于存放所有對象,是線程共享的(注:數組也屬于對象)
2、棧區(stack):用于存放基本數據類型的數據和對象的引用,是線程私有的(分為:虛擬機棧和本地方法棧)
3、方法區(method):用于存放類信息、常量、靜態變量、編譯后的字節碼等,是線程共享的(也被稱為非堆,即 None-Heap)
Java 的垃圾回收器(GC)主要針對堆區
28、重載和重寫
?重載就是方法名相同,但參數列表不同。與返回值類型無關,屬于重名方法
重寫要求方法名,返回值類型,參數完全相同
重寫要滿足的條件:(好比父親給兒子100塊錢讓兒子去花)
1.參數列表要完全相同——(你拿的就是100塊錢,變不成別的,怎么花隨你,但是錢數、參數列表不變)
2.返回類型是父類方法的返回類型的子類型——(返回值,可以說是你花100得到的是價值小于等于100的東西,你能買回來的一定在100之內)
3.訪問權限不能大于父類方法權限——(就是訪問修飾符要比父類的小于等于)
29、異常
異常類結構
Throwable是異常的頂層父類,它有兩個直接子類,分別是Error、Exception。
Error是錯誤,一般是指與虛擬機相關的問題,如系統崩潰、虛擬機錯誤、動態鏈接失敗等,這種錯誤無法恢復或不可能捕獲,將導致應用程序中斷。
通常應用程序無法處理這些錯誤,因此應用程序不應該試圖使用catch塊來捕獲Error對象。
在定義方法時,也無須在其throws子句中聲明該方法可能拋出Error及其任何子類。
Exception是異常,它被分為兩大類,分別是Checked異常和Runtime異常。所有的RuntimeException類及其子類的實例被稱為Runtime異常;不是RuntimeException類及其子類的異常實例則被稱為Checked異常。
Java認為Checked異常都是可以被處理(修復)的異常,所以Java程序必須顯式處理Checked異常。如果程序沒有處理Checked異常,該程序在編譯時就會發生錯誤,無法通過編譯。Runtime異常則更加靈活,Runtime異常無須顯式聲明拋出,如果程序需要捕獲Runtime異常,也可以使用try...catch塊來實現。
finally
不管try塊中的代碼是否出現異常,也不管哪一個catch塊被執行,甚至在try塊或catch塊中執行了return語句,finally塊總會被執行。
在finally塊中使用了return、throw語句,將會導致try塊、catch塊中的return、throw語句失效。
30、泛型
泛型擦除
當把一個具有泛型信息的對象賦給另一個沒有泛型信息的變量時,所有在尖括號之間的類型信息都將被扔掉。比如一個?List<String>?類型被轉換為List,則該List對集合元素的類型檢查變成了泛型參數的上限(即Object)。
List<String> list1 = ...;
List list2 = list1;
// list2將元素當做Object處理
31、反射
通過反射機制,我們可以實現如下的操作:
-
程序運行時,可以通過反射獲得任意一個類的Class對象,并通過這個對象查看這個類的信息;
-
程序運行時,可以通過反射創建任意一個類的實例,并訪問該實例的成員;
-
程序運行時,可以通過反射機制生成一個類的動態代理類或動態代理對象。
32、內部類
內部類不能編譯生成
· 內部類可以直接訪問外部類的成員,包括私有
· 外部類要訪問內部類的成員,必須創建對象
33、類成員變量修飾符
包外 | 子類 | 包內 | 類內 | |
public | yes | yes | yes | yes |
protected | no | yes | yes | yes |
default | no | no | yes | yes |
private | no | no | no | yes |
34、多態
通過方法重載,方法覆蓋可以實現多態
父類引用指向子類對象可以實現多態
Java語言支持運行時多態