offer Java基礎(chǔ)精選從編譯到集合

?

?

JRE支持.class文件,不能對(duì).java .jsp編譯為class文件
?
標(biāo)識(shí)符 _ $
?
關(guān)鍵字
transient volatile
?
?

char 2個(gè) 字節(jié) 16位
1.4E-14 = 1.4*10^-14
?
八進(jìn)制 0開頭 包括0-7
16進(jìn)制 0x或0X 包括0-9 a-f A-F
整形默認(rèn)是 int
l L
浮點(diǎn)型默認(rèn)是Double
D d
F f
?

字符型可以用 'A' '65' 'a' '97' '\uxxxx'
?
7位標(biāo)準(zhǔn)ASCII碼 128種字符 表示大小寫字母、標(biāo)點(diǎn)符號(hào)、美式英語控制字符
8位擴(kuò)展ASCII碼 256種字符(后128位)表示特殊符號(hào)、外來語言字母
Unicode編碼 支持世界所有字符集
'\uxxxx'
?
?

數(shù)值型 + 字符型 = 字符型轉(zhuǎn)換為數(shù)值型進(jìn)行計(jì)算
數(shù)值型 + 字符串型 = 連接運(yùn)算
字符串 + 數(shù)值型 / 數(shù)值型 = 由于/優(yōu)先級(jí)更加高,先除后字符串連接
變量可用中文表示
科學(xué)計(jì)數(shù)法只能用于浮點(diǎn)型
double d=1.23E5 // d=123000.0 = 1.23*10^5
float f=1.23e5f
?

double 轉(zhuǎn)float會(huì)丟失精度
int long 轉(zhuǎn) float會(huì)丟失精度
long 轉(zhuǎn)double會(huì)丟失精度
浮點(diǎn)型位數(shù)過多輸出會(huì)用科學(xué)計(jì)數(shù)法表示
表示位數(shù)過多時(shí)精度不準(zhǔn)確
?

?

單精度的長(zhǎng)度問題,最后一位的計(jì)算結(jié)果被忽略了
不考慮最后一位
小數(shù)點(diǎn)后最多保留7位
這里是8位了
因?yàn)榫炔粔蛟斐闪藬?shù)據(jù)丟失
需要使用BigDecimal類了
?
局部變量必須初始化才能使用
?
分子分母都是整形 商為整形
13/5=2
分子或分母有一個(gè)是浮點(diǎn)型 商為浮點(diǎn)型Double
13.0/5=2.6
求余數(shù)都有整形 結(jié)果為整形
13%5=3
求余數(shù)有一個(gè)浮點(diǎn)型 結(jié)果為浮點(diǎn)型
1 3.5%5=3.5D
?

前++ 先自增后賦值
后++ 先賦值后自增
'A' > 'B' 為false ?比較的是ASCII
float f=5.0f
long l=5
f==l 結(jié)果為true 只要相等
?
關(guān)于 && 與 ||
a && b:a和b同時(shí)為true 才返回 true, 否則返回false;a || b:a或b任意一個(gè)為true 就返回true , 否則返回false
?
還要運(yùn)算 所以n=4
?

不用運(yùn)算 所以n=3
?

?
boolean?():()
?
運(yùn)算符優(yōu)先級(jí)() ! ++ -- * / % + - >= <= > < == != && & || | = *= += -= %= /=
()最高
=最低
?

?
switch是一個(gè)常量值
char byte short int Character Byte Short Integer String enum
new Scanner(System.in)
scanner.next()
?
?
(int)(Math.random()*10+1)
?

?

?

?

?
一維數(shù)組
int[] array;
int array[];
int[] array;
array = new int[10];
int[] array = new int[10];
int[] array = new int[]{1,2,3,4}
int[] array = new int[]{};
int[] array = {1,2,3,4}
int[] array = {};
array.length
array[array.length-1]
?
增強(qiáng)型for循環(huán)
for(:)
冒泡排序
?

