Java基本數(shù)據(jù)類型(8種)
- 整型:byte僻焚、short允悦、int、long 對應(yīng)字節(jié)(8 16 32 64)
- 浮點型:float虑啤、double 對應(yīng)字節(jié)(32 64)
- Boolean型:boolean 對應(yīng)字節(jié)(1)
- 字符型:char 對應(yīng)字節(jié)(64)
string澡屡、stringBuffer、stringBuilder
- string
若連接后得到的字符串在靜態(tài)存儲區(qū)中早已存在咐旧,那么使用“+”優(yōu)于stringBuilder
- string能被繼承嗎驶鹉?
不能,因為string被final修飾铣墨,string為常量室埋,定義后不能修改
- stringBuffer與stringBuilder的區(qū)別
stringBuffer(字符串常量)---線程安全
stringBuilder(字符串常量)---線程非安全
Array和ArrayList的區(qū)別
- Array可以容納基本類型和對象,而ArrayList只能容納對象
- Array是指定大小的伊约,ArrayList是大小固定的
- Array沒有提供ArrayList那么多功能
適用與Array的場景
- 如果列表的大小已經(jīng)指定姚淆,大部分情況是存儲和遍歷它們
- 對于遍歷基本數(shù)據(jù)類型,盡管Collection使用自動裝箱來減輕編碼任務(wù)屡律,在指定大小的基本類型的列表上工作也會變得很慢
ArrayList和LinkedList的區(qū)別:(使用迭代進(jìn)行遍歷)
- ArrayList和LinkedList均實現(xiàn)了List接口
- ArrayList:實現(xiàn)了所有可選操作列表腌逢,包括null
- 特點:
查詢快、增刪慢(快:集合的特點超埋,內(nèi)存地址是連續(xù)的搏讶,只要知道一個,后面的都可以得到
慢:刪除或增加后霍殴,該索引后的所有數(shù)據(jù)進(jìn)行copy媒惕,所以較慢)
- LinkedList:鏈表數(shù)據(jù)結(jié)構(gòu)
- 特點:查詢慢,增刪快(快:只是修改記錄的前一個元素記錄的內(nèi)存地址發(fā)生改變
慢:挨個查詢進(jìn)行比較)
- LinkedList比ArrayList更占內(nèi)存来庭,因為LinkedList為每一個節(jié)點存儲兩個引用
類的實例化
- 類:指描述一種事物的定義妒蔚,是一個抽象的概念,是一些事物具有相同的特性的集合
- 實例:該種事物的一個具體的個體,是具體的東西
- 例:”動物“是一個類肴盏,”貓“和”狗“就是實例
- 實例化的順序
父類靜態(tài)變量>父類靜態(tài)代碼塊>子類靜態(tài)變量>子類靜態(tài)代碼塊>父類非靜態(tài)變量(實例成員)>父類構(gòu)造函數(shù)>子類非靜態(tài)變量(子類實力成員變量)>子類構(gòu)造函數(shù)
- 構(gòu)造函數(shù)
是一種特殊的方法科盛,主要用來創(chuàng)建對象時初始化對象,即為對象成員變量賦值
- 構(gòu)造函數(shù)的重載
特別的類有多個構(gòu)造函數(shù)菜皂,使用參數(shù)個數(shù)不同或或參數(shù)的類型進(jìn)行區(qū)分
- 特點:函數(shù)名與類名完全相同土涝,無返回值,無修飾符(包括void)不能被直接調(diào)用幌墓,須new
Map類(key--value型)
- HashMap
依賴于哈希表實現(xiàn)但壮,存儲位置根據(jù)鍵的哈希碼計算的
- TreeMap
使用紅黑樹(二叉樹),根據(jù)鍵的數(shù)據(jù)進(jìn)行排序存儲的(默認(rèn)升序)
- 區(qū)別
HashMap是線程非安全的常侣,TreeMap是線程安全的
抽象類和接口的區(qū)別
- 抽象類和接口都不能直接實例化蜡饵,如果要實例化,抽象類變量必須指向?qū)崿F(xiàn)所有抽象方法的子類對象胳施,接口變量必須指向?qū)崿F(xiàn)所有接口方法的類對象
- 抽象類要被子類繼承溯祸,接口要被類實現(xiàn)
- 接口只能做方法申明,抽象類可以做方法申明舞肆,也可以做方法實現(xiàn)
- 接口是定義的變量焦辅,只能是公共的靜態(tài)的常量,抽象類中的變量是普通變量
- 抽象類與抽象接口中的所有方法椿胯,必須被子類(實現(xiàn)類)全部實現(xiàn)筷登,否則子類也為抽象類,接口
- 抽象方法只能申明哩盲,不能實現(xiàn)
- 抽象類中可以沒有抽象方法
- 如果一個類中有抽象方法前方,那么這個類只能是抽象類
- 抽象方法要被實現(xiàn),所以不能是靜態(tài)的廉油,也不能是私有的
- 接口可以繼承接口惠险,并可以多繼承,但類只能單繼承
equals與==的區(qū)別
==是判斷兩個變量或?qū)嵗遣皇侵赶蛲粋€內(nèi)存空間
equals是判斷兩個變量或?qū)嵗赶虻膬?nèi)存空間的值是不是相同
Object有哪些公用方法
- 方法equals測試的是兩個對象是否相等
- 方法clone進(jìn)行對象拷貝
- 方法getClass返回和當(dāng)前對象相關(guān)的class對象
- 方法notify抒线、notifall班巩、wait都是用來對給定對象進(jìn)行線程同步的
Override與Overload的含義機(jī)區(qū)別
Overload顧名思義是重新加載
它可以表現(xiàn)類的多重性,在函數(shù)里面可以有相同的函數(shù)名但是參數(shù)名嘶炭、返回值抱慌、類型不能相同、或者說可以改變參數(shù)旱物、類型遥缕、返回值但是函數(shù)名不變
Overrider是重寫
在子類繼承父類的時候子類中可以定義某方法與其父類有相同的名稱和參數(shù),當(dāng)子類在調(diào)用這一個函數(shù)時自動調(diào)用子類的方法宵呛,而父類相當(dāng)于被覆蓋了
多態(tài)
- 抽象的講:多態(tài)就是同一消息可以根據(jù)發(fā)送對象的不同而采用多種不同的行為方式(發(fā)送消息即為函數(shù)調(diào)用)
- 實現(xiàn)的原理是動態(tài)綁定,程序調(diào)用的方法在運行期才動態(tài)綁定夕凝,追朔源碼可以發(fā)現(xiàn)宝穗,jvm通過參數(shù)的自動轉(zhuǎn)型來找到公用的方法
面向?qū)ο笫鞘裁?/h4>
面型對象是一種思想户秤,世間萬物都可以看作是一個對象,這里是討論面向?qū)ο缶幊蹋╫op)逮矛,java是一個支持并發(fā)鸡号,基于類和面向?qū)ο蟮挠嬎銠C(jī)編程語言
面向?qū)ο筌浖_發(fā)的優(yōu)點
- 代碼開發(fā)模塊化
- 代碼復(fù)用性強(qiáng)
- 增強(qiáng)代碼的可靠性和靈活性
- 增加代碼的可讀性
面向?qū)ο蟮乃拇蠡咎匦?/h4>
- 抽象
提取現(xiàn)實世界中某事物的關(guān)鍵特性,為該事物構(gòu)建模型的過程
- 封裝
可以使類具有獨立性和隔離性须鼎,保證類的高內(nèi)聚鲸伴,只暴露給外部或子類必須的屬性和方法
- 繼承
對現(xiàn)有類的一種復(fù)用機(jī)制
- 多態(tài)
多態(tài)是在繼承的基礎(chǔ)上實現(xiàn)的,三要素(1. 繼承 2. 重寫 3. 父類引用指向子類對象)父類引用指向不同的子類對象時晋控,調(diào)用相同的方法汞窗,呈現(xiàn)出不同的行為,就是類的多態(tài)性赡译,多態(tài)可分為編譯時仲吏、運行時
抽象、封裝蝌焚、繼承和多態(tài)是面向?qū)ο蟮幕A(chǔ)
面向?qū)ο蟮钠叽笤O(shè)計原則
SOLID原則(單一原則裹唆、開閉原則、里氏替換原則只洒、接口隔離原則和依賴倒置原則)
面型對象是一種思想户秤,世間萬物都可以看作是一個對象,這里是討論面向?qū)ο缶幊蹋╫op)逮矛,java是一個支持并發(fā)鸡号,基于類和面向?qū)ο蟮挠嬎銠C(jī)編程語言
- 抽象
提取現(xiàn)實世界中某事物的關(guān)鍵特性,為該事物構(gòu)建模型的過程
- 封裝
可以使類具有獨立性和隔離性须鼎,保證類的高內(nèi)聚鲸伴,只暴露給外部或子類必須的屬性和方法
- 繼承
對現(xiàn)有類的一種復(fù)用機(jī)制
- 多態(tài)
多態(tài)是在繼承的基礎(chǔ)上實現(xiàn)的,三要素(1. 繼承 2. 重寫 3. 父類引用指向子類對象)父類引用指向不同的子類對象時晋控,調(diào)用相同的方法汞窗,呈現(xiàn)出不同的行為,就是類的多態(tài)性赡译,多態(tài)可分為編譯時仲吏、運行時
抽象、封裝蝌焚、繼承和多態(tài)是面向?qū)ο蟮幕A(chǔ)
面向?qū)ο蟮钠叽笤O(shè)計原則
SOLID原則(單一原則裹唆、開閉原則、里氏替換原則只洒、接口隔離原則和依賴倒置原則)
迪萊特原則
組合伏于繼承原則(合成復(fù)用原則)
什么是值傳遞和引用傳遞
值傳遞是對基本型變量而言的许帐,傳遞的是該變量的一個副本,改變副本不影響變量本身
引用傳遞是對于對象型變量而言的毕谴,傳遞的是該對象的一個引用舞吭,因此外部對象對引用對象所做的改變會反映到多有的對象上
一般認(rèn)為Java內(nèi)的傳遞都是值傳遞,Java實例對象的傳遞是引用傳遞
面向?qū)ο笈c面向過程的區(qū)別
- 面向?qū)ο?/li>
把構(gòu)成問題事物分解成各個對象析珊,建立對象的目的不是為了完成一個步驟羡鸥,而是為了描述事物在整個解決問題的步驟中的行為
- 面向過程
分析出解決問題所需要的步驟,然后用函數(shù)把這些步驟一步一步實現(xiàn)忠寻,使用的時候一個一個依次調(diào)用就可以了
面向?qū)ο笫且怨δ軇澐志逶。嫦蜻^程是以步驟劃分
Java的優(yōu)點
- 簡單
只提供基本方法,減少了編程的復(fù)雜性
- 高效
可以用面向?qū)ο蟮姆椒枋鲇脩舻拿恳粋€動作
- 面向?qū)ο?/li>
- 平臺無關(guān)性
- 交互式特性
面向?qū)ο蟮木W(wǎng)絡(luò)編程語言奕剃,支持TCP/IP協(xié)議衷旅,使得交互式更為容易
- 多線程機(jī)制
Java能夠并行處理多項任務(wù)
- 動態(tài)的內(nèi)存管理機(jī)制
自動垃圾回收管理機(jī)制進(jìn)行內(nèi)存管理
- 安全性
- Java是解釋型的(jvm)
Java創(chuàng)建對象的幾種形式
- new 最常見的一種方法
- 調(diào)用對象的clone()方法
- 運用反射手段,調(diào)用Java.lang.class或者Java.lang.reflect.Constructor類的newInstance()實例方法
- 運用反序列化手段纵朋,調(diào)用Java.io.ObjectInputStream對象的readObject()方法
1和3都會明顯的顯示調(diào)用函數(shù)柿顶,2是在內(nèi)存上對已有對象的影印,所以不會調(diào)用構(gòu)造函數(shù)操软,4是從文件中還原類的對象也不會調(diào)用構(gòu)造函數(shù)
是否可以從一個靜態(tài)的(static)方法內(nèi)部發(fā)出對非靜態(tài)(non-static)方法的調(diào)用
不可以嘁锯,靜態(tài)方法只能訪問靜態(tài)成員,因為非靜態(tài)方法的調(diào)用要先創(chuàng)建對象,因此在調(diào)用靜態(tài)方法時可能對象并沒有初始化
靜態(tài)變量和實例變量的區(qū)別
- 靜態(tài)變量
被static修飾符修飾的變量家乘,也稱為類變量蝗羊,不屬于類的任何一個對象,一個類不管創(chuàng)建多少個對象仁锯,靜態(tài)變量在內(nèi)存中有且僅有一個拷貝
- 實例變量
必須依賴存于某一實例耀找,需要先創(chuàng)建對象然后通過對象才能訪問到它,靜態(tài)變量可以實現(xiàn)讓多個對象共享內(nèi)存业崖,在Java開發(fā)中野芒,上下文類和工具中通常會有大量的靜態(tài)成員
如何實現(xiàn)對象克隆
- 兩種方式
- 實現(xiàn)cloneable接口并重寫Object類中的clone()方法
- 實現(xiàn)Serializable接口通過對象的序列化和反序列化實現(xiàn)克隆,可以實現(xiàn)真正的clone
構(gòu)造函數(shù)
構(gòu)造函數(shù)用于初始化對象的狀態(tài)双炕,與方法類似狞悲,構(gòu)造函數(shù)還包含在創(chuàng)建對象時執(zhí)行的語句集合(即指令)
每次使用new關(guān)鍵字創(chuàng)建對象時,都會調(diào)用至少一個構(gòu)造函數(shù)雄家,用以將初始值分配給同一類的數(shù)據(jù)成員效诅,(構(gòu)造函數(shù)在對象或?qū)嵗齽?chuàng)建時被調(diào)用)
構(gòu)造函數(shù)的編寫規(guī)則
- 類的構(gòu)造函數(shù)必須與它所在的類名具有相同的名稱
- Java中的構(gòu)造函數(shù)不能是抽象的(abstract)、最終的(final)趟济、靜態(tài)的(static)的同步的(synchronized)
- 訪問修飾符可以用在構(gòu)造函數(shù)申明中來控制它的訪問即哪個其他類可以調(diào)用構(gòu)造函數(shù)
Class.forName(String className)這個方法的作用
通過類的全名獲得該類的類對象
AOP乱投、OOP、IOC顷编、DI
- AOP(面向切面編程)
將通用需求功能從不相關(guān)的類中分離出來戚炫,同時能夠使得很多類共享一個行為,一旦行為發(fā)生變化媳纬,不必修改很多類双肤,只要修改行為即可
- OOP(面向?qū)ο缶幊蹋?/li>
是一種計算機(jī)編程架構(gòu)
- IOC(控制反轉(zhuǎn))
控制指的是程序相關(guān)類之間的依賴關(guān)系,傳統(tǒng)觀念設(shè)計授內(nèi)閣通常由調(diào)用者來創(chuàng)建被調(diào)用著的實例钮惠,在spring里茅糜,創(chuàng)建被調(diào)用者的工作不再由調(diào)用者來完成,而是由spring容器完成素挽,依賴關(guān)系被反轉(zhuǎn)了蔑赘,成為控制反轉(zhuǎn),目的是為了獲得更好的擴(kuò)展性和良好的可維護(hù)性
- DI(依賴注入)
創(chuàng)建被調(diào)用者的工作由spring容器完成预明,然后注入調(diào)用者缩赛,因此也稱依賴注入,控制反轉(zhuǎn)和依賴注入是同一個概念
Java中final關(guān)鍵字有哪些用法
- 修飾類
表示該類不能被繼承
- 修飾方法
表示方法不能被重寫
- 修飾變量
表示變量只能一次賦值以后值不能被修改(常量)
什么時候用assert
assert(斷言)常用的調(diào)試方式撰糠,保證程序最基本酥馍、關(guān)鍵的正確性,在軟件發(fā)布后阅酪,assertion檢查通常是關(guān)閉的
final旨袒,finally汁针,finalize的區(qū)別
- final 修飾符(修飾類、修飾方法峦失、修飾變量)
- finally
通常放在try……catch后扇丛,只要jvm不關(guān)閉都執(zhí)行术吗,內(nèi)一般寫釋放外部資源的代碼
- finalize
Object中定義的方法尉辑,Java中允許使用finalize()方法在垃圾收集器將對象從內(nèi)存中清除出去之前做必要的清理工作,這個方法是由垃圾收集器在銷毀對象時調(diào)用的较屿,通過重寫finalize()方法可以整理系統(tǒng)資源或執(zhí)行其他清理工作