无招胜有招之语言基础
?
-
java的面向對象
面向對象是指用對象來模擬現實實際的事物,用對象之間的關系描述事物之間的聯系。面向對象的特點主要可以概括為封裝性,繼承性和多態性。
-
java語言的三大特征
封裝、繼承、多態,
封裝是面向對象編程的核心思想。將對象的屬性和行為分裝起來,其載體就是類,類通常對客戶隱藏起實現細節,這就是封裝的思想,簡單來說:就是把一個類封裝為一個高度自治和相對封閉的個體。
? ? ? ?繼承:指類與類之間的關系,實現代碼重用,即在已有類的基礎上定義新的類,新的類能繼承已有類的屬性與行為,并擴展? ? ? ? ?新的功能,而不需要把已有類的內容重新寫一遍。
? ? ? ?多態:簡單來說就是一個事物的多種形態,指同意操作作用于不同對象,可以有不同的解釋,產生不同的執行結果。
-
java語言數據類型
byte,short,int,long,boolean,char,float,double
-
java的自動類型轉換,強制類型轉換
自動類型轉換也稱隱式類型轉換,當滿足1、轉換的兩種數據類型彼此兼容。2、目標數據類型的取值范圍比元數據類型大。兩個條件時可以進行自動類型轉換。自動類型轉換可以保持數據的精度。
如:char->int->long->float->double
強制類型轉換又稱顯式轉換,指兩種數據類型轉換過程中需要顯示地進行聲明。當轉換的兩種數據類型彼此不兼容忙活著目標數據類型的取值范圍小于原類型而無法進行自動類型轉換是,就需要強制類型轉換。
-
String的不可變性, 虛擬機的常量池,String.intern() 的底層原理
-
String不可變性指String類中使用final關鍵字字符數組保存字符串,private final char value[],所以String對象是不可變的。
-
虛擬機的常量池,百度百科解釋:常量池在java用于保存在編譯期已確定的,已編譯的class文件中的一份數據。它包括了關于類,方法,接口等中的常量,也包括字符串常量。是JVM的一塊特殊的內存空間。
常量池的好處 常量池是為了避免頻繁的創建和銷毀對象而影響系統性能,其實現了對象的共享。
(1)節省內存空間(2)節省運行時間
-
String.intern() 的底層原理
public native String intern();String的intern()方法會查找在常量池中是否存在一份equal相等的字符串,如果有則返回該字符串的引用,如果沒有則添加自己的字符串進入常量池。
-
Java語言中的關鍵字: final、 static、transient、instanceof、volatile、synchronized
關于這些關鍵字的底層原理問題,交給你們了,歡迎留言好吧。o(╥﹏╥)o
final:1.final修飾的類不能被繼承,2.final修飾的方法不能被子類重寫,3.final修飾的變量是常量,初始化后不能被修改。
static:表示靜態,用于修飾成員變量、成員方法以及代碼塊。1.修飾的成員變量:又稱類變量,被整個類所有,因此可以通過類名直接訪問。2.修飾的成員方法,叫靜態方法,無需創建類的實例就可以調用靜態方法直接通過類名調用。3.靜態代碼塊:最早執行的代碼塊。
transient:讓某些被修飾的成員屬性變量不被序列化。
instanceof:用于判斷一個對象是否一個類(或接口)的實例,返回值為boolean值。也就是說,使用instanceof做判斷時,兩個類之間必須有關系。
volatile:簡單來說:保持內存可見性和防止指令重排序。即一旦一個共享變量被volatile修飾之后,具有兩層含義:1.保證了不同線程對這個變量進行操作是的可見性、即一個線程修改了某個變量的值,這個新值對其他線程來說是立即可見的。2.禁止進行指令重排序。
volatile本質是在告訴JVM當前變量在寄存器(內存)中的值是不確定的,需從主存中讀取。
synchronized:Synchronized的作用主要有三個:(1)確保線程互斥的訪問同步代碼(2)保證共享變量的修改能夠及時可見(3)有效解決重排序問題。
-
Java中常用的集臺類的實現原理: ArrayList/LinkedList/Vector、SynchronizedList/Vector、HashMap/HashTable/ConcurrentHashMap 互相的區別以及底層實現原理
ArrayList/LinkedList/Vector:1.ArrayList底層是用數組實現的,更擅長遍歷搜索查找,因為數組有下標的概念,可以很方便跳出指定的位置,不擅長插入和刪除的操作,線程不安全。2.LinkedList底層是用鏈表實現的,鏈表是一個個節點鏈起來的,擅長插入、刪除等操作。3.Vector底層是數組實現的,支持下邊訪問元素,查詢快,增刪慢,線程安全。
SynchronizedList/Vector:1.SynchronizedList和Vector的一個比較明顯區別就是一個使用了同步代碼塊,一個使用了同步方法。2..SynchronizedList有很好的擴展和兼容功能。他可以將所有的List的子類轉成線程安全的類。3.使用SynchronizedList的時候,進行遍歷時要手動進行同步處理。4.SynchronizedList可以指定鎖定的對象。
【補充】通過Collections.synchronizedList()方法可以將線程不安全的List轉成線程安全的List。
【補充】同步代碼塊和同步方法的區別 1.同步代碼塊在鎖定的范圍上可能比同步方法要小,一般來說鎖的范圍大小和性能是成反比的。 2.同步塊可以更加精確的控制鎖的作用域(鎖的作用域就是從鎖被獲取到其被釋放的時間),同步方法的鎖的作用域就是整個方法。 3.靜態代碼塊可以選擇對哪個對象加鎖,但是靜態方法只能給this對象加鎖。
HashMap/HashTable/ConcurrentHashMap :
先說HashMap和HashTable之間的區別:
1.map非線程安全、效率高、允許null鍵,rable線程安全、效率低、不允許null鍵,報nullpointerexception.
2、map初始容量大小16,每次擴容給2倍,table初始化大小16,每次擴容為原來的2n+1。
3.map底層數據結構為1.8后map在解決哈希沖突時有了較大的變化,當鏈表長度大于8時,將鏈表轉化為紅黑樹,以減少搜索時間。table沒有這種機制。
再說HashTable/ConcurrentHashMap之間的區別:兩者的區別主要體現在實現線程安全的方式上不同。
1.jdk1.7ConcurrentHashMap底層采用分段的數組(segment)和鏈表實現,jdk1.8后采用的數據結構和hashmap1.8的結構一樣,數組+鏈表+紅黑樹。table底層數據結構數組+鏈表。
2.實現線程安全的方式(重要):
**jdk1.7的時候,concurrentHashMap(分段鎖)對整個桶數組進行分割分段(segment),每一把鎖只鎖容器其中一部分數據,多線程訪問容器里不同數據段的數據,就不會存在鎖競爭,提高并發訪問率。1.8后摒棄segment的概念,并發控制使用synchronized和CAS來操作。
**.table使用synchronized來保證線程安全,效率非常低下。同一把鎖。阻塞。
-
動態代理的實現方式
常用的動態代理實現方式有兩種,一種是利用JDK反射機制生成代理,另外一種是使用CGLIB代理。
JDK代理必須要提供接口,而CGLIB則不需要,可以直接代理類。
所謂代理,就是一個人或者一個機構代表另一個人或者另一個機構采取行動。在一些情況下,一個客戶不想或者不能夠直接引用一個對象,而代理對象可以在客戶端和目標對象之前起到中介的作用。
動態代理與靜態代理相比較,最大的好處是接口中聲明的所有方法都被轉移到調用處理器一個集中的方法中處理(InvocationHandler.invoke)。這樣,在接口方法數量比較多的時候,我們可以進行靈活處理,而不需要像靜態代理那樣每一個方法進行中轉。而且動態代理的應用使我們的類職責更加單一,復用性更強
比較喜歡一個博主所寫的“關于動態代理與AOP的關系,個人覺得AOP是一種思想,而動態代理是一種AOP思想的實現!”。
路漫漫,加油!!!
?
?
?
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的无招胜有招之语言基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring整合mybatis基于注解
- 下一篇: maven项目创建过慢解决