面試題總結

int和Integer的區別

1、Integer是int的包裝類,int則是java的一種基本數據類型 
2、Integer變量必須實例化後才能使用,而int變量不需要 
3、Integer實際是對象的引用,當new一個Integer時,實際上是生成一個指針指向此對象;而int則是直接存儲數據值 
4、Integer的默認值是null,int的默認值是0

延伸: 
關於Integer和int的比較 
1、由於Integer變量實際上是對一個Integer對象的引用,所以兩個通過new生成的Integer變量永遠是不相等的(因爲new生成的是兩個對象,其內存地址不同)。

Integer i = new Integer(100);
Integer j = new Integer(100);
System.out.print(i == j); //false

2、Integer變量和int變量比較時,只要兩個變量的值是向等的,則結果爲true(因爲包裝類Integer和基本數據類型int比較時,java會自動拆包裝爲int,然後進行比較,實際上就變爲兩個int變量的比較)

Integer i = new Integer(100);
int j = 100;
System.out.print(i == j); //true

3、非new生成的Integer變量和new Integer()生成的變量比較時,結果爲false。(因爲非new生成的Integer變量指向的是java常量池中的對象,而new Integer()生成的變量指向堆中新建的對象,兩者在內存中的地址不同)

Integer i = new Integer(100);
Integer j = 100;
System.out.print(i == j); //false

4、對於兩個非new生成的Integer對象,進行比較時,如果兩個變量的值在區間-128到127之間,則比較結果爲true,如果兩個變量的值不在此區間,則比較結果爲false

Integer i = 100;
Integer j = 100;
System.out.print(i == j); //true
Integer i = 128;
Integer j = 128;
System.out.print(i == j); //false

對於第4條的原因: 
java在編譯Integer i = 100 ;時,會翻譯成爲Integer i = Integer.valueOf(100);,而java API中對Integer類型的valueOf的定義如下:

public static Integer valueOf(int i){
    assert IntegerCache.high >= 127;
    if (i >= IntegerCache.low && i <= IntegerCache.high){
        return IntegerCache.cache[i + (-IntegerCache.low)];
    }
    return new Integer(i);
}

java對於-128到127之間的數,會進行緩存,Integer i = 127時,會將127進行緩存,下次再寫Integer j = 127時,就會直接從緩存中取,就不會new了


String / new String的區別比較

今天看到這樣的面試題,如下:

var yiifaa = 'yiifaa',
    str1 = new String(yiifaa),
    str2 = String(yiifaa)

聲明與賦值了3個變量,然後考題如下:

//  請確認以下的判斷是否準確
str1 === yiifaa
//
str2 === yiifaa
//
typeof str1 === typeof str2

根據JS的語法,要滿足===的條件如下:
1. 如果是引用類型,則兩個變量必須指向同一個對象(同一個地址);
2. 如果是基本類型,則兩個變量除了類型必須相同外,值還必須相等。

再把話題切換到String對象上來,String的聲明方式有三種(請參見第一段代碼),但產生的類型卻不盡相同,結果如下:

//  類型爲string,爲基本類型
typeof yiifaa
//  類型爲object,爲引用類型
typeof str1
//  類型爲string,爲基本類型
typeof str2

那現在答案很清楚了,如下:

//  false, 因爲str1爲引用類型
str1 === yiifaa
//  true, 因爲都是基本類型,並且值相等
str2 === yiifaa
// false, 雖然都是字符串,但分別爲object與string
typeof str1 === typeof str2

總結

很神奇的String對象,一方面可以作爲基本類型,另一方面還可以作爲引用類型,更神奇的是,爲String.prototype添加方法,基本類型還可以引用到,怎麼做到的?

對比JAVA的Integer對象的實現,利用int聲明的變量可不能調用Integer的方法,所以還不是裝箱操作。

最後關於一個函數既可以作爲普通函數調用,也可以作爲構造函數調用,實現方法如下:

function User(username) {
    this.username = username
    //  這肯定是作爲函數調用,但在服務端判斷需要改進
    //  必須要進行判斷,否則死循環
    if(this === window) {
        return new User(username)
    }
}

改進的方法如下:

function User(username) {
    //  一定是調用了構造函數
    if(this.inst === "User") {
        this.username = username
    } else {
        return new User(username)
    }
}
//  爲User的上下文添加標記
User.prototype.inst = "User"

連續子數組求最大值的問題

