Java的基本特征:封裝、抽象否过、繼承躏精、多態(tài)
八個(gè)基本數(shù)據(jù)類型
數(shù)字Byte short int long float double
字符Char
非數(shù)字非字符Boolean
面向?qū)ο筇卣鞲拍?/p>
封裝:私有化屬性驮履,并提供公有化方法來對(duì)屬性進(jìn)行取值和設(shè)置鱼辙。
繼承:子類繼承父類,并擁有父類給予的屬性和方法
多態(tài):不同對(duì)象對(duì)同一方法作用不一樣(一把剪刀玫镐,看誰用倒戏,給理發(fā)師用,園藝師用)
有了基本類型為什么還要有包裝類型呢恐似?
基本類型并不具有對(duì)象的性質(zhì)杜跷,為了讓基本類型也具有對(duì)象的特征,就出現(xiàn)了包裝類型矫夷。當(dāng)需要往ArrayList葱椭,HashMap中放東西時(shí),像int口四,double這種基本類型是放不進(jìn)去的,因?yàn)槿萜鞫际茄bobject的秦陋,這是就需要這些基本類型的包裝器類了蔓彩。
Continue跳出當(dāng)前循環(huán),進(jìn)入下一循環(huán)
Break跳出此次循環(huán)驳概,結(jié)束循環(huán)
Return跳出當(dāng)前方法
System.Exit(參數(shù))0表示正常退出赤嚼,跳出整個(gè)程序
==和equal有什么區(qū)別
==是基本數(shù)據(jù)類型比較的值
==用來比較引用數(shù)據(jù)類型的話是比較的地址值
Equal用來比較引用數(shù)據(jù)類型的值是否相等
引用數(shù)據(jù)和基本數(shù)據(jù)類型的區(qū)別
引用數(shù)據(jù)類型的值存在堆中,棧存的是地址值顺又「洌基本數(shù)據(jù)類型存在棧中
String是不可變字符串,StringBuilder和StringBuffer是可變字符串
StringBuffer是線程安全的稚照,效率較低StringBuilder不是線程安全的蹂空,效率較高
字符串常的方法
Length()統(tǒng)計(jì)的是字符串的長度
Indexof(string str)指的是str在字符串中第一次出現(xiàn)的位置
CharAt(int i)返回的是索引對(duì)應(yīng)的字符
ToUpperCase()小寫轉(zhuǎn)大寫
ToLowercase()大寫轉(zhuǎn)小寫
ReplaceAll()替換掉當(dāng)前字符串指定的內(nèi)容
Date時(shí)間轉(zhuǎn)換格式
DateFormate df=new SimpleDateFormate(“yyyy-MM-dd HH:mm:ss”)df.formate(date類型放入)
有序集合
Set下有HashSet俯萌,LinkedHashSet,TreeSet
List下有ArrayList上枕,Vector咐熙,LinkedList
Map下有Hashtable,LinkedHashMap辨萍,HashMap棋恼,TreeMap
List 有序,可重復(fù)
ArrayList優(yōu)點(diǎn):底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組,查詢快锈玉。
Vector優(yōu)點(diǎn):底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組爪飘,線程安全
LinkedList優(yōu)點(diǎn):底層數(shù)據(jù)結(jié)構(gòu)是鏈表,增刪快
Set 無序,唯一
HashSet
底層數(shù)據(jù)結(jié)構(gòu)是哈希表拉背。(無序,唯一)
如何來保證元素唯一性?
1.依賴兩個(gè)方法:hashCode()和equals()
LinkedHashSet
底層數(shù)據(jù)結(jié)構(gòu)是鏈表和哈希表师崎。(FIFO先進(jìn)先出插入有序,唯一)
1.由鏈表保證元素有序
2.由哈希表保證元素唯一
TreeSet
底層數(shù)據(jù)結(jié)構(gòu)是紅黑樹。(唯一去团,有序)
1.如何保證元素排序的呢?
自然排序
比較器排序
2.如何保證元素唯一性的呢?
根據(jù)compareto()比較的返回值是否是0來決定(0則相等不儲(chǔ)存)
Map接口有三個(gè)比較重要的實(shí)現(xiàn)類抡诞,分別是HashMap、TreeMap和HashTable土陪。
TreeMap是有序的昼汗,HashMap和HashTable都是是無序的,兩者最主要的區(qū)別鬼雀。
Hashtable的方法是同步的顷窒,線程安全的,效率較低源哩,不允許null值鞋吉。HashMap的方法不是同步的,不是線程安全的励烦,效率較高谓着,允許null值。
HashMap常用的方法:
size()返回map的長度
put(key,value)將鍵值對(duì)放入集合中
get(key)通過key值得到對(duì)應(yīng)value
containKey(key)返回對(duì)應(yīng)是否有該key值的boolean
List是有序的坛掠,而且可以存放重復(fù)值赊锚,Set是無序的,不可以存放重復(fù)值
5.ArrayList底層代碼是數(shù)組屉栓,查詢效率高舷蒲,增加刪除效率低,LinkedList的底層代碼是鏈表增加刪除效率高
6.HashMap是可以用null當(dāng)做key值或者value值友多,但HashTable不能
HashMap不是線程安全的牲平,效率較高,HashTable是線程安全的域滥,但效率較低
知識(shí)拓展:
我想線程安全但是我又想效率高纵柿?尚未了解和證實(shí)
通過把整個(gè)Map分為N個(gè)Segment(類似HashTable)蜈抓,可以提供相同的線程安全,但是效率提升N倍藐窄,默認(rèn)提升16倍资昧。
Java的四種內(nèi)部類包括如下:
1、成員內(nèi)部類
2荆忍、靜態(tài)內(nèi)部類
3格带、局部內(nèi)部類
4、匿名內(nèi)部類
如果需要訪問內(nèi)部的屬性或者方法刹枉,必須先實(shí)例主類叽唱,然后通過主類的實(shí)例.new方式獲取內(nèi)部類對(duì)象。
訪問修飾符
? ????????訪問權(quán)限類 ? 包 ?子類 ?其他包
??public ? ? ∨ ??∨ ?? ∨ ? ??∨????????? (對(duì)任何人都是可用的)
?protect ? ?∨ ??∨ ??∨ ? ? × (繼承的類可以訪問以及和private一
?default ? ?∨ ??∨ ??× ? ??× (包訪問權(quán)限即在整個(gè)包內(nèi)均可被訪問)
?private ? ?∨ ??× ??× ? ??× (除類型創(chuàng)建者和類型的內(nèi)部方法之外的任何人都不能訪問的元素)
?當(dāng)用final修飾一個(gè)類時(shí)微宝,表明這個(gè)類不能被繼承棺亭。final修飾的方法表明這個(gè)方法不能重寫? final成員變量表示常量,只能被賦值一次蟋软,賦值后值不再改變
關(guān)系型數(shù)據(jù)庫:Mysql,Oracle,Sql Server
非關(guān)系型數(shù)據(jù)庫:MongoDB尤其擅長存儲(chǔ)json格式的數(shù)據(jù)镶摘。存儲(chǔ)的量大概在10億級(jí)別,再往上性能就下降了岳守,除非另外分庫Hbase(大數(shù)據(jù)常用的數(shù)據(jù)庫)擅長rowkey的快速查詢存儲(chǔ)的量可以達(dá)到百億甚至以上
SQL語法
添加語法insert ?into表名(字段1,字段2...) values(字段1的值凄敢,字段2的值...)
修改的語法update表名 set 字段1=值1,字段2=值2 ..... ?where 條件
刪除語法delete from表名 ??where ?條件
查詢語法select字段1,字段2.... 或者 * ??from ?表名 ?+條件
String ?StringBuffer ?StringBuilder
不同點(diǎn):
String是不可變字符串,如果長度或者內(nèi)容發(fā)生改變湿痢,那么會(huì)重新開辟空間涝缝。
StringBuffer和StringBuilder都是可變字符串。如果長度或者內(nèi)容發(fā)生改變譬重,不會(huì)重新開辟空間拒逮。StringBuffer是線程安全的,在多線程環(huán)境下使用比較安全臀规。StringBuilder非線程安全滩援,速度會(huì)比StringBuffer來得快。
File類
常用方法:
exists()判斷文件或者目錄是否存在
isFile() ???isDirectory()判斷是否文件或者目錄
delete()刪除文件或者目錄
length()返回文件的長度
getName()返回文件的名稱
getAbsoluteName返回文件的絕對(duì)路徑
createFile()創(chuàng)建文件并返回是否創(chuàng)建成功
mkdir()創(chuàng)建目錄塔嬉,父級(jí)目錄必須存在
mkdirs()創(chuàng)建目錄 玩徊,父級(jí)目錄不存在也可以創(chuàng)建
流的概念
按照流的方向:輸入流和輸出流
傳輸?shù)臄?shù)據(jù)類型:字節(jié)流和字符流
基本上所有的文件都可以使用字節(jié)流來傳輸,但是特殊文件比如說中文內(nèi)容的記事本邑遏,world文檔等等一些含有中文內(nèi)容的文件,那么可以考慮使用字符流恰矩,如果使用字節(jié)流记盒,有可能出現(xiàn)亂碼。
字節(jié)流
FileinputStream
用于讀取文件的內(nèi)容(從文件中讀取數(shù)據(jù)到內(nèi)存中)外傅,屬于字節(jié)流纪吮。
構(gòu)造方法:
FileinputStream fis=new FileInputStream(File對(duì)象)
常用方法:
close()讀取結(jié)束后關(guān)閉流
read()…….讀取一個(gè)字節(jié)俩檬,返回讀取的內(nèi)容,當(dāng)返回值為-1表示讀取結(jié)束碾盟。
read(byte數(shù)組) ??一次讀取指定byte數(shù)組長度個(gè)的內(nèi)容棚辽,當(dāng)返回值為-1表示讀取結(jié)束。
FileOutputStream
文件輸出流冰肴,用來將內(nèi)存中的數(shù)據(jù)寫入到文件中屈藐。
構(gòu)造
FileOutputStream ?fos=new ?FileOutputStream(file對(duì)象);
常用方法:
write(byte數(shù)組)一次性寫入byte數(shù)組長度的內(nèi)容
close()關(guān)閉文件輸出流义屏。
字符流
FileRead:以字符流的形式讀取文件中的內(nèi)容
構(gòu)造方法
FileRead read=new FileRead(file對(duì)象)
通常FileRead讀取效率較低梳毙,建議配合BufferReader來使用
BufferReader br=new BufferReader(fileRead對(duì)象)
調(diào)用BufferReader對(duì)象readLine()茸塞,按照行來讀取字符摧扇。
FileWriter:以字符流的形式寫入到文件中
構(gòu)造方法
FileWriter fw=new FileWriter(file對(duì)象)沐悦;
由于FileWriter方法讀取效率較低难咕,通常結(jié)合BufferWriter來使用
BufferWriter bw=new BufferWriter (FileWriter的對(duì)象)
常用方法:
write(字符串) ????寫入字符串
newline()換行
close()關(guān)閉流
對(duì)象流
ObjectInputStream和ObjectOutputStream
通常要結(jié)合FileInputStream和FileOutputStream一起使用痢艺,寫入的對(duì)象必須實(shí)現(xiàn)序列化接口
對(duì)象流要注意的事項(xiàng):
1要存入的對(duì)象必須是實(shí)現(xiàn)序列化接口(Serializable)
2流必須在讀取結(jié)束或者寫入結(jié)束的時(shí)候關(guān)閉
3 outputStream或者Writer 在調(diào)用write方法后赘理,記得再調(diào)用flush方法铅歼。
4對(duì)于連續(xù)寫入到文件流公壤,默認(rèn)情況下都寫入頭文件,可能在讀取時(shí)候引發(fā) ?invalid type … AC. ?解決方法就是重寫ObjectOutputStream中的writeStreamHeader()方法椎椰,直接返回厦幅。
對(duì)象序列化
Java的對(duì)象序列化(Object Serialization)將那些實(shí)現(xiàn)了 Serializable接口的對(duì)象轉(zhuǎn)換成一個(gè)字節(jié)序列,并可以在以后將這個(gè)字節(jié)序列完全恢復(fù)為原來的對(duì)象俭识。這一過程甚至可通過網(wǎng)絡(luò)進(jìn)行慨削。這意味著序列化機(jī)制能自動(dòng)彌補(bǔ)不同操作系統(tǒng)之間的差異。
只要對(duì)象實(shí)現(xiàn)了Serializable接口(該接口僅是一個(gè)標(biāo)記接口套媚,不包括任何方法)缚态,對(duì)象的序列化處理就會(huì)非常簡單。當(dāng)序列化的概念被加入到語言中時(shí)堤瘤,許多標(biāo)準(zhǔn)庫類都發(fā)生了改變玫芦,以便能夠使之序列化——其中包括所有原始數(shù)據(jù)類型的包裝器、所有容器類以及許多其他的東西本辐。甚至 Class 對(duì)象也可以被序列化桥帆。
接口和抽象類的區(qū)別
區(qū)別:1接口中的方法都是抽象方法,而抽象類可以有非抽象方法慎皱。
2實(shí)現(xiàn)接口后可以繼續(xù)實(shí)現(xiàn)其他接口老虫,繼承抽象類就不能再繼承其他類
3接口中的屬性都是常量,抽象類的屬性可以有變量
4實(shí)現(xiàn)接口一定要重寫所有的抽象方法茫多,繼承抽象類可以不用全部實(shí)現(xiàn)祈匙,但是該類就會(huì)變成抽象類
相同:兩者都不能直接實(shí)例化。
關(guān)鍵字static ?final ?abstract的用法
static靜態(tài)
1修飾屬性 ??該屬性是靜態(tài)屬性,當(dāng)前的類的所有對(duì)象對(duì)該靜態(tài)屬性都是共享夺欲。靜態(tài)屬性可以直接通過類名.屬性名的形式來訪問跪帝。
2修飾方法 ??該方法是靜態(tài)方法,靜態(tài)方法可以直接類名.靜態(tài)方法名的形式訪問些阅,靜態(tài)方法中不能訪問非靜態(tài)類屬性伞剑。
3修飾類 ???只能修飾內(nèi)部類。
4靜態(tài)塊 ????類的首次加載的時(shí)候就調(diào)用
abstract抽象
1修飾類 : 表示該類是抽象類市埋,抽象類不能直接實(shí)例化黎泣,通常用于被繼承來重寫方法。
2修飾方法:表示該方法是抽象方法腰素,抽象方法沒有方法體聘裁。
多線程
一、實(shí)現(xiàn)方式
1弓千、通過繼承Thread類實(shí)現(xiàn)一個(gè)線程
2衡便、通過實(shí)現(xiàn)Runnable接口實(shí)現(xiàn)一個(gè)線程
繼承擴(kuò)展性不強(qiáng),java總支持單繼承洋访,如果一個(gè)類繼承了thread就不能繼承其他的類了镣陕。
二、怎么啟動(dòng)
Thread thread = new Thread(繼承了thread的對(duì)象/實(shí)現(xiàn)了Runnable的對(duì)象)
thread.setName("設(shè)置一個(gè)線程名稱");
thread.start();
啟動(dòng)線程使用start方法姻政,而啟動(dòng)了以后執(zhí)行的是run方法呆抑。
三、怎么區(qū)分線程汁展?在一個(gè)系統(tǒng)中有很多線程鹊碍,每個(gè)線程都會(huì)打印日志,我想?yún)^(qū)分是那個(gè)線程食绿,打印怎么辦侈咕?
thread.setName("設(shè)置一個(gè)線程名稱");這是一種規(guī)范,在創(chuàng)建線程完成后器紧,都需要設(shè)置名稱耀销。
簡單了解一下線程并發(fā)庫
JDK5中增加了DougLea?的并發(fā)庫,這一引進(jìn)給Java線程的管理和使用提供了強(qiáng)大的便利性。java.util.current包中提供了對(duì)線程優(yōu)化铲汪、管理的各項(xiàng)操作熊尉,使得線程的使用變得的心應(yīng)手。該包提供了線程的運(yùn)行掌腰,線程池的創(chuàng)建狰住,線程生命周期的控制。
線程池的作用?
1齿梁、限定線程的個(gè)數(shù)催植,不會(huì)導(dǎo)致由于線程過多導(dǎo)致系統(tǒng)運(yùn)行緩慢或崩潰。
2、線程池不需要每次都去創(chuàng)建或銷毀查邢,節(jié)約了資源。
3酵幕、線程池不需要每次都去創(chuàng)建扰藕,響應(yīng)時(shí)間更快。
Java通過Executors提供四個(gè)靜態(tài)方法創(chuàng)建四種線程池芳撒,分別為:(還沒接觸過線程池)
newCachedThreadPool創(chuàng)建一個(gè)可緩存線程池邓深,如果線程池長度超過處理需要,可靈活回收空閑線程笔刹,若無可回收芥备,則新建線程。
newFixedThreadPool 創(chuàng)建一個(gè)定長線程池舌菜,可控制線程最大并發(fā)數(shù)萌壳,超出的線程會(huì)在隊(duì)列中等待。
newScheduledThreadPool創(chuàng)建一個(gè)定長線程池日月,支持定時(shí)及周期性任務(wù)執(zhí)行袱瓮。
newSingleThreadExecutor創(chuàng)建一個(gè)單線程化的線程池,它只會(huì)用唯一的工作線程來執(zhí)行任務(wù)爱咬,保證所有任務(wù)按照指定順序(FIFO, LIFO, 優(yōu)先級(jí))執(zhí)行
Servlet方面
1尺借、說一說Servlet的生命周期?
Servlet有良好的生存期的定義,包括加載和實(shí)例化精拟、初始化燎斩、處理請(qǐng)求以及服務(wù)結(jié)束。這個(gè)生存期由javax.servlet.Servlet接口的init,service和destroy方法表達(dá)蜂绎。 Servlet被服務(wù)器實(shí)例化后栅表,容器運(yùn)行其init方法,請(qǐng)求到達(dá)時(shí)運(yùn)行其service方法荡碾,service方法自動(dòng)派遣運(yùn)行與請(qǐng)求對(duì)應(yīng)的doXXX方法(doGet谨读,doPost)等,當(dāng)服務(wù)器決定將實(shí)例銷毀的時(shí)候調(diào)用其destroy方法坛吁。
[if !supportLists]2劳殖、[endif]SERVLET中forward() 與redirect()的區(qū)別?
forward方式:request.getRequestDispatcher("/somePage.jsp").forward(request,response);??redirect方式:response.sendRedirect("/somePage.jsp");
forward:轉(zhuǎn)發(fā)頁面和轉(zhuǎn)發(fā)到的頁面可以共享request里面的數(shù)據(jù).redirect:不能共享數(shù)據(jù).
4拨脉、什么情況下調(diào)用doGet()和doPost()哆姻?
JSP頁面中的form標(biāo)簽里的method屬性為get時(shí)調(diào)用doGet(),為post時(shí)調(diào)用doPost()玫膀;超鏈接跳轉(zhuǎn)頁面時(shí)調(diào)用doGet()
九大內(nèi)置對(duì)象
Out矛缨,request,response,session,application,pageContext,Config,Page,Exception
四大作用域
內(nèi)置對(duì)象作用域:application>session>request>pageContext
JSP中九大內(nèi)置對(duì)象為:
request ? ? ? ? ? ? ?請(qǐng)求對(duì)象 ? ? ? ? ? ? ? ?類型 javax.servlet.ServletRequest ? ? ? ? 作用域 ? ?Request
response ? ? ? ? ? 響應(yīng)對(duì)象 ? ? ? ? ? ? ? ? ? 類型 javax.servlet.SrvletResponse ? ? ? ?作用域 ? ?Page
pageContext ? ? 頁面上下文對(duì)象 ? ? ? ?類型 javax.servlet.jsp.PageContext ? ? ? 作用域??? Page
session ? ? ? ? ? ? 會(huì)話對(duì)象 ? ? ? ? ? ? ? ? ? ?類型 javax.servlet.http.HttpSession?????? 作用域??? Session
application ? ? ? ?應(yīng)用程序?qū)ο?? ? ? ? ? ?類型 javax.servlet.ServletContext ? ? ? ? ? 作用域 ? ?Application
out ? ? ? ? ? ? ? ? ? ? ?輸出對(duì)象 ? ? ? ? ? ? ? ? ? ?類型 javax.servlet.jsp.JspWriter ? ? ? ? ? ? 作用域 ? ?Page
config ? ? ? ? ? ? ? ? 配置對(duì)象 ? ? ? ? ? ? ? ? ? ?類型 javax.servlet.ServletConfig ? ? ? ? ? ?作用域??? Page
page ? ? ? ? ? ? ? ? ? 頁面對(duì)象 ? ? ? ? ? ? ? ? ? ?類型 javax.lang.Object ? ? ? ? ? ? ? ? ? ? ? ? ? ? 作用域??? Page
exception ? ? ? ? ? 例外對(duì)象 ? ? ? ? ? ? ? ? ? ?類型 javax.lang.Throwable ? ? ? ? ? ? ? ? ? ? 作用域 ? page
事務(wù)的四大特性
數(shù)據(jù)庫事務(wù) transanction 正確執(zhí)行的四個(gè)基本要素。ACID,原子性(Atomicity)、一致性(Correspondence)箕昭、隔離
性(Isolation)灵妨、持久性(Durability)。
(1)原子性:整個(gè)事務(wù)中的所有操作落竹,要么全部完成泌霍,要么全部不完成,不可能停滯在中間某個(gè)環(huán)節(jié)述召。事務(wù)在執(zhí)行過程中發(fā)生錯(cuò)誤朱转,會(huì)被回滾(Rollback)到事務(wù)開始前的狀態(tài),就像這個(gè)事務(wù)從來沒有執(zhí)行過一樣积暖。
(2)一致性:在事務(wù)開始之前和事務(wù)結(jié)束以后藤为,數(shù)據(jù)庫的完整性約束沒有被破壞。
(3)隔離性:隔離狀態(tài)執(zhí)行事務(wù)夺刑,使它們好像是系統(tǒng)在給定時(shí)間內(nèi)執(zhí)行的唯一操作缅疟。如果有兩個(gè)事務(wù),運(yùn)行在相同的時(shí)間內(nèi)遍愿,執(zhí)行 相同的功能窿吩,事務(wù)的隔離性將確保每一事務(wù)在系統(tǒng)中認(rèn)為只有該事務(wù)在使用系統(tǒng)。這種屬性有時(shí)稱為串行化错览,為了防止事務(wù)操作間的混淆纫雁, ?必須串行化或序列化請(qǐng) 求,使得在同一時(shí)間僅有一個(gè)請(qǐng)求用于同一數(shù)據(jù)倾哺。
(4)持久性:在事務(wù)完成以后轧邪,該事務(wù)所對(duì)數(shù)據(jù)庫所作的更改便持久的保存在數(shù)據(jù)庫之中,并不會(huì)被回滾羞海。
Spring框架中的三大核心思想是什么
DI(依賴注入),IOC(控制反轉(zhuǎn)),AOP(面向切面編程)