摘要:八種基本數(shù)據(jù)類型數(shù)組定義數(shù)組元素類型數(shù)組名元素類型元素個(gè)數(shù)和數(shù)組長(zhǎng)度元素類型數(shù)組名元素類型元素元素元素元素內(nèi)存的劃分寄存器本地方法區(qū)方法區(qū)棧內(nèi)存存儲(chǔ)局部變量變量所屬作用域一旦結(jié)束變量自動(dòng)釋放方法進(jìn)棧局部變量屬于方法所以方法要先進(jìn)棧堆內(nèi)存存儲(chǔ)
八種基本數(shù)據(jù)類型
byte
short
int
long
boolean
char
float
double
JAVA數(shù)組
定義數(shù)組
元素類型[] 數(shù)組名 = new 元素類型[元素個(gè)數(shù)和數(shù)組長(zhǎng)度];
元素類型[] 數(shù)組名 = new 元素類型[]{元素1, 元素2, 元素3, 元素4};
JAVA內(nèi)存的劃分寄存器
本地方法區(qū)
方法區(qū)
棧內(nèi)存
存儲(chǔ)局部變量, 變量所屬作用域一旦結(jié)束, 變量自動(dòng)釋放
方法進(jìn)棧: 局部變量屬于方法, 所以方法要先進(jìn)棧
堆內(nèi)存
存儲(chǔ)對(duì)象, 凡是new建立的都在堆中
堆內(nèi)存中的對(duì)象都有一個(gè)默認(rèn)值, int:0, double:0.0, float:0.0f, boolean:false, char:"u0000", 引用類型: null
每一個(gè)實(shí)體都有首地址值
局部代碼塊限定局部變量的生命周期, 釋放內(nèi)存空間
面向?qū)ο?/b> 成員變量和局部變量區(qū)別成員變量定義在類中, 整個(gè)類中都可以訪問(wèn).
局部變量定義在函數(shù), 語(yǔ)句, 局部代碼塊中, 只在所屬區(qū)域中有效
成員變量存在堆內(nèi)存的對(duì)象中
局部變量存在棧內(nèi)存的方法中
成員變量隨著對(duì)象的創(chuàng)建而存在, 隨著對(duì)象的消失而消失
局部變量隨著所屬區(qū)域的執(zhí)行而存在, 隨著所屬區(qū)域的結(jié)束而釋放
成員變量有默認(rèn)初始化值
8. 局部變量沒(méi)有默認(rèn)初始化值
成員變量和靜態(tài)變量區(qū)別靜態(tài)變量隨著類的創(chuàng)建而創(chuàng)建, 隨著對(duì)象的回收而釋放
2. 成員變量隨著對(duì)象的創(chuàng)建而創(chuàng)建, 隨著類的消失而消失
靜態(tài)變量可以直接被類調(diào)用
成員變量不可以直接被調(diào)用
靜態(tài)變量存儲(chǔ)在方法區(qū)(共享數(shù)據(jù)區(qū))的靜態(tài)區(qū), 也叫對(duì)象的共有數(shù)據(jù)
6. 成員變量存儲(chǔ)在對(duì)象的堆內(nèi)存中, 也叫對(duì)象的特有數(shù)據(jù)
匿名對(duì)象當(dāng)對(duì)象對(duì)方法僅進(jìn)行一次調(diào)用時(shí), 就可以簡(jiǎn)化為匿名對(duì)象
構(gòu)造函數(shù)構(gòu)建創(chuàng)造對(duì)象時(shí)調(diào)用的函數(shù), 給對(duì)象初始化
this關(guān)鍵字this代表著所在函數(shù)所屬對(duì)象的引用
this也可以用于在構(gòu)造函數(shù)中調(diào)用其他構(gòu)造函數(shù), 但應(yīng)該放在第一行, 初始化動(dòng)作應(yīng)該最先執(zhí)行
static關(guān)鍵字1. static修飾的成員被所有的對(duì)象共享
static優(yōu)先于對(duì)象創(chuàng)建, static和類一起被創(chuàng)建
static修飾的成員可以直接用類名調(diào)用
靜態(tài)變量當(dāng)一個(gè)數(shù)據(jù)在對(duì)象中都是相同的時(shí)候且對(duì)象不做修改只做使用就可以使用靜態(tài)
靜態(tài)函數(shù)當(dāng)函數(shù)不需要訪問(wèn)對(duì)象中的特有數(shù)據(jù)也就是非靜態(tài)成員變量時(shí), 可以用靜態(tài)修飾
靜態(tài)static{ }
隨著類的加載而加載, 而且只執(zhí)行一次, 用于給類初始化
構(gòu)造代碼塊{ }
隨著對(duì)象的加載而加載, 創(chuàng)建幾個(gè)對(duì)象調(diào)用幾次, 給所有對(duì)象初始化
一個(gè)類不想被繼承且實(shí)現(xiàn)定義為abstract, 構(gòu)造函數(shù)設(shè)為私有
單例設(shè)計(jì)模式
解決的問(wèn)題: 保證一個(gè)類在內(nèi)存中的對(duì)象唯一性
不允許其他程序new對(duì)象
在該類中創(chuàng)建一個(gè)本類實(shí)例
對(duì)外提供方法去獲取該對(duì)象
步驟
私有化該類構(gòu)造函數(shù)
通過(guò)new在本類中創(chuàng)建一個(gè)本類對(duì)象
定義一個(gè)公有靜態(tài)方法, 返回對(duì)象
構(gòu)造函數(shù)在子類構(gòu)造對(duì)象的時(shí)候, 父類構(gòu)造函數(shù)也會(huì)執(zhí)行, 子類構(gòu)造函數(shù)默認(rèn)會(huì)有一個(gè)隱式的super()去調(diào)用父類的空參的構(gòu)造函數(shù);
所有子類的構(gòu)造函數(shù)默認(rèn)都會(huì)訪問(wèn)父類的空參構(gòu)造函數(shù)
子類實(shí)例化過(guò)程子類先進(jìn)行默認(rèn)初始化再調(diào)用構(gòu)造函數(shù)
通過(guò)super初始化父類內(nèi)容時(shí), 子類成員變量并未顯示初始化
父類初始化完成
子類成員變量進(jìn)行顯示初始化
調(diào)用子類構(gòu)造代碼塊
執(zhí)行子類構(gòu)造函數(shù)
多態(tài)Base b = new Super() 父類引用指向子類對(duì)象
成員變量:
編譯時(shí)參考父類引用
運(yùn)行時(shí)也參考父類引用
成員函數(shù):
編譯時(shí)參考父類引用
運(yùn)行時(shí)參考子類對(duì)象
靜態(tài)函數(shù)(不需要對(duì)象, 直接使用類調(diào)用, 所以其實(shí)不涉及多態(tài)):
編譯時(shí)參考父類引用
編譯時(shí)參考父類引用
異常
一般不可以處理的 Error
由JVM拋出的嚴(yán)重性的問(wèn)題, 一般不予解決而是直接修改源碼
可以處理的 Exception
編譯時(shí)檢查異常, Exception和其子類, 除RuntimeException
運(yùn)行時(shí)異常, RuntimeException和其子類
自定義異常要么繼承Exception, 要么RuntimeException
throw用來(lái)引發(fā)異常, throws用來(lái)聲明異常
多線程
創(chuàng)建線程方式
繼承Thread類
定義一個(gè)類繼承Thread類
重寫(xiě)Thread類的run方法
實(shí)例化Thread子類
使用start方法開(kāi)啟線程并調(diào)用run方法
實(shí)現(xiàn)Runnable接口
定義一個(gè)類實(shí)現(xiàn)Runnable接口
實(shí)現(xiàn)Runnable接口中的run方法
實(shí)例化Thread類并傳入該類實(shí)例作為構(gòu)造函數(shù)的參數(shù)
使用start方法開(kāi)啟新線程
多線程因?yàn)樘幚頇C(jī)的隨機(jī)分配, 可能會(huì)出現(xiàn)安全問(wèn)題
同步代碼塊
語(yǔ)法
synchorized(對(duì)象){需要同步的代碼塊}
同步好處: 解決線程安全問(wèn)題
同步弊端: 降低效率, 需要判斷一次同步鎖
同步前提: 多個(gè)線程使用同一個(gè)鎖
同步函數(shù)
在函數(shù)前加一個(gè)synchorized修飾符
和同步代碼塊區(qū)別在于需要同步的范圍不同, 想清楚需要同步的范圍之后再?zèng)Q定用同步代碼塊和同步函數(shù)
同步函數(shù)帶的鎖就是調(diào)用該函數(shù)的對(duì)象
多線程間通訊
使用等待喚醒機(jī)制
涉及的方法:
wait(): 線程處于凍結(jié)狀態(tài), 存儲(chǔ)到線程池中
notify():喚醒任意一個(gè)線程池中線程
notifyAll(): 喚醒線程池中所有線程
wait和sleep區(qū)別
wait可以傳入一個(gè)時(shí)間, 釋放執(zhí)行權(quán), 釋放鎖.
sleep必須指定一個(gè)時(shí)間, 釋放執(zhí)行權(quán), 不釋放鎖.
setDaemon設(shè)置為守護(hù)線程, 當(dāng)當(dāng)前運(yùn)行的所有線程為守護(hù)線程時(shí), 虛擬機(jī)退出
join方法, 線程執(zhí)行join方法后會(huì)獲得處理機(jī), 并當(dāng)前線程執(zhí)行結(jié)束后才釋放處理機(jī)
yield方法, 線程會(huì)重新進(jìn)入就緒狀態(tài)
setPriority方法設(shè)置線程的優(yōu)先級(jí) 可傳入MAX_PRIORITY, MIN_PRIORITY, NORM_PRIORITY三個(gè)線程靜態(tài)字段
String String在字符串建立時(shí), 內(nèi)存中有一個(gè)字符串常量池(緩沖區(qū)), 創(chuàng)建字符串時(shí), 在字符串常量池創(chuàng)建, 以后每次先尋找常量池中是否有字符串, 如果有直接指向即可, 不用重新創(chuàng)建字符串
使用new創(chuàng)建字符串時(shí), 在堆中創(chuàng)建一個(gè)String對(duì)象.
StringBuffer長(zhǎng)度可變, 默認(rèn)長(zhǎng)度為16個(gè)字符
可以存儲(chǔ)不同類型數(shù)據(jù)
可以修改字符串
拓展長(zhǎng)度原理
1. 在內(nèi)存中新建一個(gè)StringBuffer, 長(zhǎng)度一般為原來(lái)的兩倍
將原數(shù)據(jù)全部拷貝到新StringBuffer內(nèi)
StringBuilder和StringBuffer類似, 不過(guò)StringBuffer同步, StringBuilder不保證同步
集合框架 List有序, 元素都有索引, 可以重復(fù)
ArrayList內(nèi)部數(shù)據(jù)結(jié)構(gòu)為數(shù)組, 非同步, 新增和刪除效率低, 查找效率高
LinkedList1. 內(nèi)部數(shù)據(jù)結(jié)構(gòu)為鏈表, 新增和刪除效率高, 查找效率低, 非同步
Vector同步, 查找, 新增和刪除效率都低
Set無(wú)序, 元素不允許重復(fù)
HashSet內(nèi)部數(shù)據(jù)結(jié)構(gòu)為Hash表, 非同步
使用元素hashcode方法確定位置, 如果hashcode方法結(jié)果相同, 再通過(guò)equals方法確定是否相同
LinkedHashSet在HashSet基礎(chǔ)上實(shí)現(xiàn)了存取有序
TreeSet內(nèi)部數(shù)據(jù)結(jié)構(gòu)為二叉樹(shù), 使用元素的自然順序?qū)υ剡M(jìn)行排序, 非同步
對(duì)于自定義對(duì)象, 讓元素自身具備比較功能, 應(yīng)該實(shí)現(xiàn)Comparable接口, 覆蓋compareTo方法進(jìn)行排序.
TreeSet排序第二種方法, 讓集合自身具備比較功能, 創(chuàng)建一個(gè)類實(shí)現(xiàn)Comparator接口, 覆蓋compare方法 并將其傳入TreeSet的構(gòu)造函數(shù), 在比較器和自然排序時(shí), 比較器優(yōu)先級(jí)較高
泛型規(guī)定了傳入的參數(shù)類型, 避免轉(zhuǎn)換類型的麻煩, 在編譯時(shí)期檢查
在運(yùn)行時(shí)會(huì)將泛型進(jìn)行擦除, 即class文件中沒(méi)有泛型
當(dāng)方法定義為靜態(tài)時(shí), 不能使用類上定義的泛型, 只能將泛型定義在方法上
泛型限定泛型的上限, extend Obj>泛型能夠傳入Obj本身及其子類
泛型的下限, <?super Obj>泛型能夠傳入Obj本身及其父類
Map集合KeySet方法獲取所有的鍵
entrySet方法獲取所有鍵值對(duì)
HashMap內(nèi)部數(shù)據(jù)結(jié)構(gòu)為Hash表
非同步
允許鍵值對(duì)為null
HashTable內(nèi)部數(shù)據(jù)結(jié)構(gòu)為Hash表
同步
不允許鍵值對(duì)為null
Propertites用來(lái)存儲(chǔ)鍵值對(duì)類型的配置文件, HashTable的子類
TreeMap
內(nèi)部數(shù)據(jù)結(jié)構(gòu)為二叉樹(shù)
非同步
TreeSet實(shí)際上就是使用的TreeMap
I/O流 輸入和輸出外設(shè)-->內(nèi)存: 輸入流
內(nèi)存-->外設(shè): 輸出流
字節(jié)流和字符流字符流: 字節(jié)流先讀取文本數(shù)據(jù), 不直接操作, 而是先查詢指定編碼表
字節(jié)流: 直接讀取文本數(shù)據(jù)
I/O流常用基類
字節(jié)流頂層基類
InputStream
OutputStream
字節(jié)流頂層基類
Reader
Writer
字符流緩沖區(qū)BufferedWriter
BufferReader
Serizalizable接口用于給被序列化的類加入ID號(hào), 可手動(dòng)指定ID號(hào)
被static修飾的變量不會(huì)被序列化, 返回的值是當(dāng)前JVM的值, 而不是被序列化之后的值
transient被其修飾的變量也不會(huì)被Serizalizable序列化
反射 定義在運(yùn)行狀態(tài)中, 對(duì)于任意一個(gè)類都能獲取到該類的屬性和方法
對(duì)于任意一個(gè)對(duì)象實(shí)例, 都能調(diào)用任意一個(gè)方法或?qū)傩?/p> 通過(guò)反射獲取Class對(duì)象
通過(guò)實(shí)例對(duì)象的getClass()獲取Class對(duì)象
Person person = new Person("小米", 20); Class clazz = person.getClass();
通過(guò)類靜態(tài)成員.class獲取對(duì)應(yīng)的Class對(duì)象
Class clazz = Person.class;
Class對(duì)象的forName()通過(guò)類名獲取Class對(duì)象
Class clazz = Class.forName("Person");通過(guò)反射獲取類字段
// 創(chuàng)建Class對(duì)象 Class clazz = Class.forName("Person"); // 創(chuàng)建空參新實(shí)例 Object object = clazz.newInstance(); // 獲取字段 Field field = clazz.getDeclaredField("age"); field.set(object, 20); Object object1 = field.get(object); System.out.println(object1);
通過(guò)以上代碼無(wú)法獲取或設(shè)置類中私有變量, 也不建議直接獲取類中私有變量, 如果想要強(qiáng)行獲取的話看下面代碼
Class clazz = Class.forName("Person"); // 創(chuàng)建空參新實(shí)例 Object object = clazz.newInstance(); // 獲取字段 Field field = clazz.getDeclaredField("age"); // 對(duì)私有字段的訪問(wèn)取消檢查, 不建議使用 field.setAccessible(true); field.set(object, 20); Object object1 = field.get(object); System.out.println(object1);通過(guò)反射獲取類中方法
// 通過(guò)反射獲取class對(duì)象 Class clazz = Class.forName("Person"); // 通過(guò)getMethod方法獲取指定名稱的方法, 第二個(gè)參數(shù)傳遞參數(shù)類型, 參數(shù)為int則傳遞int.class, 其他類似, 空參則傳遞null Method method = clazz.getMethod("paramMethod", String.class, int.class); // 獲取類實(shí)例 Object object = clazz.newInstance(); // 通過(guò)invoke方法調(diào)用方法 method.invoke(object, "九" + 9);四大作用域
pageContext: 生存周期最短, 當(dāng)前頁(yè)面加載結(jié)束即死亡
request:
session: 當(dāng)前瀏覽器關(guān)閉死亡, 當(dāng)?shù)竭_(dá)一個(gè)最大時(shí)間時(shí), 服務(wù)器才刪除session, 并不一定在瀏覽器關(guān)閉時(shí)session立刻死亡 request.getsession()而不是response.getsession()理由: 客戶端發(fā)送請(qǐng)求時(shí), request會(huì)帶上session頭, 服務(wù)器再根據(jù)session頭尋找對(duì)應(yīng)session.
application: 生存周期最長(zhǎng), 服務(wù)器關(guān)閉時(shí)才死亡
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/71167.html
摘要:排序算法和集合工具類排序算法和集合工具類。面試官總是問(wèn)排序算法也不是在難為你,而是在考察你的編程功底。你首先要理解多線程不僅僅是和那么簡(jiǎn)單,整個(gè)并發(fā)包下面的工具都是在為多線程服務(wù)。 去年的這個(gè)時(shí)候樓主通過(guò)兩個(gè)月的復(fù)習(xí)拿到了阿里巴巴的 offer,有一些運(yùn)氣,也有一些心得,借著跳槽季來(lái)臨特此分享出來(lái)。簡(jiǎn)單梳理一下我的復(fù)習(xí)思路,同時(shí)也希望和大家一起交流討論,一起學(xué)習(xí),如果不對(duì)之處歡迎指正一...
摘要:緣起這是語(yǔ)言程序設(shè)計(jì)的,計(jì)劃之前全部整理完。產(chǎn)生隨機(jī)數(shù)的方法。復(fù)習(xí)題雙分支語(yǔ)句復(fù)習(xí)題嵌套的語(yǔ)句和多分支語(yǔ)句復(fù)習(xí)題常見(jiàn)錯(cuò)誤和陷阱常見(jiàn)錯(cuò)誤兩個(gè)浮點(diǎn)數(shù)值的相等測(cè)試復(fù)習(xí)題產(chǎn)生隨機(jī)數(shù)產(chǎn)生一個(gè)到之間的隨機(jī)值,不包括。 緣起 這是《Java語(yǔ)言程序設(shè)計(jì)(10th)》的Part1,計(jì)劃2017-12-31之前全部整理完。 2017-12-23開(kāi)始想看這本書(shū)的,并同時(shí)開(kāi)始實(shí)踐起Java來(lái)的。 Part...
閱讀 1877·2021-11-18 13:20
閱讀 1232·2021-10-11 10:59
閱讀 3055·2021-08-24 10:01
閱讀 3589·2019-08-29 14:21
閱讀 3456·2019-08-29 14:15
閱讀 3600·2019-08-26 12:23
閱讀 3416·2019-08-26 11:46
閱讀 3433·2019-08-26 11:35