二維數(shù)組
int[][] array
array = new int[3][3]
?
int array[][]
array = new int[3][] 只指定行數(shù)
array[0] = new int[3]
array[1] ?= new int[4]
?
int[] array[]
?
int[][] array = new int[][]{{1,2,3},{1,2}}
int[][] array = new int[][]{{},{},{},{}} 4行
int[][] array = {{1,2},{1,2,3}}
int[][] array = new int[][]{};無列
int[][] array = {};
?
array.length 行數(shù)
array[0].length 第一行的列數(shù)
?
可變參數(shù)不能定義在第一位 一個(gè)方法只能有一個(gè)可變參數(shù)
可以將數(shù)組傳遞給可變參數(shù)
數(shù)組作為參數(shù)不能傳遞可變參數(shù)
?
(int,int...)
(int,int[]) 報(bào)錯(cuò) 不能重載
?
(int,int...)
(int,int)
(1,2)調(diào)用的不是可變參數(shù)
?
scanner.nextInt()
正確處理異常
?

聲明對(duì)象時(shí) ??臻g為null
new時(shí)堆空間開辟了內(nèi)存 棧持有堆空間的地址引用
?
?
沒有指定構(gòu)造方法 系統(tǒng)會(huì)自動(dòng)添加構(gòu)造方法
進(jìn)入構(gòu)造方法名第一行 this實(shí)例對(duì)象產(chǎn)生
?
賦值給本身了
?
?
可以定義與構(gòu)造方法同名的普通方法
?
在本類調(diào)用方法可加this 可不加
構(gòu)造方法可以調(diào)用構(gòu)造方法
this() 要放在構(gòu)造方法第一行
?
?
封裝增加了防御性編程
package包需要放在第一行 只能有一個(gè)
?
報(bào)錯(cuò)
?
加載有指定Cat類的包
*下有Cat類
?
跟順序無關(guān) 還是加載有指定Cat類的包
?
?
只能顯示的加載
?
?
?
?
?
?
定義靜態(tài)成員屬性為斜體
可以用對(duì)象名訪問靜態(tài)成員
但應(yīng)該用類名訪問
靜態(tài)就是靜態(tài)地址 各個(gè)對(duì)象公用同一個(gè)靜態(tài)地址
局部變量不能加static ?只能加final
?
靜態(tài)方法 不能調(diào)用非靜態(tài)的 成員方法 成員屬性不能使用 this不能使用
需要使用就需要實(shí)例化
{} 普通代碼塊 構(gòu)造代碼塊
構(gòu)造代碼塊每次實(shí)例化都會(huì)調(diào)用
static{}靜態(tài)代碼塊只會(huì)調(diào)用一次
?
局部變量在{} 作用域內(nèi)
?
-表示private
+表示public
?
子 類中 this可以訪問父類非private成員
可以繼承靜態(tài)成員
構(gòu)造方法不能被繼承 不能被重寫
不能重寫靜態(tài)方法
?
?
?
super 不能調(diào)用 自己的 private 成語
ClassLoader.loadClass(String name) 加載字節(jié)碼到JVM中 形成一個(gè)Class類
?

?

子類會(huì)默認(rèn)調(diào)用父類的無參構(gòu)造方法
當(dāng)父類定義了構(gòu)造方法 沒有了無參構(gòu)造方法 所以默認(rèn)要提供一個(gè)無參構(gòu)造方法
就要在子類顯示 調(diào)用
?
?
不能并存
?

?

?
Object 類
沒有重寫equals String 比較內(nèi)容是否相同 在桶里比較
equals 就是 ==
toString 打印普通對(duì)象標(biāo)識(shí) String打印字符內(nèi)容
hashCode 普通對(duì)象返回的是對(duì)象標(biāo)識(shí) String返回的是與字符相關(guān)的標(biāo)識(shí) 一般用于放在哪個(gè)桶
?
比較兩個(gè)對(duì)象的屬性是否相等
?

?

?
final + 類 代表 沒有子類
final + 方法 不能被重寫 可被繼承
final + 局部變量 不能被修改
final + 成員基本類型屬性 不能被修改
final + 對(duì)象類型 引用不能被修改 內(nèi)容可修改
不能用在構(gòu)造方法
final 修飾 只能在 定義時(shí) 構(gòu)造代碼塊 構(gòu)造方法靜態(tài)代碼塊 賦值
提高性能
?
?

編譯時(shí)去掉 @Override
?

編譯時(shí)注解 源碼 .class文件都有
@Autowired 運(yùn)行時(shí)注解
元注解 注解的注解
?
餓漢式
?

?

懶漢式 線程不安全
?

可提高性能
?