/*
輸入一個整型數組,數組裏面有正數也有負數,數組中連續的一個或多個整數組
成子數組,每個子數組都有一個和。求所有子數組的和的最大值。例如,輸入的
數字爲:1,-2,3,10,-4,7,2,-5,則和最大的子數組爲 3,10,-4,7,2 和爲 18。

 */
public class TestArrays {
    public static void main(String[] args) {
        //目標數組
        int[] arr = {8,-9,2,-8,5,4,-2,1,15};

        MaxSum(arr);
    }

    private static void MaxSum(int[] arr) {
        //子數組和和
        int cursum = 0;
        int i ;
        //最大子數組的和
        int sum = 0;
        for ( i = 0 ; i < arr.length; i++) {
            cursum +=arr[i];
           if(cursum < 0){
               //當前子數組的和小於0,表示此指針k之前的數應該被拋棄,則子數組的和應該重新爲0
               cursum = 0;
           }if(cursum > sum){
               //當前子數組的和大於最大子數組的和,則替換
                sum = cursum;
            }if(sum == 0){
               //表示當前的數組中全是負數,則找到數組中的最小負數,就是最大值
                sum = findMax(arr);
            }
        }
        System.out.println(sum);
    }
    private static int findMax(int[] arr) {
        int max = arr[0];
        for (int i = 0; i < arr.length - 1;i++ ) {
            if(arr[i] < arr[ i+1]){
                max = arr[i+1];
            }
        }
        return max;
    }
}


那麼今天的內容是社招面試中會碰到的一系列面試題目,希望可以幫助在正準備社招或者學習Java的朋友(以下資料整理來自網絡,主要來自駱昊的技術專欄)。

放在第一個的是一本書(Java面試寶典2016版,對於Java初級來說是一本好書) :pdf版下載

Java面試題全集(以下列出題目,)

整理以及看答案請轉至:Java面試題全集(上)

