JavaSE总结笔记
JavaSE筆記
??快捷鍵集合
1.psvm
public static void main(String[] args) {}2.sout
System.out.println();3.Shift+Ehter 換行
4.Shift+F6 重命名
5.Alt+Shift+Enter 數(shù)據(jù)類型轉(zhuǎn)換
6.IDEA菜單欄Code→Generate→全選 生成構(gòu)造器
??經(jīng)典算法思想
1.冒泡排序
確定迭代次數(shù)是array.length - 1,確定每次迭代將最大值放在最后邊
確定每次比較的次數(shù)array.length - 1 - 此次迭代次數(shù)
優(yōu)化:
如果本身有序,可以設(shè)置flag,每次迭代但凡沒(méi)有發(fā)生交換則都有序
如果某次迭代內(nèi)后方全部有序,可減少區(qū)間長(zhǎng)度
2021年11月11日
1.環(huán)境安裝
1>IntelliJ IDEA 2020.1.3
2>JDK——jdk-8u131-windows-x64
3>Git
2.基礎(chǔ)知識(shí)
1>計(jì)算機(jī)
-
hardware:CPU(只和內(nèi)存聯(lián)系)、內(nèi)存、I/O
-
software:操作系統(tǒng)
2>IDEA
源碼文件HelloWorld.java,經(jīng)過(guò)編譯(compile),生成類文件/字節(jié)碼(byte code)文件HelloWorld.class,這種類文件可以在虛擬機(jī)上執(zhí)行。class并不直接與機(jī)器的操作系統(tǒng)相對(duì)應(yīng),而是經(jīng)過(guò)虛擬機(jī)間接與操作系統(tǒng)交互,由虛擬機(jī)將程序解釋給本地系統(tǒng)執(zhí)行,所以JVM是整個(gè)Java實(shí)現(xiàn)跨平臺(tái)的最核心的部分。JDK中包含了JRE,JRE又包含JVM。
- javac:java源文件、類文件(字節(jié)碼文件)編譯器(compiler)
- JVM(java virtual machine):java虛擬機(jī),運(yùn)行字節(jié)碼的一個(gè)程序
- JDK(java development kit):java開發(fā)工具包,包含JRE、java工具(javac/java/jdb等) 、基礎(chǔ)類庫(kù)(Java API)
- JRE(java runtime environment):java運(yùn)行時(shí)環(huán)境
- Intellij IDEA:一款I(lǐng)DE的產(chǎn)品
3.使用IDEA創(chuàng)建項(xiàng)目的過(guò)程分解
1> 新建工程
經(jīng)由IDEA(程序)指定位置新建目錄、新建配置文件
2> src新建一個(gè)HelloWorld 類
IDEA 指定位置(src目錄)HelloWorld.java,文件中填充了一部分默認(rèn)內(nèi)容
3> IDEA 把代碼寫入 HelloWorld.java文件中
4> 點(diǎn)擊run
- 編譯 IDEA根據(jù)JDK所在目錄,找到j(luò)avac進(jìn)行編譯,HelloWorld.class
- 運(yùn)行 IDEA根據(jù)JRE所在目錄,找到j(luò)ava運(yùn)行類文件
4.類 class
-
類名==java文件名,可以使用Shift+F6 / rename改名稱
-
命名要求:
- 不能以數(shù)字開頭
- 不能含有特殊符號(hào)(字母、數(shù)字以外的符號(hào),下劃線是允許的)
- 不太建議使用中文類型
類名通常為HelloWorld,方法名、變量名通常為helloWorld,包名為hello_world
-
一個(gè)java源文件中只能有一個(gè)public類
-
類中包含方法,方法內(nèi)包含語(yǔ)句
5.數(shù)據(jù) data
全部是內(nèi)存上的數(shù)據(jù)
1>數(shù)據(jù)類型
-
基本數(shù)據(jù)類型**(8類)**
-
數(shù)值類型**(7類)**
- 整型 byte short int long
- 字符型 char,可以認(rèn)為是一種有特殊地位的整型
- 浮點(diǎn)型 float double
-
布爾類型**(1類)**
? boolean,值為 true / false
-
-
引用數(shù)據(jù)類型**(3類)**
- class類型 String s;
- interface類型 Flyable f;
- array類型 int[] t;
字節(jié)數(shù):一字節(jié)=1byte=8位=8bit
| 字節(jié)數(shù)(byte) | 1 | 2 | 4 | 8 | 2 | 4 | 8 | 1 bit |
不分有符號(hào)與無(wú)符號(hào)類型,最高位1代表負(fù)數(shù),0代表正數(shù)。
使用Integer.MIN_VALUE可以獲得int類型可以表示的最小十進(jìn)制數(shù):
int min = Integer.MIN_VALUE;2>變量(本節(jié)重點(diǎn))
👉跳轉(zhuǎn)2021年11月25日
-
變量==內(nèi)存,變量屬于內(nèi)存上的一塊區(qū)域
-
定義
- 變量類型 變量名稱
- 變量類型 變量名稱 = 值
變量名稱表示在內(nèi)存的哪部分,變量數(shù)據(jù)類型決定變量?jī)?nèi)存的區(qū)域大小
-
種類
根據(jù)在代碼中定義的位置,有不同的種類,決定了變量的不同:
作用域(scope)——代碼視角
生命周期(life)——內(nèi)存視角
-
全局變量
-
局部變量(local variable)
變量的作用域(scope)在{ }內(nèi),但對(duì)于{ }外定義的變量在{ }內(nèi)進(jìn)行的賦值是有效的;
局部變量語(yǔ)境下,如果一個(gè)變量只定義,沒(méi)有賦值,無(wú)法直接使用(取其值)。
-
-
使用
- 賦值(出現(xiàn)在=的左邊)
- 取值(出現(xiàn)在=的右邊)
3>基本數(shù)據(jù)類型的一定規(guī)則(類型轉(zhuǎn)換和類型提升)
6.字面量 literal
int a = 9;內(nèi)的9就是字面量
字面量屬于數(shù)據(jù),默認(rèn)類型是int。
| 9 | int |
| 9L / 9l | long |
| 9.f / 9F | float |
| 9. | double |
| true / false | boolean(不允許boolean a =1) |
| ‘a(chǎn)’ | char |
| ‘xx’ | String |
整型字面量有不同的進(jìn)制表示:二進(jìn)制0b10,八進(jìn)制0o10,十六進(jìn)制0x10;或用科學(xué)計(jì)數(shù)法表示1.3e8,即1.3x10^8。
2021年11月14日
1.賦值操作 =
【等號(hào)左邊:以變量為代表的內(nèi)存空間】a = 3【等號(hào)右邊:值,可以是字面量、變量、表達(dá)式】
通過(guò)變量去保存一個(gè)字面量
2.類型轉(zhuǎn)換(type cast)
1>等號(hào)兩邊類型一致
2>類型不一致——類型轉(zhuǎn)換
①類型提升 以參與運(yùn)算的最高類型為主
②數(shù)值類型轉(zhuǎn)換
-
int a=(int)10L
-
轉(zhuǎn)換規(guī)則
char
double > float > long > int > short > byte
- 小賦值大 默認(rèn)成立
- 大賦值小 默認(rèn)不成立
- 數(shù)值類型和Boolean類型、引用類型無(wú)法轉(zhuǎn)換
-
快捷鍵 Alt+Shift+Enter
字面量變量默認(rèn)為int,但仍可以賦值
byte b = 1; short s = 2;這是java基于字面量變量的特殊規(guī)則,byte為-128~127,所以可以賦值[-128,127]的任何數(shù)
int c = 1/3; //int類型除以int類型,此處得0比如 1/3=0.333333,默認(rèn)向下取整為0
final可以修飾數(shù)據(jù)類型,只能被賦值一次
大小寫轉(zhuǎn)換 'y'+'A'-'a' = 'Y'
3.字符串 String
- 不是基本類型,是引用類型
- s+1表示的是字符串拼接操作
- 與基本類型不能相互轉(zhuǎn)換
4.運(yùn)算符
運(yùn)行錯(cuò)誤
- 編譯錯(cuò)誤 不符合語(yǔ)法規(guī)則,IDEA會(huì)提示
- 運(yùn)行時(shí)錯(cuò)誤 程序運(yùn)行期間會(huì)拋出異常,但符合語(yǔ)法規(guī)則
-
a++
int a = 1; System.out.println(a++); //輸出結(jié)果為1,先賦值再加1 -
邏輯運(yùn)算符
- 運(yùn)算都是Boolean類型
- 遵循短路求值,比如或運(yùn)算中,只要有一個(gè)算出來(lái)為false,就不進(jìn)行后來(lái)的運(yùn)算
-
位運(yùn)算
- &
- |
- ~
-
移位操作
- 0b101 >> 1 0b10 可以視為a/2
5.邏輯控制語(yǔ)句
-
順序結(jié)構(gòu)
-
分支結(jié)構(gòu)
- if-elseif-else語(yǔ)句 無(wú)if(a)的條件
- swtich-case-break-default語(yǔ)句
-
循環(huán)結(jié)構(gòu)
break 跳出循環(huán)
continue 跳過(guò)這次循環(huán),開始下次循環(huán)
- while語(yǔ)句
- 右鍵點(diǎn)擊斷點(diǎn),設(shè)置條件,然后點(diǎn)擊運(yùn)行至下一斷點(diǎn)處,可以跳過(guò)一部分循環(huán)
- for語(yǔ)句
- do-while語(yǔ)句
- while語(yǔ)句
作業(yè)
- Java標(biāo)識(shí)符由字母、數(shù)字、下劃線“_”、美元符號(hào)“$”或者人民幣符號(hào)“¥”組成。
首字母不能是數(shù)字,不能是關(guān)鍵字,且對(duì)大小寫敏感。
- 閏年
閏年分為普通閏年和世紀(jì)閏年。
普通閏年:能被4整除但不能被100整除的年份為普通閏年。
世紀(jì)閏年:能被400整除的為世紀(jì)閏年。
2021年11月16日
1.輸出
System.out.println(); //方法調(diào)用system,只能有一個(gè)參數(shù) System.out.print(); //輸出不換行 System.out.printf(); //format格式化輸出,可以有多個(gè)參數(shù),且參數(shù)類型不確定。//不換行,使用與C語(yǔ)言相同//但可以使用%n替換\n,\r是回車2.輸入
- 使用scanner掃描器
| hasNextLine | 行為單位 |
| hasNext | 以空格\t分割的單詞為單位 |
| hasNextInt | 以空格\t分割的單詞為單位,但轉(zhuǎn)為整型 |
| hasNextLong | |
| hasNextDouble |
- hasNext()為true時(shí),nextInt()才可以取值
3.隨機(jī)數(shù)
- Java中的隨機(jī)數(shù)都是偽隨機(jī)數(shù),Random random = new Random(2021);中2021為seed,此時(shí)固定時(shí)生成的隨機(jī)數(shù)不變。
- Random和Scanner都是引用類型。
4.方法 method
1>定義
-
要在類里定義,不能在其他方法里定義
-
public static 返回值類型 方法名稱(形參列表){ 語(yǔ)句 return語(yǔ)句}
此處的參數(shù)列表是形參,形參其實(shí)是一種特殊的局部變量
-
無(wú)返回值可以將返回值類型設(shè)為void,return后的語(yǔ)句不能執(zhí)行也不允許寫
throw new RuntimeException("此處可以寫提示");與return類似,此語(yǔ)句之后也不允許執(zhí)行或?qū)懻Z(yǔ)句
-
方法沒(méi)有調(diào)用,里面的語(yǔ)句永遠(yuǎn)不會(huì)被執(zhí)行,main方法除外
-
同一個(gè)類下,暫時(shí)不允許同名方法
2>調(diào)用
-
方法的調(diào)用實(shí)質(zhì)是值,能出現(xiàn)值的位置,即可進(jìn)行方法的調(diào)用,并且方法可以嵌套調(diào)用
-
變量類型 變量名稱 = 方法名稱(實(shí)參)
-
隱含的賦值操作
- 實(shí)參賦值給形參
- 方法調(diào)用的結(jié)果賦值給返回值
- 返回值賦值給調(diào)用方法的變量
-
在同類調(diào)用時(shí)可以直接寫方法名稱,在其他類調(diào)用寫類.方法名稱
2021年11月18日
1.包 package
- 用來(lái)放類的組織單位,包(文件夾)中含有很多的類(文件)
- 通過(guò)package聲明決定該類屬于哪個(gè)包,類的實(shí)際全名稱為 包名.類名
- 使用某個(gè)包下的類方法
- import 包名.類名;
- import 包名.*;
- 包名.類名.方法
2.git的使用
歷史博客《如何將IDEA文件提交至Gitee倉(cāng)庫(kù)》
3.方法的調(diào)用棧 call stack
-
先進(jìn)后出
-
主要用于表現(xiàn)此刻方法的調(diào)用關(guān)系
-
棧幀(stack frame):每層元素
java中的棧(調(diào)用棧)、棧幀(frame)都是JVM管理的內(nèi)存的某個(gè)名稱
-
內(nèi)存管理
內(nèi)存(硬件)→OS→JVM→棧區(qū)(由棧幀組成:每個(gè)棧幀對(duì)應(yīng)一次方法調(diào)用)
-
局部變量(包含形參)
-
在該變量對(duì)應(yīng)的方法的某次棧幀上(方法的每次被調(diào)用,都有一個(gè)唯一的棧幀,方法執(zhí)行結(jié)束,棧幀結(jié)束)
-
局部變量的生命周期
開始于方法開始執(zhí)行:JVM 為本次方法允許分配好了棧幀
結(jié)束于方法執(zhí)行結(jié)束:JVM 將方法執(zhí)行中用到的棧幀回收 -
無(wú)論是基本數(shù)據(jù)類型還是引用類型,形參的改變不會(huì)影響實(shí)參(java中全部是傳值調(diào)用)
-
-
2021年11月21日
1.方法重載 overload
C語(yǔ)言中一個(gè)編譯單元(一個(gè)C文件)內(nèi)不能出現(xiàn)同名的函數(shù)
Java中允許一個(gè)編譯單元(一個(gè)Java類)中可以出現(xiàn)相同的函數(shù)(方法),但要求參數(shù)列表不同
-
方法的簽名:Java編譯單元中唯一確定方法的標(biāo)識(shí)
-
簽名 = 方法名 + 參數(shù)列表
只要求形參的類型不同,不要求形參的名稱不同
簽名不包括返回值類型,所以返回值類型相不相同沒(méi)有關(guān)系
-
2.靜態(tài)屬性
靜態(tài)屬性、類變量、靜態(tài)變量是除了局部變量之外的另一種變量種類
- 定義位置:類里但在方法外
- public static 數(shù)據(jù)類型 變量名 = 字面量變量;
- static{…}
- 按順序執(zhí)行
- 作用域:在整個(gè)類的內(nèi)部是有效的(大括號(hào)內(nèi))
- 生命周期:伴隨著類在運(yùn)行中的生命周期而運(yùn)行的
- 初始化問(wèn)題:伴隨著類的生命周期,所以它在類加載的過(guò)程中就初始化完成,會(huì)在Main方法使用之前
- 默認(rèn)值是0的變形:0、false、null
- 通過(guò)類名.變量名使用別的類下的靜態(tài)屬性變量
3.類的加載過(guò)程
將屬于一個(gè)類的數(shù)據(jù)(以類文件為代表)從硬盤上加載到內(nèi)存中
-
某個(gè)類被用到的時(shí)候才加載
類被用到(類名.*):
類內(nèi)方法被用到的時(shí)
用到類的main方法時(shí)
用到類的靜態(tài)屬性時(shí)
-
加載的時(shí)候被加載的數(shù)據(jù)
- 靜態(tài)屬性
- 方法→語(yǔ)句→字節(jié)碼指令
-
被加載到方法區(qū)
JVM中存在棧區(qū)和方法區(qū)
4.訪問(wèn)權(quán)限(訪問(wèn)限定符)
-
public:所有人都可以使用
-
protected:同一個(gè)包下的子類可以使用,子包下的子類中也可以使用,不同包下的子類中也可以使用,比包訪問(wèn)權(quán)限要大
-
不寫,即default level(也稱為包訪問(wèn)權(quán)限):同一個(gè)包的子類可以使用,否則就算是在子包下的子類中也不可以使用
-
private:只有自己類的內(nèi)部可以使用
-
可以出現(xiàn)的位置:
- 類的內(nèi)部、用來(lái)修飾 類變量、方法
- 類 不可以用private
5.數(shù)組 Array
1>數(shù)組
-
一組具有相同類型的元素的集合
-
定義 int[] a
-
使用:只能用于初始化
int[] a = {1,2,3,4,5}; //定義一個(gè)變量a,其類型是數(shù)組 //該數(shù)組的元素類型是int //并且進(jìn)行了初始化操作 //該數(shù)組的大小已經(jīng)確定為5 //該數(shù)組的元素分別為1、2、3、4、5Random[] b={new Random(...),new Random(...)};//這種使用是錯(cuò)誤的 int[] a; a[] = {1,2,3,4,5}; //可以使用以下語(yǔ)句 int[] a = new int[] {1,2,3,4,5};//只規(guī)定長(zhǎng)度,則默認(rèn)為0的變形 int[] a = new int[3]; //等價(jià)于 int[] a = new int[] {0,0,0}; -
數(shù)組的長(zhǎng)度一旦確定后就不可以更改了
//這是新創(chuàng)建了一個(gè)數(shù)組,用之前的數(shù)組a來(lái)使用 int[] a = new int[3]; a = new int[5]; -
數(shù)組的下標(biāo) index
- 類型:int
- 范圍:[0,數(shù)組的長(zhǎng)度)
-
遍歷數(shù)組:從前到后訪問(wèn)數(shù)組中的每個(gè)元素
- 需要知道數(shù)組的元素個(gè)數(shù):a.length
2>引用和對(duì)象
- int[] a = {100,200,300};
-
a 引用 ?
-
{100,200,300} 對(duì)象 ?
每個(gè)對(duì)象都有自己的hash值(對(duì)象的指紋),對(duì)象不同,一般指紋不同
-
- 引用類型——形參的改變不會(huì)影響實(shí)參,但是
3>使用中常見(jiàn)的兩個(gè)異常
-
java.lang.ArrayIndexOutOfBoundsException
使用的下標(biāo)不是合法下標(biāo)時(shí)
-
java.lang.NullPointerException
對(duì)一個(gè)值是null的引用做解引用操作時(shí)
int[] a = null; 讓a引用不關(guān)聯(lián)(指向)任何對(duì)象
解引用:通過(guò)引用要去動(dòng)對(duì)象中的數(shù)據(jù),比如a.length、a[0]
4>數(shù)組的操作函數(shù)
| sort(array) | 對(duì)整個(gè)數(shù)組排序 |
| sort(array, int fromIndex, int toIndex) | 對(duì)數(shù)組的[fromIndex,int toIndex)范圍內(nèi)進(jìn)行排序 |
| binarySearch(array,key) | 使用二分查找算法搜索指定數(shù)組的key |
| equals(array1,array2) | 判斷兩個(gè)數(shù)組是否相等 |
| fill(array,element) | 使用element填充數(shù)組 |
| fill(array, int fromIndex, int toIndex,element) | 使用element填充數(shù)組的[fromIndex,int toIndex)范圍 |
| copyOf(array, int newLength) | 復(fù)制數(shù)組到一個(gè)長(zhǎng)度為newLength的數(shù)組中 |
| copyOfRange(array, int fromIndex, int toIndex) | 將指定數(shù)組的指定范圍復(fù)制到新數(shù)組中,fromIndex不可以越界,toIndex可以越界,沒(méi)有的用0補(bǔ)全 |
| toString(array) | 返回指定數(shù)組的內(nèi)容的字符串表示形式 |
2021年11月23日
1.多維數(shù)組
-
定義
long[][] a; 數(shù)組的類型是引用類型long[]
//long[] b; 數(shù)組的類型是long
2.面向?qū)ο?OOP
-
定義
對(duì)象:把一些相關(guān)屬性一一綁定
-
三個(gè)層次
- 概念層 學(xué)生
- 邏輯層 檔案,包括學(xué)生姓名學(xué)號(hào)專業(yè)
- 物理層 在內(nèi)存中是怎么回事
3.類的第二大作用
- 類是構(gòu)造對(duì)象的模板
1>屬性
-
定義
//類的定義 class Person{//屬性的定義String name;int age; } //實(shí)例化對(duì)象的語(yǔ)法 Person p = new Person(要調(diào)用的構(gòu)造方法的參數(shù)列表); //通過(guò)引用使用引用指向?qū)ο蟮膶傩?/span> p.name = ...; ... = p.name; -
作用域:類內(nèi)
-
屬性的初始化規(guī)則(4種)
執(zhí)行順序?yàn)?#xff1a;默認(rèn)值規(guī)則 → 定義時(shí)初始化規(guī)則和構(gòu)造代碼塊規(guī)則按書寫順序 → 構(gòu)造方法規(guī)則
-
默認(rèn)值規(guī)則:不初始化則默認(rèn)為0的變形
-
定義時(shí)初始化規(guī)則
class Person{String name = 'aaa';int age = 18; } -
構(gòu)造代碼塊規(guī)則
{//類內(nèi),方法外//... } -
構(gòu)造方法規(guī)則(構(gòu)造器)
類似于方法,但是:
? 沒(méi)有返回值類型的聲明
? 構(gòu)造方法的名稱==類名
? 構(gòu)造器重載
class Student{//無(wú)其他構(gòu)造方法會(huì)默認(rèn)補(bǔ)此部分,內(nèi)部為空public Student(){//...}//相當(dāng)于方法重載public Student(String a){//...} }
-
2>this
-
作用
-
引用,類型就是當(dāng)前類
指向當(dāng)前對(duì)象:構(gòu)造器種this指向的就是當(dāng)前正在構(gòu)造的對(duì)象
-
在一個(gè)構(gòu)造方法中調(diào)用另一個(gè)方法
public Person(){this(17);//調(diào)用有參構(gòu)造器 } public Person(int a){//... }
-
3>getter & setter
權(quán)限控制:權(quán)限最小原則
只讀不改 getter
2021年11月25日
行為:面向?qū)ο笾械囊粋€(gè)焦點(diǎn),在Java中以實(shí)例方法的形式體現(xiàn)
實(shí)例方法:定義語(yǔ)法和之前一致,除了不要加static;
? 可以直接訪問(wèn)屬性(和構(gòu)造方法類似)
1.方法
1>靜態(tài)方法(類方法) 加static修飾——不可以訪問(wèn)屬性,不可以使用this
2>普通方法(實(shí)例方法) 不加static修飾——可以訪問(wèn)屬性,可以使用this
? 實(shí)例方法的調(diào)用,必須依賴一個(gè)對(duì)象(通過(guò)引用)的存在,如引用.普通方法()
| 方法內(nèi)部 | 有this 可以訪問(wèn)屬性 可以調(diào)用普通方法 | 沒(méi)有this 不能訪問(wèn)對(duì)象的屬性 不能調(diào)用普通方法 |
| 方法外部 | 對(duì)象的引用去調(diào)用 “需要傳入一個(gè)this" | 可以直接調(diào)用 “不需要傳入this" |
在靜態(tài)上下文(static context)中無(wú)法直接調(diào)用普通方法、訪問(wèn)對(duì)象屬性。
static的理解:
**加了static,只和類有關(guān),和對(duì)象無(wú)關(guān)。**反之,不加static,和本來(lái)的對(duì)象息息相關(guān),不論屬性和方法都是屬于對(duì)象的。
變量
| 局部變量 | 跟著方法運(yùn)行走 | 棧幀>棧 |
| 類變量、靜態(tài)變量、靜態(tài)屬性 | 跟著類的加載卸載走 | 類>方法區(qū) |
| 實(shí)例變量、屬性 | 對(duì)象實(shí)例化完成后出現(xiàn),對(duì)象回收后消亡 | 對(duì)象>堆區(qū) |
靜態(tài)方法和普通方法都在方法區(qū)
??OOP
三大特性:封裝(所以要設(shè)置訪問(wèn)權(quán)限)
概念層
現(xiàn)實(shí)生活中,萬(wàn)物皆對(duì)象(比如人物、進(jìn)程等)
邏輯層
- 存在開發(fā)人員腦海中的世界,不止可以用Java實(shí)現(xiàn)
-
實(shí)際是對(duì)現(xiàn)實(shí)中一類有形或無(wú)形的概念的特征(特征表現(xiàn)為屬性)抽取(對(duì)其行為的抽取表現(xiàn)為方法),比如人(人都有四肢、五官)、葉子
- 對(duì)象的正確性判定
對(duì)象職責(zé)不同,方法不同,比如一個(gè)人求職或者學(xué)習(xí),他 學(xué)習(xí)的方法是不同的
- 變成代碼的部分
物理層
對(duì)象在堆區(qū)
對(duì)象在堆區(qū)是如何存放的
對(duì)象是如何構(gòu)建出來(lái)的
Person p = new Person();3 1 2 //大體上有三個(gè)步驟 //1. //通過(guò)類中的信息計(jì)算對(duì)象的內(nèi)存大小(隱含著用到了類) //在內(nèi)存(堆區(qū)域)由JVM分配空間 //全部用0初始化 //半成品對(duì)象構(gòu)建完成 //2執(zhí)行初始化過(guò)程 //對(duì)象實(shí)例化→加載方法→調(diào)用初始化語(yǔ)句 //對(duì)象實(shí)例化完成 //3引用賦值對(duì)象的死亡(不嚴(yán)謹(jǐn)):沒(méi)有任何引用指向它,就可以視為死亡
2021年11月28日
1.深淺拷貝
-
引用賦值 2
-
淺拷貝賦值
-
藕斷絲連似的賦值
-
對(duì)象內(nèi)的引用指向的對(duì)象相同
-
-
深拷貝賦值
2.線性結(jié)構(gòu) List
邏輯層:都屬于線性結(jié)構(gòu)
物理層:分為順序結(jié)構(gòu)和鏈?zhǔn)浇Y(jié)構(gòu),也就是順序表和鏈表
線性結(jié)構(gòu):
-
整體結(jié)構(gòu)一般記為容器
-
裝在容器中的單獨(dú)的數(shù)據(jù),稱為元素、項(xiàng)、數(shù)據(jù)、值
-
除了第一個(gè)元素和最后一個(gè)元素之外,其他元素都有共性,即有前元素和后元素
- 第一個(gè)元素沒(méi)有prev,有next,記為first、head
- 最后一個(gè)元素沒(méi)有next,有prev,記為last、tail
-
只有在線性結(jié)構(gòu)中,下標(biāo)才有意義,才討論第幾個(gè)元素,下標(biāo)是表示第n個(gè)的代碼表示,所以在線性結(jié)構(gòu)中才有排序的含義
-
數(shù)組也算一種比較特殊的線性結(jié)構(gòu),在保存元素時(shí),數(shù)組允許出現(xiàn)空洞,線性結(jié)構(gòu)不允許出現(xiàn)
1>順序表 ArrayList
順序表對(duì)象(在數(shù)組對(duì)象的基礎(chǔ)上構(gòu)建的),多加了自行控制容量的職責(zé)(表現(xiàn)為方法)
下標(biāo)與元素個(gè)數(shù)size有關(guān),與容量array.length無(wú)關(guān)
long[] newarray = Arrays.copyOf(array,newlength);//進(jìn)行擴(kuò)容時(shí)間復(fù)雜度:
- 尾插尾刪 O(1)
- 根據(jù)下標(biāo)插入刪除時(shí) O(n)
- get(index)/set(index,e) O(1)
- 查找 O(n)
2>鏈表 LinkedList
??復(fù)雜度 complexity
- 一個(gè)評(píng)價(jià)程序(算法)好壞的標(biāo)準(zhǔn)
- 從兩個(gè)維度進(jìn)行評(píng)定:
- 運(yùn)行速度——時(shí)間復(fù)雜度
- 占用空間——空間復(fù)雜度
1.時(shí)間復(fù)雜度 **O(1)< O(log(n)) < O(n) < O(n)*O(log(n)) < O(n^2)**前可行< O(n^3) < O(2^n)
直接掐表的缺陷:影響因素太多,無(wú)法控制變量
前提:給定CPU之后,單位時(shí)間內(nèi)執(zhí)行的指令條數(shù)基本恒定
所以,衡量算法的運(yùn)行時(shí)間轉(zhuǎn)換為衡量算法的執(zhí)行指令個(gè)數(shù)
前提:Java中的基本指令(O(1)的語(yǔ)句)可以近似地看作指令的代替
即使固定算法,隨著算法處理的數(shù)據(jù)規(guī)模的不同,算法需要的語(yǔ)句數(shù)也是不同的。比如冒泡排序改變數(shù)字個(gè)數(shù)。
所以:我們希望得到的時(shí)間復(fù)雜度是一個(gè)語(yǔ)句個(gè)數(shù)關(guān)于數(shù)據(jù)規(guī)模的函數(shù)關(guān)系 基本語(yǔ)句個(gè)數(shù) = f(數(shù)據(jù)規(guī)模)
- 只保留函數(shù)關(guān)系中的最高次項(xiàng)
- 把保留的項(xiàng)的常數(shù)系數(shù)變成1
步驟:找最壞的情況(去掉優(yōu)化)、確定數(shù)據(jù)規(guī)模n、確定函數(shù)關(guān)系、大O表示法
時(shí)間戳:從1970-1-1 格靈威治時(shí)間到某個(gè)時(shí)間經(jīng)過(guò)的秒數(shù)
long b = System.currentTimeMillis(); //以毫秒為單位的時(shí)間戳//current 當(dāng)前的Millis毫秒規(guī)模n擴(kuò)大多少倍,消耗的時(shí)間就擴(kuò)大大O內(nèi)的函數(shù)關(guān)系倍
假設(shè)在某臺(tái)計(jì)算機(jī)上,冒泡排序50個(gè)數(shù),耗費(fèi)6秒的時(shí)間,冒泡排序500個(gè)數(shù)需要多長(zhǎng)時(shí)間?
O(n個(gè)2) n的規(guī)模擴(kuò)大了10倍,消耗的時(shí)間10^2 600s
單路遞歸一般是O(n)
二路遞歸(漢諾塔和斐波那契)一般是O(2^n)
數(shù)組的用下標(biāo)訪問(wèn)時(shí)間復(fù)雜度為O(1)
2.空間復(fù)雜度
單路遞歸一般是O(1)
二路遞歸一般是O(n)
2021年11月30日
1.鏈表 LinkedList
結(jié)點(diǎn) node
- 元素
- 下一個(gè)結(jié)點(diǎn)的位置(引用)
通過(guò)頭結(jié)點(diǎn)代表鏈表,即使沒(méi)有頭結(jié)點(diǎn)
等號(hào)左邊一定是引用,等號(hào)右邊一定是對(duì)象
作業(yè):寫一份順序表代碼
2021年12月2日
1.鏈表的特殊情況
- empty鏈表(空鏈表)
- 只有一個(gè)結(jié)點(diǎn)的情況
- 頭結(jié)點(diǎn)、尾結(jié)點(diǎn)
2021年12月7日
1.鏈表操作
- 翻轉(zhuǎn)、刪除、合并、刪除重復(fù)、分割
- 復(fù)雜鏈表復(fù)制
2.鏈表對(duì)象
雙向無(wú)頭不循環(huán)
- 屬性、方法、一致性
- 分情況考慮:
- 空鏈表、有一個(gè)結(jié)點(diǎn)的鏈表、其他情況的鏈表
- 頭結(jié)點(diǎn)、尾結(jié)點(diǎn)、中間結(jié)點(diǎn)
- 重點(diǎn):根據(jù)下標(biāo)輸入、刪除
3.內(nèi)部類
- 靜態(tài)內(nèi)部類——用來(lái)控制權(quán)限
- 普通內(nèi)部類
??static
1.靜態(tài)方法
2.靜態(tài)導(dǎo)包,省略Arrays
import static java.util.Arrays.*;2021年12月9日
1.繼承
概念層的 is - a 關(guān)系
類A(動(dòng)物)→ 類B(貓🐱)
類B繼承類A,類B派生于類A,類B擴(kuò)展于類A
類A:父類(parent class)、基類(base class)、超類
類B:子類(sub class)、派生類(derived class)
class B extends A{//B的方法//IDEA提示的加粗的方法是自己的方法,其他的為繼承的方法。 }-
繼承關(guān)系
- 不同類可以繼承一個(gè)類,但不支持一個(gè)類繼承多個(gè)類(多繼承)
- class A{}隱含著類A繼承自java.lang.Object類
-
邏輯上,子類對(duì)象中包含一個(gè)"父類對(duì)象",無(wú)論有沒(méi)有權(quán)限訪問(wèn)。即類B有類A的全部方法和屬性,只是一些可以訪問(wèn),一些不可以。
-
子類對(duì)象實(shí)例化之前,必須在子類的構(gòu)造方法中,調(diào)用父類的構(gòu)造方法
- 通過(guò)super()調(diào)用
- 通過(guò)super可以明確訪問(wèn)父類,無(wú)歧義時(shí)通過(guò)this也可以訪問(wèn)父類
- super看到的是父類允許子類看到的(有訪問(wèn)權(quán)限的)
- 當(dāng)父類有無(wú)參構(gòu)造方法時(shí),super()可以省略
- 通過(guò)super()調(diào)用
-
子類加載前需要先把父類加載好,不管子類的構(gòu)造器在哪里,都要先加載好父類
-
構(gòu)造代碼塊在實(shí)例化的時(shí)候執(zhí)行的
-
多態(tài):對(duì)象有多種形態(tài),比如動(dòng)物有貓、狗等多種類型
-
方法重寫時(shí),即使是父類中的this.也是new的對(duì)象類型的this對(duì)象
??能使用哪些方法,看引用類型;使用的是哪個(gè)對(duì)象的方法,看new的對(duì)象類型
- 向上轉(zhuǎn)型是自然的,向下轉(zhuǎn)型是有風(fēng)險(xiǎn)的,要進(jìn)行風(fēng)險(xiǎn)測(cè)試if(Pet instanceOf Dog)才能轉(zhuǎn)
2022年01月04日
1.復(fù)習(xí)
-
初始化順序(父類在子類前)
- 類的加載化的初始化順序
- 對(duì)象實(shí)例化的加載順序
-
多態(tài)的語(yǔ)法知識(shí)
2.abstract
1>抽象類
-
抽象類被剝奪了實(shí)例化對(duì)象的能力(比如大的概念動(dòng)物類),是用來(lái)繼承的
可以引用Animal animal;,不能實(shí)例化對(duì)象new Animal();
-
抽象類與普通類的區(qū)別
抽象類不能實(shí)例化對(duì)象,允許出現(xiàn)抽象方法
“有抽象方法的是抽象類”是錯(cuò)誤的
-
Java賦予了抽象類新的能力
允許定義一些方法,但不實(shí)現(xiàn)(沒(méi)有方法體,只是聲明,留給子類去必須重寫,稱為抽象方法)
2>抽象方法
-
抽象類與抽象方法的關(guān)系
抽象方法只能出現(xiàn)在抽象類中,不能出現(xiàn)在普通類中
“凡是抽象類中一定要出現(xiàn)抽象方法”是錯(cuò)誤的
-
例子
比如線性表(抽象)類定義’頭插’方法(其中包含’按照下標(biāo)插入’),鏈表和順序表中’定義按照下標(biāo)插入’方法
3.final
1>最終變量
- 只能賦值一次
2>最終類
- 通過(guò)final修飾的類,無(wú)法被繼承
抽象類、普通類、最終類都允許出現(xiàn)一種方法——最終方法
3>最終方法
- 通過(guò)final修飾的方法,不允許被重寫
- 允許出現(xiàn)在任何類中,出現(xiàn)在最終類中意義不大(因?yàn)樽罱K類無(wú)法被繼承,其中的方法自然不會(huì)被重寫)
4.類的三種職責(zé)
- ①放置靜態(tài)屬性/方法的位置
- ②實(shí)例化對(duì)象
- ③被繼承
| 抽象類 | ③ |
| 普通類 | ②③ |
| 最終類 | ② |
5.接口 Interface
可以理解為一種極端的抽象類(全部只有抽象方法的抽象類),所以不可以被實(shí)例化對(duì)象,它描述的是一個(gè)概念
-
不會(huì)出現(xiàn)屬性(其實(shí)可以出現(xiàn),但是是特定的)
-
只能出現(xiàn)方法(默認(rèn)是抽象方法,并且被public修飾)
-
與抽象類的差異
-
類描述現(xiàn)實(shí)中的一類事物:抽象事物(比如動(dòng)物,線性表)和具體事物(狗、順序表);
接口大多時(shí)候只是一組能力的聚合,描述具備某種能力的東西(比如會(huì)飛,會(huì)跑),具體是什么事物不知道
-
類可以被繼承,只允許單繼承,extends
接口是用來(lái)被實(shí)現(xiàn)的,允許一個(gè)類同時(shí)實(shí)現(xiàn)多個(gè)接口implements,并且接口本身也允許多繼承自其他接口
-
6.Cloneable 接口
具備克隆能力,拷貝的對(duì)象是淺拷貝的
當(dāng)某個(gè)對(duì)象被Cloneable修飾時(shí),JVM內(nèi)部會(huì)對(duì)其特殊處理,允許
SomeClass sc = new SomeClass(); SomeClass copy = clone sc; //對(duì)象復(fù)制(拷貝/克隆)過(guò)程7.對(duì)象的比較(一)
- 同一性 同一個(gè)東西
- 相等性 同類東西,但不是同一個(gè)
- 相似性 同內(nèi)容東西,比如是版本2
Java中沒(méi)有原生提供相似性判斷邏輯的邏輯,但是有相等性判斷的約束
重寫的"equals"是相等性比較(默認(rèn)是同一性比較):在Object中有一個(gè)equals(相等)方法,所有類繼承自O(shè)bject類,所以都有equals方法
"=="是同一性比較:對(duì)于基本類型來(lái)說(shuō)同一性就是相等性,對(duì)于引用類型來(lái)說(shuō)同一性只是同一性
2022年01月06日
1.對(duì)象的比較(二)
1>comparable 接口
p1.compareTo(p2); //重寫compareTo方法// this > obj 返回 >0 // this < obj 返回 <0 // this == obj 返回 ==2>comparator 接口
comparator(p1,p2); //重寫compare方法2.Java中的字符串
String常見(jiàn)方法:
從前往后 indexOf() 4種:目標(biāo)為String或char兩種+給定/不給定form兩種
從后往前 lastIndexOf() 4種
2022年01月09日
1.方法
String s; //判斷是否以括號(hào)內(nèi)字符串為前綴boolean b = s.startsWith("字符串");boolean b = endsWith("字符串"); //判斷是否包含括號(hào)內(nèi)字符串boolean b = s.contains("字符串"); //全部替換,使用一個(gè)字符(串)去替換另一個(gè)字符(串)s.replace('被替換字符', '替換字符');s.replace("被替換字符串", "替換字符串"); //全部替換s.replaceAll("被替換字符串", "替換字符串") //只替換第一個(gè)s.replaceFirst("被替換字符串", "替換字符串") //截取字符串 左閉右開substring(首下標(biāo),[尾下標(biāo)]) //不輸入尾下標(biāo),默認(rèn)為長(zhǎng)度 //以括號(hào)內(nèi)字符分割字符串為數(shù)組類型String[] parts = s.split("\\."); //數(shù)組通過(guò)連接符連接String v = String.join("delimiter連接符",arr) //修剪字符串兩邊的空白字符(包含空格、制表符(Nt)、回車、換行)s.trim()2.字串的不可變特性及其優(yōu)化
1>不可變特性
對(duì)象一旦創(chuàng)建之后,無(wú)法被任何方式修改
成本:每次修改字符串,需要?jiǎng)?chuàng)建對(duì)象
收益:簡(jiǎn)化開發(fā)難度,不會(huì)讓別人更改你給的東西
如何做到:
-
不可被繼承 類被final修飾
-
屬性被final修飾
-
防止內(nèi)部的屬性對(duì)象逃逸
只能保證"指向"不指向其他對(duì)象,但不能保證指向的對(duì)象內(nèi)內(nèi)容不能更改,會(huì)造成屬性逃逸
2>優(yōu)化
JVM使用池化(pooled)技術(shù)進(jìn)行優(yōu)化
邏輯上創(chuàng)建一個(gè)字符串對(duì)象池,這個(gè)對(duì)象池常見(jiàn)的術(shù)語(yǔ)有:哈希池
入池對(duì)象:
-
寫在代碼中的字面量字符串默認(rèn)入池
-
new出來(lái)的對(duì)象默認(rèn)不會(huì)入池
-
通過(guò)s.intern();強(qiáng)制s對(duì)象入池
如果s指向的對(duì)象已經(jīng)在池里,返回池里的對(duì)象
如果不在,則將對(duì)象放入池中
3>結(jié)論
所以只比較對(duì)象的相等性,不去關(guān)心同一性的問(wèn)題
3.StringBuilder 構(gòu)造器
從結(jié)構(gòu)上完全可以把它當(dāng)成一個(gè)關(guān)于字符的順序表。
append(); toString(); //…… reverse(); replace(); substring();StringBuffer是StringBuilder的早期版本,性能極低但是線程安全的(沒(méi)有價(jià)值)。
4.異常
針對(duì)代碼中的非正常情況進(jìn)行處理的
1>異常
優(yōu)點(diǎn):避免層層上報(bào)直到某個(gè)層級(jí)才可以處理該錯(cuò)誤,發(fā)生異常就跳到能處理異常的地方
缺點(diǎn):采用異常機(jī)制會(huì)帶來(lái)性能損失
- 異常情況和正常情況完全分離
- 異常走throw形式
- 正常走return形式
2>關(guān)鍵字
-
try + catch + finally
可以寫try + catch,try + finally,try + catch + finally。
誰(shuí)對(duì)異常負(fù)責(zé),誰(shuí)寫try catch。
執(zhí)行順序:finally一定執(zhí)行
-
throw 拋出異常
throw new 異常類型的對(duì)象(引用)
-
throws 聲明風(fēng)險(xiǎn)
public void 方法(...) throws 異常1,異常2{//......要使用方法就要承擔(dān)風(fēng)險(xiǎn)異常 }這樣就可以使調(diào)用者用catch處理可能會(huì)出現(xiàn)的風(fēng)險(xiǎn),不會(huì)讓它沒(méi)人負(fù)責(zé)
3>異常對(duì)象的構(gòu)造方法
①無(wú)參構(gòu)造方法
②允許傳入String Message
③通過(guò)一個(gè)異常構(gòu)造另一個(gè)異常
飯不夠吃異常 e = ...; 物資不夠異常 exc = new 物資不夠異常(e);由于物資不夠異常,所以導(dǎo)致飯不夠吃異常4>Java程序中輸出內(nèi)容的通道
-
標(biāo)準(zhǔn)輸出:一般用來(lái)輸出非錯(cuò)誤信息
-
標(biāo)準(zhǔn)錯(cuò)誤:一般用來(lái)輸出錯(cuò)誤信息
目的地默認(rèn)情況的情況都是控制臺(tái),只是走兩條路,異常一般走的是緊急通道。都走正常通道先出發(fā)的一定先到達(dá),但走兩條路不一定誰(shuí)先到達(dá)。
5>異常負(fù)責(zé)
由下向上,如果沒(méi)人負(fù)責(zé),由JVM負(fù)責(zé),終止程序
6>編碼規(guī)范
不要吞異常(即catch異常啥也不干),可以把原有的異常作為原因?qū)懺赾atch里
public void method3() throws IOException{//拋受查異常的時(shí)候必須要用throws聲明throw new IOException(); } //問(wèn)題:使用method3方法會(huì)有IOException異常 //解決方法一 聲明 //public void method4() throws IOException{ //解決方法二 catch //實(shí)際中用非受查異常RuntimeException將受查異IOException常包起來(lái) public void method4(){try{method3();}catch(IOException exc){ //解決傳染性問(wèn)題throw new RuntimeException(exc); //會(huì)輸出exc信息,看到原因} }7>異常分類
-
錯(cuò)誤
- 繼承自Error類的就是錯(cuò)誤,也可以算作一種非受查異常
- 因?yàn)樵O(shè)備等其他硬性環(huán)境導(dǎo)致的,程序無(wú)法修復(fù)的問(wèn)題,比如CPU燒了
-
受查異常(檢查異常)
-
繼承自Exception類,但不屬于RuntimeException子類的
-
程序代碼BUG,比如空指針異常,數(shù)組下標(biāo)越界異常
-
使得代碼具備傳染性
使用方法就要么用catch處理要么也聲明異常列表,可以使用非受查異常把受查異常包起來(lái),哪個(gè)類關(guān)心這個(gè)異常的時(shí)候哪個(gè)類處理它
-
-
非受查異常
- 繼承自RuntimeException類的
- 經(jīng)過(guò)重試、程序自動(dòng)修復(fù)解決的問(wèn)題,比如內(nèi)存不夠用,網(wǎng)絡(luò)不穩(wěn)定
我們應(yīng)該catch受查異常,不catch非受查異常,錯(cuò)誤catch了也解決不了。由于實(shí)際的復(fù)雜性,這種規(guī)則一般不太遵守。
Java對(duì)于受查異常,強(qiáng)制要求:
- 一個(gè)方法如果拋出了受查異常,則必須通過(guò)throws聲明
- 一個(gè)方法如果拋出了非受查異常,可以聲明也可以不聲明
8>自定義異常 一般繼承自RuntimeException
2022年01月16日
throws 異常1,異常2{
//…要使用方法就要承擔(dān)風(fēng)險(xiǎn)異常
}
4>Java程序中輸出內(nèi)容的通道
-
標(biāo)準(zhǔn)輸出:一般用來(lái)輸出非錯(cuò)誤信息
-
標(biāo)準(zhǔn)錯(cuò)誤:一般用來(lái)輸出錯(cuò)誤信息
目的地默認(rèn)情況的情況都是控制臺(tái),只是走兩條路,異常一般走的是緊急通道。都走正常通道先出發(fā)的一定先到達(dá),但走兩條路不一定誰(shuí)先到達(dá)。
5>異常負(fù)責(zé)
由下向上,如果沒(méi)人負(fù)責(zé),由JVM負(fù)責(zé),終止程序
6>編碼規(guī)范
不要吞異常(即catch異常啥也不干),可以把原有的異常作為原因?qū)懺赾atch里
public void method3() throws IOException{//拋受查異常的時(shí)候必須要用throws聲明throw new IOException(); } //問(wèn)題:使用method3方法會(huì)有IOException異常 //解決方法一 聲明 //public void method4() throws IOException{ //解決方法二 catch //實(shí)際中用非受查異常RuntimeException將受查異IOException常包起來(lái) public void method4(){try{method3();}catch(IOException exc){ //解決傳染性問(wèn)題throw new RuntimeException(exc); //會(huì)輸出exc信息,看到原因} }7>異常分類
-
錯(cuò)誤
- 繼承自Error類的就是錯(cuò)誤,也可以算作一種非受查異常
- 因?yàn)樵O(shè)備等其他硬性環(huán)境導(dǎo)致的,程序無(wú)法修復(fù)的問(wèn)題,比如CPU燒了
-
受查異常(檢查異常)
-
繼承自Exception類,但不屬于RuntimeException子類的
-
程序代碼BUG,比如空指針異常,數(shù)組下標(biāo)越界異常
-
使得代碼具備傳染性
使用方法就要么用catch處理要么也聲明異常列表,可以使用非受查異常把受查異常包起來(lái),哪個(gè)類關(guān)心這個(gè)異常的時(shí)候哪個(gè)類處理它
-
-
非受查異常
- 繼承自RuntimeException類的
- 經(jīng)過(guò)重試、程序自動(dòng)修復(fù)解決的問(wèn)題,比如內(nèi)存不夠用,網(wǎng)絡(luò)不穩(wěn)定
我們應(yīng)該catch受查異常,不catch非受查異常,錯(cuò)誤catch了也解決不了。由于實(shí)際的復(fù)雜性,這種規(guī)則一般不太遵守。
Java對(duì)于受查異常,強(qiáng)制要求:
- 一個(gè)方法如果拋出了受查異常,則必須通過(guò)throws聲明
- 一個(gè)方法如果拋出了非受查異常,可以聲明也可以不聲明
8>自定義異常 一般繼承自RuntimeException
總結(jié)
以上是生活随笔為你收集整理的JavaSE总结笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何将IDEA文件提交至Gitee仓库
- 下一篇: Java安装加配置