?
instanceof 運(yùn)算符 只要這個(gè)類兼容這個(gè) 類型 就會(huì)返回true
?
抽象類是JVM來 實(shí)例化的
?
抽象方法不實(shí)現(xiàn)要變成抽象類 含接口
包含抽象方法的類的是抽象類
抽象類 可以沒有抽象方法
static final private 不能與 abstract 并存
?

類外使用對(duì)象名訪問private成員不能訪問
?

?
?
?
接口中的 final 需要在定義的時(shí)候初始化
接口成員屬性 默認(rèn)是 public static final 成員屬性名 = 賦值
?
接口靜態(tài)常量可通過 接口名 或者 接口變量名 調(diào)用
INet.TEMP
inet.TEMP
可以在實(shí)現(xiàn)類中直接通過TEMP調(diào)用
public class ImplementsClass implements INet{
{
System.out.println(TEMP);
}
}
?
可以在實(shí)現(xiàn)類實(shí)例化的時(shí)候通過對(duì)象名.TEMP調(diào)用
ImplementsClass implementsClass;
implementsClass.TEMP;
接口中的靜態(tài)屬性可以被實(shí)現(xiàn)類繼承 因?yàn)檫@跟繼承父類的時(shí)候 調(diào)用方式一樣
?
沒有重寫屬性這一說法
靜態(tài)方法不能被重寫
?
抽象方法只能被重寫
不重寫必須子類定義為抽象類 被繼承下去了
?
接口默認(rèn)方法可以帶方法體 用 default 修飾
接口靜態(tài)方法可以帶方法體
?
默認(rèn)方法可被子類重寫
INet.super.connection(); 調(diào)用接口的默認(rèn)方法
接口中的默認(rèn)方法可以被繼承
?
接口靜態(tài)方法可以使用 接口名.靜態(tài)方法名調(diào)用
INet.stop(); 調(diào)用接口中的靜態(tài)方法 父類也可以
不能通過接口的變量名去調(diào)用靜態(tài)方法 而父類可以
接口不能通過實(shí)現(xiàn)類的對(duì)象名去調(diào)用 而父類通過子類對(duì)象名調(diào)用可以
接口中不能通過在實(shí)現(xiàn)類里面直接用接口中的靜態(tài)方法名調(diào)用 而父類通過在子類里面可以直接通過父類的靜態(tài)方法名去調(diào)用
接口中的靜態(tài)方法 不能被實(shí)現(xiàn)類 和子接口 繼承
?
?
一個(gè)類實(shí)現(xiàn)兩個(gè)接口有默認(rèn)同名的方法
類需要重寫該默認(rèn)同名方法 否則報(bào)錯(cuò)
重寫后調(diào)用的是類重寫的
父類成員方法有和兩個(gè)接口同名的默認(rèn)方法
子類不用重寫調(diào)用 父類的成員方法
調(diào)用的是父類成員方法
如果子類重寫了該方法,那么調(diào)用的是子類的方法
?
子類繼承一個(gè)父類和實(shí)現(xiàn)兩個(gè)接口都定義了同名靜態(tài)成員屬性常量
直接訪問同名靜態(tài)成員屬性常量名會(huì)報(bào)錯(cuò)
而子類只繼承一個(gè)父類的時(shí)候可以直接調(diào)用父類的靜態(tài)成員屬性常量
子類實(shí)現(xiàn)單接口也是可以直接調(diào)用靜態(tài)成員屬性常量
只能在子類重寫同名靜態(tài)成員屬性常量名
父類和兩個(gè)接口的同名靜態(tài)成員屬性常量調(diào)用多種方式就失效了
?
一個(gè)子接口繼承兩個(gè)父接口有同名的默認(rèn)方法
子接口需要重寫同名的默認(rèn)方法 單個(gè)就不用
?
成員內(nèi)部類 普通內(nèi)部類
?

在外部類方法內(nèi)訪問內(nèi)部類
{
new Heart().temp = 12;
}
內(nèi)部類實(shí)例化
?
Person.Heart myHeart = new Person().new Heart();
?
Person lili = new Person();
Person.Heart myHeart2 = lili.new Heart();
?
lili.getHeart();(在getHeart方法里面 return new 內(nèi)部類名();)
?
可以在內(nèi)部直接調(diào)用父類成員(直接用名字)如果出現(xiàn)同名字就訪問內(nèi)部類的
Person.this.age 直接訪問外部類
public class outerClass{
int age;
?
public class innerClass{
public void method(){
System.out.println(age);外部類
}
}
?
public class innerClass{
int age;
public void method(){
System.out.println(age);內(nèi)部類
System.out.println(Person.this.age);外部類
}
}
}
?