1、面向對象的特徵有哪些方面?
2、訪問修飾符public,private,protected,以及不寫(默認)時的區別?
3、String 是最基本的數據類型嗎?
4、float f=3.4;是否正確?
5、short s1 = 1; s1 = s1 + 1;有錯嗎?short s1 = 1; s1 += 1;有錯嗎?
6、Java有沒有goto?
7、int和Integer有什麼區別?
8、&amp;和&amp;&amp;的區別?
9、解釋內存中的棧(stack)、堆(heap)和靜態區(static area)的用法。
10、Math.round(11.5) 等於多少?Math.round(-11.5)等於多少?
11、switch 是否能作用在byte 上,是否能作用在long 上,是否能作用在String上?
12、用最有效率的方法計算2乘以8?
13、數組有沒有length()方法?String有沒有length()方法?
14、在Java中,如何跳出當前的多重嵌套循環?
15、構造器(constructor)是否可被重寫(override)?
16、兩個對象值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對不對?
17、是否可以繼承String類?
18、當一個對象被當作參數傳遞到一個方法後,此方法可改變這個對象的屬性,並可返回變化後的結果,那麼這裏到底是值傳遞還是引用傳遞?
19、String和StringBuilder、StringBuffer的區別?
20、重載(Overload)和重寫(Override)的區別。重載的方法能否根據返回類型進行區分?
21、描述一下JVM加載class文件的原理機制?
22、char 型變量中能不能存貯一箇中文漢字,爲什麼?
23、抽象類(abstract class)和接口(interface)有什麼異同?
24、靜態嵌套類(Static Nested Class)和內部類(Inner Class)的不同?
25、Java 中會存在內存泄漏嗎,請簡單描述。
26、抽象的(abstract)方法是否可同時是靜態的(static),是否可同時是本地方法(native),是否可同時被synchronized修飾?
27、闡述靜態變量和實例變量的區別。
28、是否可以從一個靜態(static)方法內部發出對非靜態(non-static)方法的調用?
29、如何實現對象克隆?
31、String s = new String("xyz");創建了幾個字符串對象?
32、接口是否可繼承(extends)接口?抽象類是否可實現(implements)接口?抽象類是否可繼承具體類(concrete class)?
33、一個".java"源文件中是否可以包含多個類(不是內部類)?有什麼限制?
34、Anonymous Inner Class(匿名內部類)是否可以繼承其它類?是否可以實現接口?
35、內部類可以引用它的包含類(外部類)的成員嗎?有沒有什麼限制?
36、Java 中的final關鍵字有哪些用法?
38、數據類型之間的轉換:
39、如何實現字符串的反轉及替換?
40、怎樣將GB2312編碼的字符串轉換爲ISO-8859-1編碼的字符串?
41、日期和時間:
42、打印昨天的當前時刻。
43、比較一下Java和JavaSciprt。
44、什麼時候用斷言(assert)?
45、Error和Exception有什麼區別?
46、try{}裏有一個return語句,那麼緊跟在這個try後的finally{}裏的代碼會不會被執行,什麼時候被執行,在return前還是後?
47、Java語言如何進行異常處理,關鍵字:throws、throw、try、catch、finally分別如何使用?
48、運行時異常與受檢異常有何異同?
49、列出一些你常見的運行時異常?
50、闡述final、finally、finalize的區別。
51、類ExampleA繼承Exception,類ExampleB繼承ExampleA。
請問執行此段代碼的輸出是什麼?
52、List、Set、Map是否繼承自Collection接口?
53、闡述ArrayList、Vector、LinkedList的存儲性能和特性。
54、Collection和Collections的區別?
55、List、Map、Set三個接口存取元素時,各有什麼特點?
56、TreeMap和TreeSet在排序時如何比較元素?Collections工具類中的sort()方法如何比較元素?
57、Thread類的sleep()方法和對象的wait()方法都可以讓線程暫停執行,它們有什麼區別?
58、線程的sleep()方法和yield()方法有什麼區別?
59、當一個線程進入一個對象的synchronized方法A之後,其它線程是否可進入此對象的synchronized方法B?
60、請說出與線程同步以及線程調度相關的方法。
61、編寫多線程程序有幾種實現方式?
62、synchronized關鍵字的用法?
63、舉例說明同步和異步。
64、啓動一個線程是調用run()還是start()方法?
65、什麼是線程池(thread pool)?
66、線程的基本狀態以及狀態之間的關係?
67、簡述synchronized 和java.util.concurrent.locks.Lock的異同?
68、Java中如何實現序列化,有什麼意義?
69、Java中有幾種類型的流?
70、寫一個方法,輸入一個文件名和一個字符串,統計這個字符串在這個文件中出現的次數。
71、如何用Java代碼列出一個目錄下所有的文件?
72、用Java的套接字編程實現一個多線程的回顯(echo)服務器。
73、XML文檔定義有幾種形式?它們之間有何本質區別?解析XML文檔有哪幾種方式?
74、你在項目中哪些地方用到了XML?
75、闡述JDBC操作數據庫的步驟。
76、Statement和PreparedStatement有什麼區別?哪個性能更好?
77、使用JDBC操作數據庫時,如何提升讀取數據的性能?如何提升更新數據的性能?
78、在進行數據庫編程時,連接池有什麼作用?
79、什麼是DAO模式?
80、事務的ACID是指什麼?
81、JDBC中如何進行事務處理?
82、JDBC能否處理Blob和Clob?
83、簡述正則表達式及其用途。
84、Java中是如何支持正則表達式操作的?
85、獲得一個類的類對象有哪些方式?
86、如何通過反射創建對象?
87、如何通過反射獲取和設置對象私有字段的值?
88、如何通過反射調用對象的方法?
89、簡述一下面向對象的"六原則一法則"。
90、簡述一下你瞭解的設計模式。
91、用Java寫一個單例類。
92、什麼是UML?
93、UML中有哪些常用的圖?
94、用Java寫一個冒泡排序。
95、用Java寫一個折半查找。

--------------------------------------------------------------------------

下面的答案放在收藏中,面試題答案中

