java基礎(chǔ)

1.面向?qū)ο蟮奶卣?br> 答案:繼承、多態(tài)、抽象、封裝
繼承:子類可以繼承父類,但是只能繼承一個
多態(tài):重寫(子類重寫父類的方法),重載(同一個類中方法參數(shù)類型或者個數(shù)不一樣)
抽象:把事務(wù)抽象出來,數(shù)據(jù)抽象(類的屬性),方法抽象(類的方法)
封裝:類,可以把屬性、方法封裝起來,允許可信的其他類調(diào)用;

2.final, finally, finalize 的區(qū)別
final可以修飾類(表示該類是最終類,不可被繼承)、方法(表示該方法是最終方法,不可被重寫,但是可以重載)、變量(表示該變量是最終變量,不可修改)
finally用在try catch后面,最終要執(zhí)行。即使try中return返回。
finalize可以為任何一個類添加,主動回收內(nèi)存,在垃圾回收前調(diào)用。finalize原理。

3.int 和 Integer 有什么區(qū)別
int屬于基本類型,而Integer屬于包裝類型。java在編譯Integer i5 = 127的時候,被翻譯成-> Integer i5 = Integer.valueOf(127)
Integer i5 = 127;
Integer i6 = 127;
i5 == i6 return true;
如果
Integer i5 = 128;
Integer i6 = 128;
i5 == i6 return flase

4.重載和重寫的區(qū)別:
重載是同一個類中,方法名相同,形參個數(shù)和類型不同的描述。
重寫(覆蓋)是子類重寫父類的方法(形參和返回值必須相同,子類必須重寫父類的abstract方法,不能重寫父類的final方法)

5.抽象類和接口有什么區(qū)別
抽象類是用abstract修飾的類,一定有抽象方法,可以有非抽象方法;抽象方法必須被子類實現(xiàn);抽象類被子類繼承
接口是接口,所有方法都是抽象方法,被類實現(xiàn)。

6.說說反射的用途及實現(xiàn)
反射機制是指在JVM運行時,對于任何一個對象,都能動態(tài)知道它的類、屬性和方法。應用:ide使用時,按點自動加載出方法,屬性;還有各種框架比如spring,
先在xml中配置好,等到需要使用時在加載。
三種實現(xiàn)方式:
對象的getClass()方法;
forname()方法,Class.forName("全限定類名")
Person.class 從類中獲取。

7.說說自定義注解的場景及實現(xiàn)
各種框架Spring、springMVC等,驗證屬性完整性等
實現(xiàn):@interface xxx {},通過反射檢測是否使用注解,getAnnottion

8.HTTP 請求的 GET 與 POST 方式的區(qū)別
http格式:請求行、請求頭、空行、消息體
狀態(tài)行、響應頭、空行、消息體
GET產(chǎn)生一個數(shù)據(jù)包;POST產(chǎn)生兩個數(shù)據(jù)包,對于POST,瀏覽器先發(fā)送header,服務(wù)器響應100 continue,瀏覽器再發(fā)送data,服務(wù)器響應200 ok(返回數(shù)據(jù))。

9.session 與 cookie 區(qū)別
session是一種上下文機制,作用于服務(wù)端,可以存在數(shù)據(jù)庫、集群或者文件中。用戶首次發(fā)起請求,服務(wù)端會產(chǎn)生一個SessionID,用來保存用戶的登錄信息。
同時,cookie作用于客戶端,用來跟蹤用戶的狀態(tài),分為瀏覽器cookie和文件cookie。用戶再次請求時,服務(wù)端會檢查cookie是否帶有sessionid。
cookie 存在本地文件中,可能不安全。而session是存在服務(wù)端的。