?
靜態(tài)內(nèi)部類
?
new Person().eat() 靜態(tài)內(nèi)部類訪問外部類非靜態(tài)成員 必須用實(shí)例化的方式
Person.age 訪問外部類的靜態(tài)成員
靜態(tài)內(nèi)部類訪問靜態(tài)內(nèi)部類的實(shí)例成員不需要靜態(tài)修飾 外部訪問需要
?

?

在外部類方法內(nèi)訪問靜態(tài)內(nèi)部類
{
new Heart().temp = 12;(在外部類方法內(nèi))
}
?
Person.Heart myHeart = new Person.Heart();
Person.Heart myHeart2 = new Person().getHeart(); 在外部類方法 return new Heart();
Person.Heart.say();訪問靜態(tài)內(nèi)部類的靜態(tài)成員方法
?
?
方法內(nèi)部類 局部?jī)?nèi)部類
類不能定義static 不能用訪問修飾符
在外部類的方法里面定義class 關(guān)鍵字
可以使用 abstract final
?

?
public Object getHeart() {
abstract/final class Heart {
public String beat() {
new Person().eat();
return Person.age;
}
}
return new Heart().beat();
}
?
Person lili = new Person();
lili.getHeart(); 只能使用Object里面的方法
?

?
匿名內(nèi)部類
?
不能使用構(gòu)造方法
可以使用構(gòu)造代碼塊
不能使用靜態(tài)成員
匿名內(nèi)部類是在定義里的方法參數(shù)內(nèi)部使用的
需要在外部main方法中調(diào)用這個(gè)方法
jdk7前需要final
jdk8后匿名內(nèi)部類訪問外部局部變量不需要使用final 但在匿名內(nèi)部類內(nèi)部不可改變它
?
peopleTest1.getRead(new Person(){
? ? ? ? ? ?{
? ? ? ? ? ? ? ?// 構(gòu)造代碼塊
? ? ? ? ? ?}
? ? ? ? ? ?@Override
? ? ? ? ? ?public void reat(){
? ? ? ? ? ? ? ?System.out.println("男生喜歡看科幻類書籍");
? ? ? ? ? ?}
? ? ? ?});
?
?
?
?
?
?
?
finally也不能執(zhí)行了
?
finally 中有return 只會(huì)返回finally的
當(dāng) try 或cache中有return
finally中沒有return 遇到return 會(huì)先執(zhí)行完finally里的代碼塊 后執(zhí)行 try cache中的return
?
多個(gè),
?
?
拋出的異常兩個(gè) A I 無法捕獲到 因?yàn)檫@里 拋出的是Exception 需要捕獲為拋出的類的本類 或者父類 不能是兄弟類 子類
?
public int test(){
?
throw new Exception();
}
?
?
?
throw new的類 在throws
只能是throw new的本類父類,不能是兄弟類
不能是子類
Throwable是Exception的父類
?
?
?
?
throws只能是父類或者相同的類型也就是本類
?

?
自定義異常 繼承Exception
在構(gòu)造方法 調(diào)用 super("異常描述")
?

?
在要拋出的異常方法使用 throw new 自定義異常 類
?
捕獲異常使用自定義的異常類
e.getMessage() 拿到自定義異常錯(cuò)誤信息 Exception 以上的父類 方法
?
?
異常鏈
?
public static void main(args){
在main方法調(diào)用異常尾部最后一個(gè)方法
捕獲異常
打印所有異常信息
}
第一個(gè)方法拋出自定義異常
?
被第二個(gè)方法調(diào)用第一個(gè)方法 捕獲到異常
拋出一個(gè)新的異常
throw new Exception("異常信息",e);
?
被第三個(gè)方法調(diào)用第二個(gè)方法捕獲 到異常
拋出一個(gè)新的異常
Exception e1 = new Exception("異常信息");
e1.initCause(e);
throw? e1
?
異常?重寫問題
異常是自定義異常 繼承 Exception
父類的方法 throws 自定義異常
父類?的方法里面是拋出 throw 自定義異常
?
子類重寫
方法 throws 自定義異常 本類
方法 throws 繼承Exception的子類 也就是自定義異常的兄弟類
方法 throws 繼承自定義異常的子類
方法重寫的throws 必須是兄弟類(繼承同一個(gè)父類)或者本類 或者子類 不能是父類
?
?
?

