一、String類都有那些經常使用的方法。
- length(); split(); replace();
- equals(); subString(); charAt();
- concat(); 大小寫轉換; indexOf();
- trim(); isEmpty(); contains();
- startWith()
補充:Object類方法
- clone、 equals finalize getClass
- hashCode notify notifyAll toString
- wait
補充:異常分類
- 算數異常 類型轉換異常 非法參數異常
- 下標越界異常 空指針異常 安全性檢查異常
二、StringBuilder和StringBuffer區別
- 根本區別就是StringBuilder是線程不安全的,而StringBuffer是線程安全的。
- 速度,StringBuilder > StringBuffer > String
- String是不可變的,其餘兩個是可變的
- 按照性能排序 String(大姐,jdk1.0) < StringBuffer(二姐,jdk1.0) <StringBuilder(小妹,jdk1.5).
- StringBuffer不少方法都被synchronized修飾了,而StringBuilder沒有,因此StringBuilder速度比StringBuffer快。建議用StringBuilder。
- JVM運行程序主要時間都是浪費在建立對象和回收對象上。
- eg:String s = 「this is」+「only」「simple test」;等同於 String s = 「this is only simple test」。
三、Map和List的遍歷區別
List:加強的for循環(最差)、for(int i=0;i<list.length;i++) 、Interator
List:對越arrayList、Vector遍歷應該採用隨機訪問get
LinkedList:採用迭代器
關於Map<K,V>能不能存儲null狀況
|
key |
value |
|
TreeMap |
不容許 |
容許 |
線程不安全 |
HashMap |
容許 |
容許 |
線程不安全 |
關於Map遍歷的entrySet和keySet
推薦使用entrySet,說明,keySet實際上是遍歷了兩次,一次轉化爲Iterator對象,另外一次是從HashMap中取出key所對應的value,而entrySet只遍歷了一次就把他key和value所有都存到entry中了,效率更高。
Set表明無序,不重複,Map表明key-value組成的集合,Map的key要求是不能重複,沒有順序,把Map的全部key組合起來就是Set。
四、數組與List區別
ArrayList的底層實現仍是數組,索引速度快。
LinkedList:是基於鏈表。
對於隨機訪問,get set ArrayList優秀。
對於新增和刪除,LinkedList優秀
五、Set和List區別
根本:Set 無序,不重複。 List:有序,元素可重複
Java遍歷List
第一種:
- for(Iterator<A> it = list.iterator(); it.hasNext();) {
- ......
- }
這種方式在循環執行過程當中會進行數據鎖定, 性能稍差, 同時,若是你想在循環過程當中去掉某個元素,只能調用it.remove方法, 不能使用list.remove方法, 不然必定出併發訪問的錯誤.
第二種:
- for(A a : list) {
- ......
- }
它內部仍是調用第一種, 換湯不換藥, 這種循環方式還有其餘限制, 不建議使用它
第三種:
- for(int i = 0; i < list.size(); i++) {
- A a = list.get(i);
- ......
- }
它內部不作鎖定, 效率最高, 可是當寫多線程時要考慮併發操做的問題!
注:TreeMap和HashMap,Hash底層採用數組來保存key和value
六、垃圾回收
System.gc();
Runtime.gc() 也就是 Runtime.getRuntime().gc();
七、反射機制
在Java運行環境中獲取類的屬性和方法,調用對象的任意一個方法,這種動態獲取類的信息,以及動態動態調用對象的方法的功能,就叫作Java的反射機制。
八、Java的數據類型
補充:關於float與double精度丟失問題
float:有效位是7位。
double:有效位16位
九、Java類加載機制
十、棧和鏈表有什麼區別
棧:先進後出。
鏈表:隨便什麼地方均可以插入刪除
十一、Map、HashMap、LinkedHashMap存儲結構以及實現原理
HashMap底層是用數組實現的。
Map中包括一個內部類Entry,封裝了一個key-value
LinkedHashMap採用雙向鏈表來維護元素關係,由於要維護元素順序,因此性能略低於HashMap。
十二、short s1 =1, s1 = s1 + 1 有錯嗎,shrot s1 = 1 , s1 +=1有錯嗎。
對於第一種,因爲1是int型,所以s1 + 1 運算是int型,須要強制類型轉化,
而第二種至關於 s1 = (short)(s1 + 1)其中隱含了強制類型轉化。
1三、Integer 和int區別。
注意:就是涉及到自動裝箱。
Integer a1 = new Integer(3);
Integer a2 = 3;
System.out.println(a1 == a2); //false 若是a2是int型,就是true
Integer a = 15;
Integer b = 15;
Integer c = 129;
Integer d = 128;
System.out.println(a == b); //true
System.out.println(c ==d ); //false
注:若是整形字面的量值在-128 ~128之間,那麼不new對象,而是引用常量池中的Integer對象。
訪問控制符
類成員:private、default、protected、public
修飾類:public、final、abstract
修飾方法:public、默認、protected、private、|static、find、abstract
修飾變量:public、默認、protected、private、|static、find
類型 |
private |
無 |
protected |
public |
同一類 |
√ |
√ |
√ |
√ |
同一包中子類 |
|
√ |
√ |
√ |
同一包非子類 |
|
√ |
√ |
√ |
不一樣包子類 |
|
|
√ |
√ |
不一樣包非子類 |
|
|
|
√ |
1四、HashMap採用拉鍊法解決衝突(鏈地址法)
- HashMap有兩個參數影響性能,初始容量和加載因子(裝填因子)。
- 鏈表法就是將相同hash值的對象組織成一個鏈表放在hash值對應的槽位中。
- 開放地址法是經過一個探測算法,當某個槽位已經被佔據的狀況下繼續尋找下一個可使用的槽位,很顯然,HashMap解決衝突的方法是拉鍊法,也叫鏈地址法。
1五、關於Java默認導入的包。
- Java.lang,包含以下
- Object:是全部類的父類。
- 基礎類型包裝類
- 數學類
- String和StringBuilder
- 系統和運行時類:System.in 和out 是標準的輸入類和輸出類,System全部成員變量和方法都是靜態的。
1六、關於==和equals
==可用於基本類型和引用類型的比較,採用Integer比較,只要new,就不一樣。Integer.valueOf()和Integer a = 53,等價。切記Intger.valueOf()的源碼,大於127都要new。
1七、Java語言中數組複製的方法.
System.arrayCopy() > clone > Arrays.copyOf -> for循環賦值。(按性能排序)。
關於clone方法:Java.lang.Object類的clone()方法,爲protected類型,不可直接調用,須要先對要克隆的對象進行下列操做,首先被克隆的類應該實現Cloneable接口,而後在該類中覆蓋clone方法,而且在該類中調用super.clone()方法。
複製引用和賦值對象的區別。
複製引用:是指將某個對象的地址複製,因此複製後的對象副本的地址和源對象相同,這樣,當改變副本的某個值後,源對象值也被改變;
複製對象:是將源對象整個複製,對象副本和源對象的地址並不相同,當改變副本的某個值後,源對象值不會改變;
- Cat cat1=new Cat("xiaohua",3);//源對象
- System.out.println("源對象地址"+cat1);
- //調用clone方法,複製對象
- Cat cat2=(Cat)cat1.clone();
- Cat cat3=(Cat)cat1;//複製引用
- System.out.println("複製對象地址:"+cat2);
- System.out.println("複製引用地址:"+cat3);
能夠看出,複製引用的對象和源對象地址相同,複製對象和源對象地址不一樣
1八、關於靜態代碼塊,代碼塊,構造方法的執行順序.
父類靜態代碼塊-》子類靜態代碼塊-》父類構造代碼塊-》父類構造函數-》子類構造代碼塊-》子類構造函數。
注意:構造代碼塊和構造函數一塊兒執行。
先執行靜態初始化快,普通初始化快和午飯的構造函數一塊兒i執行。
1九、&& 和&
&&短路,若是&&左邊位false,直接短路掉
&非短路。
20、return、break、和continue
- return:直接退出循環
- break:跳出本層循環
- continue:跳過本次循環
補充:break只能用在循環語句中,while,do....while或者for 或者switch中
2一、Math.round(11.5等於多少)
12.round其實就是四捨五入
注:關於四捨五入的方法
//第一種方法,使用DecimalFormat來格式化數字。
String ss = new DecimalFormat("#.000").format(s);
System.out.println("DecimalFormat四捨五入: "+ ss);
//第二種方式,使用String.format
System.out.println("使用String.format:" + String.format("%.3f", s));
//第三種方式,使用技巧round 這種方式存在問題
System.out.println("使用技巧round:" + Math.round(s*1000)*0.001d);
//錯誤System.out.println("使用技巧round:" + Math.round(s*1000*0.001d));
//第四種方式
BigDecimal big = new BigDecimal(s);
double d = big.setScale(3, BigDecimal.ROUND_HALF_EVEN).doubleValue();
System.out.println("第四種方式獲取:" + d);
System.out.println(big.setScale(3, BigDecimal.ROUND_HALF_UP));
2二、switch是否做用於byte上,是否做用long,是否String
- Java5以前,switch(expr)。expr只能是byte,short,int,char
- Java5以後,enum,
- Java7,String
- long,目前還不支持
2三、數組有沒有length()方法,String有沒有length屬性?
數組有length屬性,String有length方法。
2四、構造器不能被繼承,因此不能被重寫,但課重載,
2五、爲何不能經過返回值類型區分重載
例如 int f(),void f(),在方法調用時能夠省略類型f(),這時系統怎麼處理?會找不到,會迷糊,因此,經過返回值區分重載行不通。
2六、String s = new String("xyz"),建立了幾個對象。
建立了兩個對象,一個是靜態區的。
2七、Java中的final關鍵字有那些用法,
2八、關於字符編碼轉換,就是利用String的構造方法和普通方法。
String a = "你好";
String b = new String(a.getBytes("gb2312"),"ISO-8859-1");
System.out.println(b);
String c = new String(a,"gbk").getBytes("utf-8");//第二種
2九、TreeMap和TreeSet在排序時,如何比較元素,Collection中的sort()方法如何比較元素,
TreeSet要求全部存放對象必須實現Comparable接口,該接口提供compareTo()方法,
TreeMap要求存放的鍵值對映射的建必須實現Compareable接口,從而根據建進行排序。
Collection.sort()有兩種排序方式:
- 傳入的對象實現了Comparable
- 不強制要求傳入元素必須課比較,但如要傳入第二個參數,參數時實現Comparable接口的子類型,相關於臨時定義了一個排序規則。
關於comparable(java.lang)和compartor(java.util)
- list列表中全部元素必須實現Comparable接口,實現Comparable須要重寫comparTo方法。
- 使用Comparable有很大侷限性,實現此接口只能按compareTo(T t)定義的方法。
- 一個類的兌現更要實現多種排序方式,能夠爲該接口定義不一樣的比較器,實現comparator接口
補充:線程和進程的區別
進行是執行着的應用程序,而線程是進程內部的一個執行序列,一個進程能夠又多個線程,
線程同步:
使用lock與使用同步方法有點相似,只是使用lock時顯示使用lock對象做爲同步鎖,而使用同步方式時系統隱世使用當前對象做爲同步監視器。而使用lock對象時,每一個lock對象對應一個Account對象,同樣能夠保證對於同一個Account對象,同一時間只能又一個線程進入臨界區。
30、關於Thread類的sleep方法和對象(Object)的wait方法。
Thread.sleep() Object.wait()
- 調用了sleep時線程類休眠的靜態方法,調用此方法會讓當前線程暫停執行指定事件,將執行機會(CPU)讓給其餘線程,但對象的鎖依然保持,所以休眠結束後自動恢復。
- wait是Object的方法,調用wait方法致使當前線程放棄對象所進入線程池,只有調用對象的notify()方法,才能被從新喚醒。
3一、建立線程的三種方法。
- 繼承Thread
- 實現Runnable
- 使用Callable和FUTURE(二、3實現方式相同,因此歸結到一類)
推薦採用實現Runnable接口,Callable接口來建立線程,由於若是是繼承,就浪費了一次繼承的機會,致使沒法再繼承其餘的類,而接口不同。
3二、狀態
線程是進行內的併發,沒有本身的內存空間,共享進程的。
線程的四種狀態:就緒,執行,掛起。結束
join:等待另外一個線程完成
Sleep()以後線程進入阻塞狀態,而後進入就緒狀態,
wait()以後線程進入等待隊列,等待喚醒進入就緒狀態。
yield執行後線程進入就緒狀態(直接進入就緒狀態,不進入阻塞)
join執行後線程進入阻塞狀態
sleep與yield
- sleep()方法暫停後,會給其餘線程機會,不會理會優先級,
- sleep()方法會將線程轉入阻塞狀態,而後進入就緒狀態,而yield()不會將線程轉入阻塞,只是i強制當前進程進入就緒,所以徹底有可能某個線程調用yield()方法暫停後,當即再次得到處理器資源執行
- sleep()方法拋出一個InterruptedExecption異常。
- sleep(0放比yield()方法具備更好的一致性,一般不建議使用yield()方法來控制併發線程執行。
線程相關:
一、關鍵字synchronized 、static、abstract、final
- synchronized:用於方法或代碼塊前,使此方法或者代碼塊編程同步的。
- static:用於聲明靜態變量,static關鍵字能夠修飾變量,方法,靜態代碼塊。
靜態變量:
由static修飾的變量稱爲靜態變量
靜態變量屬於類,而不屬於某個對象
靜態變量它的副本只有一個(靜態變量在類中只加載一)
靜態方法:
在靜態方法中只能調用靜態變量和靜態方法
在非靜態方法中,能夠調用靜態方法或者變量。
在靜態方法中不能使用this和super關鍵字。
靜態代碼塊
做用:用來給靜態成員變量初始化
- abstract:用於定義抽象類或者方法
- final:用於聲明常量,即只能賦一次值
- volatile:用來確保將變量的跟新操做通知到其餘線程,當把變量聲明爲volatile類型後,編譯器與運行時都會注意到這個變量是共享的,所以不會將該變量上的操做與其餘內存操做一塊兒重排序。然而,在訪問volatile變量時不會執行加鎖操做,所以也就不會使執行線程阻塞,所以volatile變量是一種比 synchronized關鍵字更輕量級的同步機制。
- serialize:Java 對象序列化爲二進制文件
3三、Java中如何實現序列化以及實現序列化的意義。
實現Serializable接口
意義:能夠將硫化後的對象進行讀寫操做,也可用於網絡之間對象傳輸,序列化是爲了解決對象流讀寫坐坐時引起的問題。
3四、xml文檔有幾種形式?本質?解析。
兩種:dtd schema
schema自己也是一個xml文件,能夠被xml解析,約束能力大於dtd
解析xml有兩種:
dom:使用dom要預先加載整個文件適合隨機訪問,(空間換時間)
SAX:是事件驅動型,適合對xml順序訪問。
3五、簡述JDBC
- 加載驅動,Class.forName("com.mysql.jdbc.");
- 建立連接,Connention conn = DriverManager.getConnection("")
- 建立語句:PrepareStatement ps = conn.prepareStatement("");
- 執行語句:ResultSet rs = ps.executeQuery()
- 處理結果
- 關閉資源
3六、事務的ACID:原子性,一致性,隔離性,持久性
髒讀:A事務讀取B事務還沒有提交的數據,並再次基礎上操做,而B事務執行回滾,那麼A事務讀到的數據就是髒數據。
不可重複讀:A事務從新讀取前面讀取過的數據,發現該數據已經被另外一個已提交的事務B修改了。
幻讀:
3七、獲取一個對象
- A.class()
- a.getClass()
- Class.forName()
3八、Arrays.toString(int[]),Arrays工具類的頭String方法。
首先檢查是否爲空,若是爲空就return "[]",不然,StringBuilder,先append一個"[",而後循環,append一個數,if 到結尾 return appent 」]「,不然append(",")
3九、類變量是指用satic修飾的屬性,
40、在子類構造方法中使用super(),顯示調用父類的構造方法,super()必須卸載子類構造方法第一行,不然不經過。
4一、Java是一次編寫多出運行,c++是一次編寫多處編譯
4二、新生代,老年代,持久代
4三、LinkedList實現了List,而不是繼承,AbstractSet實現了Set
4四、StringBuilder經過調用toString()方法轉換爲String型。
4五、override重寫,overloadding重載。
重寫是子類從新定義了父類的方法,重寫必有相同的方法名,參數列表和返回值類型。
重載是發生在同一個類裏面的兩個或多個方法名相同,但參數不一樣的狀況
4六、什麼是java虛擬機,爲何java被稱爲平臺無關語言,
Java虛擬機是一個可執行Java字節碼的虛擬機進程,Java源文件被編譯成能被Java虛擬機執行的字節碼文件。
4七、關於抽象類和接口,區別和共同點。
- 接口中的方法都是抽象的,而抽象類則能夠同時包含抽象和非抽象方法。
- 類能夠實現多個接口,但只能繼承一個抽象類。
- 類能夠不實現抽象類和接口中聲明的方法,固然在這種狀況下類也必須是抽象的。
- 抽象類能夠在比提供接口實現的狀況下實現接口。
- 接口中聲明的變量默認都是final的,抽象類能夠包含非final的
- 接口中的成員函數默認都是public的,抽象類的成員函數能夠是private、protected或者public
- 接口是絕對抽象的,不能夠被實例化,抽象類也是不能夠被實例化的
4八、Iterator,ListIterator
Iterator能夠遍歷set和list集合,可是ListInterator只能用來遍歷List
Itertator只能向前遍歷,ListIterator既能夠向前也能夠向後,
ListIterator實現了Iterator接口。
4九、快速失敗和安全失敗的區別是什麼
Java.util都是快速失敗,
Java.util.conncurrent包瞎全部類都是安全失敗的。
快速失敗會拋出ConncurrentModificationException異常,而安全失敗永遠不會拋出這樣的異常。
50、Java中HashMap的工做原理。
Java中HashMap以鍵值對形式存儲元素,HashMap須要一個hash函數,它使用hashCode()和equals()方法向集合添加元素,當調用put()方法時,HashMap會計算key的hash值。
HashMap的一些重要的特性是它的容量、負載因子和擴容極限。