10.說說session的分布式處理
問題起因:現(xiàn)在的web-server都是分布式部署,nginx代理。如果第一個請求,分發(fā)到1號web-server上;客戶端再次請求就不應定分發(fā)到1號服務(wù)器上,session保存就沒有用。
解決方案:
1.session同步復制。(所有的web-server都賦值一份相同的,保存到各個服務(wù)器上。優(yōu)點是簡單。缺點顯而易見,所有的web服務(wù)器都需要復制,占用帶寬;而且數(shù)據(jù)量受內(nèi)存限制)
2.客戶端存儲法。客戶端cookie
3.反向代理hash一致性。(ip一致性,nginx將ip一致的請求發(fā)送到一個服務(wù)器上;七層:根據(jù)應用id來分發(fā)。)
4.后端存儲。數(shù)據(jù)庫或者緩存。 web-server重啟或者擴容都不會有session丟失,沒有安全隱患。缺點:需要增加一次網(wǎng)絡(luò)調(diào)用。

11.HashMap的工作原理
通過hash的方法,通過put和get存儲和獲取對象。存儲對象時,我們將K/V傳給put方法時,它調(diào)用hashCode計算hash從而得到bucket位置,進一步存儲,
HashMap會根據(jù)當前bucket的占用情況自動調(diào)整容量(超過Load Facotr則resize為原來的2倍)。獲取對象時,我們將K傳給get,它調(diào)用hashCode計算hash從而得到bucket位置,
并進一步調(diào)用equals()方法確定鍵值對。如果發(fā)生碰撞的時候,Hashmap通過鏈表將產(chǎn)生碰撞沖突的元素組織起來,在Java 8中,
如果一個bucket中碰撞沖突的元素超過某個限制(默認是8),則使用紅黑樹來替換鏈表,從而提高速度。

12.hashmap和hashtable的區(qū)別:(兩者都是無序的)
hashmap非線程安全,允許value為null
hashtable是線程安全,不允許null
單線程hashmap快。Synchronize

13.ConcurrentHashMap:
線程安全,hashtable升級。
1.7版本,最小粒度是segment數(shù)組和hashentry,put、get要進行兩次hashcode()計算。
1.8版本,最小粒度是hashentry

14.JDBC 流程
第一步;加載Driver類,注冊數(shù)據(jù)庫驅(qū)動
第二部:通過DriverManager,使用url,用戶名和密碼建立連接;
第三步:通過connection,使用sql語句打開Statement對象
傳入?yún)?shù),之所以這樣是為了防止sql注入
preparedStatement.setInt(1,18)
第四步:執(zhí)行語句,將結(jié)果返回resultset
第五步:關(guān)閉連接

15.MVC 設(shè)計思想
Model View Controller

16.equals 與 == 的區(qū)別
基本數(shù)據(jù)類型使用== 比較的是他們的值;引用數(shù)據(jù)類型==比較的是他們的堆內(nèi)存地址,因此比較引用數(shù)據(jù)類型的值需要用equals

17.runnable和callable有什么區(qū)別?
callable是1.5版本新增的,最大的區(qū)別是實現(xiàn)callable接口的線程能返回執(zhí)行結(jié)果;而實現(xiàn)runnable接口的線程無法返回執(zhí)行結(jié)果。call()方法能夠允許拋出異常,而run()只能內(nèi)部處理異常。

集合:
1.List 和 Set 區(qū)別:
list允許重復元素,set不允許重復元素

2.List 和 Map 區(qū)別
list存放單個元素,map存放key-value鍵值對。hashmap、treemap,treemap有序。

3.Arraylist 與 LinkedList 區(qū)別
Arraylist 與 LinkedList 區(qū)別:
Arraylist基于動態(tài)數(shù)組,LinkedList基于鏈表。
一般來說,ArrayList的查找速度比LinkedList快,但是增加、刪除元素LinkedList快。

Arraylist和Vector區(qū)別:
Arraylist和Vector都是基于數(shù)組的List,但是Vector是線程安全的,資源開銷大。
兩者的區(qū)別還有:如果數(shù)組的大小不夠,需要擴展的大小不一樣。Arraylist是50%+1,Vector是擴展一倍。

HashMap 和 Hashtable 的區(qū)別:
兩者都是基于哈希表來實現(xiàn)鍵值映射的工具類。
hashtable是線程安全的。hashmap支持value為null,hashtable不行。
hashmap擴容是2倍,hashtable

HashSet 和 HashMap 區(qū)別:
HashSet實現(xiàn)的set接口,HashMap實現(xiàn)map接口。一個存儲對象,一個存儲鍵值對。
Set通過add添加元素,map使用put添加元素。