對(duì)象常量池
int t1 = 5;
Integer t2 = t1; 自動(dòng)裝箱 直接通過賦值 -128<=值<=127 隱式調(diào)用了 Integer.valueOf(); 不在這個(gè)范圍 否則就隱式調(diào)用了new
Integer t3 = new Integer(t1); 手動(dòng)裝箱 通過 new 的方式
?
int t4 = t2; 自動(dòng)拆箱 直接通過賦值
int t5 = t2.intValue(); 通過調(diào)用方法完成手動(dòng)拆箱
double t6 = t2.dobuleValue(); 手動(dòng)拆箱為double類型
?
int t1 = 2;
String t2 = Integer.toString(t1); ?整形轉(zhuǎn)換 為String
?
int t3 = Integer.paseInt(t2) 字符串轉(zhuǎn)換為整形
?
int t4 = Integer.valueOf(t2) 字符串轉(zhuǎn)換為包裝類Integer 再自動(dòng)拆箱為 整形
?
-128<=值<=127
?

?

?

indexOf(int)
indexOf(String)
lastIndexOf(int)
lastIndexOf(String)
indexOf(String,int)
getBytes()
?
new String(Byte[],String(字符集))
?

?

?
?

字符串的 equals 比較的是內(nèi)容
= 比較的是引用是否相等
?
字符串每次改變內(nèi)容 都會(huì)創(chuàng)建一個(gè)新的對(duì)象 原對(duì)象不變
String s = ""; 這種方式定義都會(huì)放到常量池上
?
new String(); 定義堆上
每次修改在堆上創(chuàng)建新的字符串對(duì)象
?
StringBuffer 線程安全
StringBuilder 性能高
默認(rèn)字符容量 16
?
StringBuilder 每次在自己堆上改變 具有可變性
?

?

?
append(char)
append(String) 添加字符串
delete(int,int) 刪除字符串
replace(int,int,String) 在指定 位置修改字符串
subString(int,int)
頻繁操作使用StringBuilder 簡(jiǎn)單操作使用String
?
Math.random() 返回[0,1)
Math.random()*10 返回[0,10)
Math.random()*10+1返回[1,11)
int(Math.random()*10+1) 返回整數(shù)
Scanner sc = new Scanner(Systam.in);
sc.netxt();
數(shù)組.length
?
Set表示集
ArrayList數(shù)組序列 長(zhǎng)度動(dòng)態(tài)增長(zhǎng)的數(shù)組
LinkedList鏈表
HashSet哈希集
HashMap哈希表
?

?
list 是可以重復(fù)的有順序的
ArrayList 底層是動(dòng)態(tài)數(shù)組
優(yōu)點(diǎn)
尾部添加 或 刪除數(shù)據(jù) 效率高
適合查找和修改
元素可以為null
初始化容量為10個(gè)元素
add(Object) 添加元素
add(int,Object) 從第 int條 后面添加元素
size() 長(zhǎng)度
get(int) 查詢?cè)?/p>
remove(int)刪除元素
set(int,Object) 從 第int條 替換元素
?
Date 類
new Date() 返回當(dāng)前時(shí)間
?
?
?
?
?
?
開源筆記
可 Pull Requests 協(xié)作寫開源筆記
如果筆記圖片無法訪問 請(qǐng)?jiān)L問 teambition 原版開源筆記
gitee
?https://gitee.com/opendevel/java-for-linux?
github
?https://github.com/OSrcD/java-for-linux?
teambition
?https://tburl.in/0jDNvpbK?
開源視頻
bilibili
?https://space.bilibili.com/77266754?
開源博客
oschina
?https://my.oschina.net/u/4675154?
csdn
?https://blog.csdn.net/OpenDevel?
開源項(xiàng)目
gitee
?https://gitee.com/opendevel?
github
?https://github.com/OSrcD?
開源贊賞
?