96、闡述Servlet和CGI的區別?
97、Servlet接口中有哪些方法?
98、轉發(forward)和重定向(redirect)的區別?
99、JSP有哪些內置對象?作用分別是什麼?
100、get和post請求的區別?
101、常用的Web服務器有哪些?
102、JSP和Servlet是什麼關係?
103、講解JSP中的四種作用域。
104、如何實現JSP或Servlet的單線程模式?
105、實現會話跟蹤的技術有哪些?
106、過濾器有哪些作用和用法?
107、監聽器有哪些作用和用法?
108、web.xml文件中可以配置哪些內容?
109、你的項目中使用過哪些JSTL標籤?
110、使用標籤庫有什麼好處?如何自定義JSP標籤?
111、說一下表達式語言(EL)的隱式對象及其作用。
112、表達式語言(EL)支持哪些運算符?
113、Java Web開發的Model 1和Model 2分別指的是什麼?
114、Servlet 3中的異步處理指的是什麼?
115、如何在基於Java的Web項目中實現文件上傳和下載?
116、服務器收到用戶提交的表單數據,到底是調用Servlet的doGet()還是doPost()方法?
117、JSP中的靜態包含和動態包含有什麼區別?
118、Servlet中如何獲取用戶提交的查詢參數或表單數據?
119、Servlet中如何獲取用戶配置的初始化參數以及服務器上下文參數?
120、如何設置請求的編碼以及響應內容的類型?
121、解釋一下網絡應用的模式及其特點。
122、什麼是Web Service(Web服務)?
123、概念解釋:SOAP、WSDL、UDDI。
124、Java規範中和Web Service相關的規範有哪些?
125、介紹一下你瞭解的Java領域的Web Service框架。

-----------------------------------------------------------------------------------

以下答案放在收藏中,

Java面試題全集(中)

126、什麼是ORM?
127、持久層設計要考慮的問題有哪些?你用過的持久層框架有哪些?
128、Hibernate中SessionFactory是線程安全的嗎?Session是線程安全的嗎(兩個線程能夠共享同一個Session嗎)?
129、Hibernate中Session的load和get方法的區別是什麼?
130、Session的save()、update()、merge()、lock()、saveOrUpdate()和persist()方法分別是做什麼的?有什麼區別?
131、闡述Session加載實體對象的過程。
132、Query接口的list方法和iterate方法有什麼區別?
133、Hibernate如何實現分頁查詢?
134、鎖機制有什麼用?簡述Hibernate的悲觀鎖和樂觀鎖機制。
135、闡述實體對象的三種狀態以及轉換關係。
136、如何理解Hibernate的延遲加載機制?在實際應用中,延遲加載與Session關閉的矛盾是如何處理的?
137、舉一個多對多關聯的例子,並說明如何實現多對多關聯映射。
138、談一下你對繼承映射的理解。
139、簡述Hibernate常見優化策略。
140、談一談Hibernate的一級緩存、二級緩存和查詢緩存。
141、Hibernate中DetachedCriteria類是做什麼的?
142、@OneToMany註解的mappedBy屬性有什麼作用?
143、MyBatis中使用<code>#</code>和<code>$</code>書寫佔位符有什麼區別?
144、解釋一下MyBatis中命名空間(namespace)的作用。
145、MyBatis中的動態SQL是什麼意思?
146、什麼是IoC和DI?DI是如何實現的?
147、Spring中Bean的作用域有哪些?
148、解釋一下什麼叫AOP(面向切面編程)?
149、你是如何理解"橫切關注"這個概念的?
150、你如何理解AOP中的連接點(Joinpoint)、切點(Pointcut)、增強(Advice)、引介(Introduction)、織入(Weaving)、切面(Aspect)這些概念?
151、Spring中自動裝配的方式有哪些?
152、Spring中如何使用註解來配置Bean?有哪些相關的註解?
153、Spring支持的事務管理類型有哪些?你在項目中使用哪種方式?
154、如何在Web項目中配置Spring的IoC容器?
155、如何在Web項目中配置Spring MVC?
156、Spring MVC的工作原理是怎樣的?
157、如何在Spring IoC容器中配置數據源?
158、如何配置配置事務增強?
159、選擇使用Spring框架的原因(Spring框架爲企業級開發帶來的好處有哪些)?
160、Spring IoC容器配置Bean的方式?
161、闡述Spring框架中Bean的生命週期?
162、依賴注入時如何注入集合屬性?
163、Spring中的自動裝配有哪些限制?
164、在Web項目中如何獲得Spring的IoC容器?
165. 大型網站在架構上應當考慮哪些問題?
166、你用過的網站前端優化的技術有哪些?
167、你使用過的應用服務器優化技術有哪些?
168、什麼是XSS攻擊?什麼是SQL注入攻擊?什麼是CSRF攻擊?
169. 什麼是領域模型(domain model)?貧血模型(anaemic domain model)和充血模型(rich domain model)有什麼區別?
170. 談一談測試驅動開發(TDD)的好處以及你的理解。


發佈了29 篇原創文章 · 獲贊 39 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章