4.HashMap 和 Hashtable 的區(qū)別
Hashtbale是線程安全,而HashMap是非線程安全。HashMap支持null值,HashTable不支持。兩個擴容方式不一樣:Hashmap是直接括兩倍,hashtable是2n+1

5.HashSet 和 HashMap 區(qū)別
HashMap存的是鍵值對,hashtable存的是對象,實現(xiàn)了set接口,是collection子集

6.HashMap 和 ConcurrentHashMap 的區(qū)別
ConcurrentHashMap是線程安全的,Hashmap非線程安全

7.HashMap的實現(xiàn)原理:
簡單地說,HashMap 在底層將 key-value 當成一個整體進行處理,這個整體就是一個 Entry 對象。HashMap 底層采用一個 Entry[] 數(shù)組來保存所有的 key-value 對,當需要存儲一個 Entry 對象時,會根據(jù)hash算法來決定其在數(shù)組中的存儲位置,在根據(jù)equals方法決定其在該數(shù)組位置上的鏈表中的存儲位置;當需要取出一個Entry時,
也會根據(jù)hash算法找到其在數(shù)組中的存儲位置,再根據(jù)equals方法從該位置上的鏈表中取出該Entry。

線程:
1.創(chuàng)建線程的方式及實現(xiàn)
實現(xiàn)Runnable接口(callable接口),或者繼承Thread。

1.什么是線程?
線程是操作系統(tǒng)能夠進行運算調(diào)度的最小單位,它被包含在進程中,是進程中的實際運作單位。程序員可以通過它進行多處理器(并發(fā))編程,也可以使用
多線程對運算密集型任務(wù)提速,

2.線程和進程有什么區(qū)別?
線程是進程的子集,一個進程可以有多個線程,每條線程并行執(zhí)行不同的任務(wù)。不同的進程使用不同的內(nèi)存空間,而所有的線程共享一片相同的內(nèi)存空間。
每個線程都有單獨的棧內(nèi)存在存儲本地數(shù)據(jù)。

3.如何java中實現(xiàn)線程?
三種方式,分別是實現(xiàn)Runnable接口、Callable接口,或者集成Thread.

4.用Runnable還是Thread?
因為java不支持多繼承,但是支持調(diào)用多個接口,因此建議使用Runnable接口。

5.Java中Runnable和Callable有什么不同?
Runnable沒有返回值,不能拋出異常;Callable有返回值且能拋出異常。Callable是JDK1.5增加的。

6.Java中CyclicBarrier和CountDownLatch有什么不同?
兩個都可以實現(xiàn)一組線程等待其他線程。但是CountDownLatch不能重新使用。

7.java的內(nèi)存模型是什么?
java內(nèi)存模型規(guī)定和指引Java程序在不同的內(nèi)存架構(gòu)、CPU和操作系統(tǒng)間有確定性的行為。它在多線程的情況下尤其重要。Java內(nèi)存模型對一個線程所做的
變動能被其他線程可見提供了保證,他們之間是先行發(fā)生關(guān)系,這個關(guān)系定義了一些規(guī)則讓程序員在并發(fā)編程時思路更清晰。比如:先行發(fā)生關(guān)系確保了:
*線程內(nèi)的代碼能夠按先后順序執(zhí)行,這被稱為程序次序規(guī)則。
*對于同一個鎖,一個解鎖操作一定要發(fā)生在時間上后發(fā)生的另一個鎖定操作之前,也叫做管程鎖定規(guī)則;
*前一個對volatile的寫操作在后一個volatile的讀操作之前。
*一個線程內(nèi)的任何操作必須在這個線程的start()調(diào)用之后,也要作線程啟動規(guī)則。
*一個線程內(nèi)的任何操作都會在線程終止之前,線程終止規(guī)則。
*一個對象的中介操作必須在這個對象構(gòu)造完成之后,也叫對象終結(jié)規(guī)則。
*可傳遞性;

8.Java中的volatile變量是什么?
是一個特殊的修飾符,只有成員變量才能使用它。在java并發(fā)程序缺少同步類的情況下,多線程對成員變量的操作對其他線程是透明的。volatile變量可以保證
下一個讀取操作會在前一個寫操作之后發(fā)生。
*保證了不同線程對這個變量進行操作時的可見性,即一個線程修改了某個變量的值,這新值對其他線程來說是立即可見的。
*進制進行指令重排序。

9.什么是線程安全?Vector是一個線程安全類嗎?
線程安全:如果一個代碼會在多個線程中運行的,其結(jié)果與單個線程運行結(jié)果一致,且其他的變量的值也和預期的是一樣的,就是線程安全。Vector是線程安全的集合。

10.Java中什么是競態(tài)條件? 舉個例子說明。
競態(tài)條件會導致程序在并發(fā)情況下出現(xiàn)一些bugs。舉例:兩個線程對一個文件進行操作,如果文件a不存在,就創(chuàng)建一個新的;一個先判斷不存在,創(chuàng)建;另一個也會這么多,就出現(xiàn)的文件的重復創(chuàng)建,覆蓋。

11.Java中如何停止一個線程?
jdk1.0本來有stop、suspend等方法,但是由于潛在的死鎖威脅因此被棄用。當線程執(zhí)行完線程會自動結(jié)束,可以用volatile布爾值來中斷線程。

12.一個線程運行時發(fā)生異常會怎樣?
如果該異常被捕獲或拋出,則線程繼續(xù)運行;如果沒有沒有被捕獲,線程將會停止。Tread.UncaughtExceptionHandler是用于處理未捕獲一場造成
線程突然中斷情況的一個內(nèi)嵌接口。當一個未捕獲異常將造成線程中斷的時候,JVM會使用Thread.getUncaughtExceptionHandle()來查詢線程的UncaughtExceptionHandler,
并將線程和異常作為參數(shù)傳遞給handler的uncaughtException()方法進行處理。

13.如何在兩個線程間共享數(shù)據(jù)?
共享數(shù)據(jù)場景有兩種:
*賣火車票。
解決方案:創(chuàng)建一個Runnable,這個Runnable里有共享數(shù)據(jù)。如果每個線程執(zhí)行的代碼相同,那么可以使用同一個runnable對象,這個runnable有那個共享數(shù)據(jù),例如,賣票系統(tǒng)就是這么做的.
*銀行存錢問題。
解決方案:如果每個線程執(zhí)行的代碼不同,那么要使用不同的runnable對象,有如下兩種方式可以實現(xiàn)runnable對象間的數(shù)據(jù)共享
實現(xiàn)兩個runnable對象,將共享數(shù)據(jù)分別傳遞給兩個不同線程.
將這些Runnable對象作為一個內(nèi)部類,將共享數(shù)據(jù)作為成員變量.

http://www.cnblogs.com/dolphin0520/p/3958019.html

MySQL 索引使用的注意事項
◆索引不會包含有NULL值的列
只要列中包含有NULL值都將不會被包含在索引中,復合索引中只要有一列含有NULL值,那么這一列對于此復合索引就是無效的。所以我們在數(shù)據(jù)庫設(shè)計時不要讓字段的默認值為NULL。
◆使用短索引
對串列進行索引,如果可能應該指定一個前綴長度。例如,如果有一個CHAR(255)的列,如果在前10個或20個字符內(nèi),多數(shù)值是惟一的,那么就不要對整個列進行索引。短索引不僅可以提高查詢速度而且可以節(jié)省磁盤空間和I/O操作。
◆索引列排序
MySQL查詢只使用一個索引,因此如果where子句中已經(jīng)使用了索引的話,那么order by中的列是不會使用索引的。因此數(shù)據(jù)庫默認排序可以符合要求的情況下不要使用排序操作;盡量不要包含多個列的排序,如果需要最好給這些列創(chuàng)建復合索引。
◆like語句操作
一般情況下不鼓勵使用like操作,如果非使用不可,如何使用也是一個問題。like “%aaa%” 不會使用索引而like “aaa%”可以使用索引。
◆不要在列上進行運算
select * from users where YEAR(adddate)<2007; 將在每個行上進行運算,這將導致索引失效而進行全表掃描,因此我們可以改成
select * from users where adddate<‘2007-01-01’;
◆不使用NOT IN和<>操作

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容