【零基礎(chǔ) 快速學(xué)Java】韓順平 零基礎(chǔ)30天學(xué)會Java

JAVA基礎(chǔ)跟課筆記
JAVA轉(zhuǎn)義字符篇
\t 一個制表位(即一個固定寬度的空格)
1.使用位置:文本處
2.使用效果:
原文本:北京天津上海
修改:北京\t天津\t上海
結(jié)果:北京 天津 上海
3.說明:由于是固定寬度,可以實(shí)現(xiàn)對齊效果
4 補(bǔ)充:可以多次使用\t來加寬(\t\t)
下面類似
\n 換行符
1.注意:不能直接用回車來實(shí)現(xiàn)換行
2.使用位置:文本處
3.使用效果:
原文本:jacksmithmary
修改:jack\nsmith\nmary
結(jié)果:jack
smith
mary
補(bǔ)充:在使用System.out.println("")時,其中l(wèi)n表示輸出后換行,不加ln就不會進(jìn)行換行
\\ 單獨(dú)輸出“ \ "
1.說明:第一個 \ 表示轉(zhuǎn)義命令
第二個 \ 表示要轉(zhuǎn)義的內(nèi)容(即 \ )
2.補(bǔ)充:要輸出兩個 \ 時打: \\\\
其它以此類推
\" 輸出 ”
\' 輸出 ‘
1.說明:由于System.out.println("")自帶一對“
若文本再有“會導(dǎo)致系統(tǒng)無法理解文本范圍而判斷為非法表達(dá)式
\r 表示回車
1.注意:
不同于我們理解的回車(即不是換
行),而是將鼠標(biāo)光標(biāo)回到當(dāng)前行文
本第一個字。這時直接輸入文字會替
換原來文字
2.使用效果:
原文本:韓順平教育北京
修改:韓順平教育\r北京
結(jié)果:北京平教育
3.補(bǔ)充: \r\n可以實(shí)現(xiàn)換行效果
PS:要對文字進(jìn)行如上幾個變換,一般先將所有文本寫完,再來進(jìn)行轉(zhuǎn)義字符的加入
JAVA注釋篇【做一個負(fù)責(zé)的人】
一 為什么要養(yǎng)成寫注釋的習(xí)慣
一曰可以幫助你理清思路,哪怕隔很長時間再回來看,也能快速掌握代碼內(nèi)容與項(xiàng)目目標(biāo)。二曰可以幫助接管你程序的人也能懂你的代碼思路,是一種高情商的表現(xiàn),能防止你被人追殺。
二 三種注釋
單行注釋
1.格式://注釋文字
2.說明:只能在一行內(nèi)實(shí)現(xiàn)注釋,換行就失去注釋功能
多行注釋
1.格式:/* 注釋文字*/
2.說明:可以在注釋范圍內(nèi)任意換行
3.注意:不可以嵌套多行注釋
PS:注釋存在編碼,若注釋有中文要用GBK
注釋不會被JVM執(zhí)行任何命令
文檔注釋
1.說明:注釋內(nèi)容可以被JDK提供的工具javadoc解析,生成一套以網(wǎng)頁文件形式體現(xiàn)的說明文檔
2.基本格式: /**
* javadoc標(biāo)簽1
* javadoc標(biāo)簽2
.......
*/
3.如何生成對應(yīng)的說明文檔:
首先,打開控制臺
其次,輸入javadoc -d 具體文件夾名(包
含路徑) -javadoc標(biāo)簽1 -javadoc標(biāo)簽2 ..... 你所編譯的java文件

最后,回車
4.如何看生成的說明文檔
首先,打開生成的說明文檔所在的文件夾
其次,找到后綴為html的文件
最后,右鍵找打開方式,點(diǎn)瀏覽器即可
5 .常用的javadoc標(biāo)簽

變量篇
一 為何需要變量
放眼你我所處的世界,若嘗試用變量(顧名思義,即能發(fā)生變化的量)的概念去描述這個世界,你便發(fā)現(xiàn)幾乎萬物都脫胎于它。如人的呼吸,晝夜的變化,四季的輪轉(zhuǎn),行星的舞步乃至宇宙的氣息,都能用可“變”的“量”來描述。
程序亦是如此。韓老師言:“一個程序就是一個世界?!笔褂米兞考瓤梢詫?shí)現(xiàn)程序的生命,又可以切實(shí)影響到現(xiàn)實(shí)世界的變量。
變量很抽象,卻又很實(shí)在。
變量是程序的基本組成單位
二 變量的三個基本要素
1.數(shù)據(jù)類型
2.變量名稱
3.變量的值
例如(定義一個變量):
int a = 1
int表示數(shù)據(jù)類型為整型,a表示變量名稱,=表示賦值,1表示變量的值
整體含義即 將1賦值給整型變量a
三 變量是如何體現(xiàn)在計(jì)算機(jī)上的
提要:學(xué)會將變量代碼與計(jì)算機(jī)的工作原理結(jié)合起來,更容易理解與學(xué)習(xí)變量
例如:int a = 1
當(dāng)執(zhí)行時,計(jì)算機(jī)的內(nèi)存部分會分配一定的空間并在其中放置變量的初始值 1 ,之后內(nèi)存會定義一個變量a,并由其作為主體在內(nèi)存中指向該區(qū)域,從而實(shí)現(xiàn)連接變量與值的目的(本質(zhì)上沒有賦值,a還是a,只是將a與該區(qū)域聯(lián)系并統(tǒng)一起來,這樣計(jì)算機(jī)看見a,不僅知道它是變量,而且可以調(diào)動它所連接的區(qū)域內(nèi)的值,對a進(jìn)行替換。這樣運(yùn)算a 其實(shí)對計(jì)算機(jī)來說,即運(yùn)算替換a的數(shù)值。更通俗的來講,就是中學(xué)常用的換元法,幫助簡化式子)
a = 89
當(dāng)執(zhí)行時,計(jì)算機(jī)內(nèi)存會將已經(jīng)與相應(yīng)區(qū)域聯(lián)系好的變量a(說明要先定義一個變量)去改變區(qū)域內(nèi)原本的數(shù)為89
System.out.println(a)
結(jié)合上面理解,計(jì)算機(jī)看見a,就會去找其聯(lián)系的區(qū)域內(nèi)的數(shù)值,最終用數(shù)值替換a,再將替換的輸出到控制臺上
PS:單獨(dú)只有一個變量的輸出不需要“”
誠如韓老師講的變量的概念:變量相當(dāng)與內(nèi)存中一個數(shù)據(jù)存儲空間的表示,你可以把變量看作是一個房間的門牌號,通過門牌號我們就可以找到房間,而通過變量名可以訪問到變量(值)(這里即老師之前說的變量是地址)
補(bǔ)充:int a = 1 其實(shí)是兩個指令
即 定義變量名與數(shù)據(jù)類型:int a
賦值變量:a = 1
四 變量使用的注意事項(xiàng)

說明:
1. 對第三點(diǎn)程序執(zhí)行有順序,可以參考高中數(shù)學(xué)算法一章
2. 對于第四點(diǎn),隱含一個知識: 數(shù)據(jù)類型不可以混用
3 . 對于第五點(diǎn)的作用域,見后面詳細(xì)內(nèi)容。(大致就是在一定的范圍里如在同一個類里,不得有兩個及以上的相同名的變量)
五 JAVA數(shù)據(jù)類型
(一) 分類

說明:byte:字節(jié) 占一個字節(jié)
short:短整型 占兩個字節(jié)
int:整數(shù) 占四個字節(jié)
long:長整型 占八個字節(jié)
float:單精度 占四個字節(jié)
double:雙精度 占八個字節(jié)
通過多個分類,節(jié)省內(nèi)存空間
String是引用數(shù)據(jù)類型,屬于類
(二) 整數(shù)類型
用于儲存整數(shù)

說明:當(dāng)所要儲存的值滿足某些類型的范圍時,不同的類型對相同的值有不同的占用空間。例如:10這個值滿足以上四種類型的范圍,用byte的類型,這個值只占1個字節(jié)。而用long的類型,同樣是10,則要占用8個字節(jié)??梢岳斫鉃橥粋€人在不同面積的房間里
(三) 整型細(xì)節(jié)
1.Java的各個整數(shù)類型都是固定的,在不同操作系統(tǒng)都是一樣的
2.整型常量(即給定的具體值)默認(rèn)為int型。在使用long型時,常量的后面需要加字母L(不分大小寫)
注意:在使用其它類型時,不得在其后加L
否則從long型轉(zhuǎn)到其它較小的類型時可能會存在數(shù)據(jù)的丟失(理解為房間太小,東西太多,不得不丟掉一些東西)
在使用long型時,不加L且數(shù)超過int的范圍也是不可以的。盡管相當(dāng)于把int的數(shù)放在更大空間的long中,但數(shù)值本身超過了默認(rèn)數(shù)值類型int的可儲存范圍,導(dǎo)致數(shù)值無法錄入,沒法錄入,何談轉(zhuǎn)到其它空間?由此推知,不加L且數(shù)未超過int的范圍是可以的。此時就是小房間到大房間的轉(zhuǎn)換了。
但對于其它的short,byte時,就只能在相應(yīng)范圍類輸入值了
原因:計(jì)算機(jī)會先判斷數(shù)是否在它們各自的范圍內(nèi),如果是就可以。如果不能先判斷數(shù)的范圍(比如賦值一個變量),此時計(jì)算機(jī)會判斷類型的大小,大轉(zhuǎn)小不行,小轉(zhuǎn)大可以,注意這里只看類型,而不看數(shù)的大小(詳見下文的自動類型轉(zhuǎn)換)
例如:
(1)byte a = 10; 編譯成功
(2)int b = 1;
byte c = b ; 編譯失敗
3.整型使用時,一般遵循使用較小空間的整數(shù)類型的原則(節(jié)省空間原則)
4.bit是計(jì)算機(jī)中最小的存儲單位。
1 byte = 8 bit
bit存放 0 1 ,是用來二進(jìn)制的
由此可以用來解釋上文為什么相同值在不同類型所占的空間不同。
例如給定一個整型常量3
在byte中表現(xiàn)為00000011
在short中表現(xiàn)為0000000000000011
在二進(jìn)制的算法上,兩者都表示數(shù)值3,但顯然,在形式上,上面的更簡練。
(四) 浮點(diǎn)數(shù)類型
用于存儲小數(shù)

說明:浮點(diǎn)數(shù)在計(jì)算機(jī)中存放形式為:浮點(diǎn)數(shù)=符號位 + 指數(shù)位 + 尾數(shù)位(這些位可以理解為上面說的bit,都是計(jì)算機(jī)通過二進(jìn)制來還原小數(shù)的一種方式,利用這幾個位,實(shí)現(xiàn)還原)其中尾數(shù)位容易丟失數(shù)據(jù),造成精度的損失,故而稱小數(shù)都是近似值。)
(五)浮點(diǎn)數(shù)細(xì)節(jié)
1.Java的各個浮點(diǎn)數(shù)類型都是固定的,在不同操作系統(tǒng)都是一樣的
2.浮點(diǎn)數(shù)常量默認(rèn)為double型。在使用float型時,常量的后面需要加字母F(不分大小寫) 其原因同講整數(shù)細(xì)節(jié)時一樣
3.兩種表示形式:
(1)十進(jìn)制數(shù)形式:5.12 0.23 等常規(guī)形式以及個位為0時另一種表現(xiàn)形式 .154
(2)科學(xué)計(jì)數(shù)法:5.12e2[即5.12*10^2](e不區(qū)分大小寫)但由于是浮點(diǎn)類型,最終答案為512.0而不是512
4.通常,應(yīng)使用double型,其精度更高(高精度原則)
在輸出時,float型會出現(xiàn)小數(shù)不能完全保留情況,且只是粗暴地刪去而非四舍五入。
例如: 在float型儲存一個2.1234567851,結(jié)果在輸出時,只有2.1234567
5.浮點(diǎn)數(shù)使用陷阱
不要對運(yùn)算結(jié)果(不是賦值的)是小數(shù)的進(jìn)行比較
原因:計(jì)算機(jī)運(yùn)算不同于人,在進(jìn)行8.1/3時,對人來講,8.1就是8.1。而對計(jì)算機(jī)來講,由于8.1是小數(shù),則會將其理解為浮點(diǎn)數(shù)并帶上精度。由于帶上了精度,在計(jì)算機(jī)上可能會表現(xiàn)為8.100001...則在計(jì)算時,會計(jì)算出2.6999999997這樣違反常識的值。故在比較2.7與8.1/3時,計(jì)算機(jī)不能給出“相等”的答案
非要比較,那怎樣避免?
答:利用相比較的兩數(shù)差值,根據(jù)差值的大小來判斷
代碼如下:

對math.abs()的補(bǔ)充:
這里涉及JAVA API文檔
API(應(yīng)用程序編程接口)其實(shí)是JAVA設(shè)計(jì)者給程序員提供的編程上的 類(用于描述編程對象信息的模子,就好比是B站登錄時,手機(jī)號欄與密碼欄,而對象信息就是你登錄的手機(jī)號與密碼)與 方法(顧名思義,是用于解決問題的,而要解決這些問題,在程序中是通過一組代碼語句來實(shí)現(xiàn)的。故方法是語句的集合,讓它們一起執(zhí)行一個功能)
API文檔用于告訴開發(fā)者如何使用這些類,以及這些類里包含的方法
這里可以查詢到API文檔:
https://www.matools.com
如何查找到自己想用的類與方法?
首先應(yīng)當(dāng)了解API文檔里是怎樣組織的

之后由此圖來查找
例如:查找ArrayList有哪些方法
法一
第一步:明白了該類在哪個包里(在java.util)
第二步:進(jìn)入API文檔,在左欄上部找到該包

第三步:找到并點(diǎn)擊后,看左欄下部找到“類”
找到所要的類,并點(diǎn)擊

第四步:右邊出現(xiàn)信息,查找“方法”并瀏覽即可

法二(不知道類在哪個包的)
第一步:點(diǎn)工具欄“顯示”

第二步:在“索引”中查找即可

(六) 字符類型char
用于存儲單個字符(多個字符用字符串String)
字符包括:字母,漢字,數(shù)字,轉(zhuǎn)義字符
注意:字符類型可以直接存放一個數(shù)字,故可以寫:char c = 97; 沒有使用英文單引號而其它的必須使用英文單引號。
本質(zhì)上字符,在計(jì)算機(jī)中都會轉(zhuǎn)換成數(shù)字代號,即編碼,且這個編碼都是整數(shù)

由于未加單引號,97在計(jì)算機(jī)中,會被理解為編碼,那么接下來,計(jì)算機(jī)會通過unicode編碼表碼(一個將所有字符用數(shù)字編號的表)轉(zhuǎn)換成所對應(yīng)的字符。在unicode碼中,97對應(yīng)的字符是字母a,故最終輸出其實(shí)為 a。若想輸出數(shù)字本身,則需要加單引號’且為一個數(shù)字

unicode碼查詢:
https://tool.chinaz.com/Tools/Unicode.aspx
(七)字符型細(xì)節(jié)

說明:
(1)用“”的其實(shí)為字符串類型,這里使用會出現(xiàn)不兼容問題
(2)轉(zhuǎn)義字符合起來算作一個字符
(3)對第3點(diǎn),通過加上(int)實(shí)現(xiàn)將字符轉(zhuǎn)換成對應(yīng)的數(shù)字
char c = 'a';
System.out.println((int)c);
最終輸出的是97,而非a
(4)對第5點(diǎn),例子如下
System.out.println('a' + 10);
輸出107(這里說明加上單引號就表示為char類了。而整體未加“”說明不是字符串,是可以進(jìn)行計(jì)算的數(shù)字或變量)
或者
char c = 'a';
System.out.println(c + 10);
輸出107(基本的變量運(yùn)算)
或者
char c = 'a' + 1;
System.out.println(c);
輸出字符 b(不同于上面兩個的原因,是因?yàn)檫@里的運(yùn)算是在變量本身進(jìn)行的,而變量本身是char類,運(yùn)算后的數(shù)字將會轉(zhuǎn)換為相應(yīng)的字符)
(八) 常用編碼
除了上文的unicode碼,還有許多其它編碼

1.ASCII碼:歷史上最早的編碼。由美國制定的,實(shí)現(xiàn)了將英語字符用數(shù)字編號的功能(數(shù)字可以轉(zhuǎn)換為二進(jìn)制形式,故又可以稱二進(jìn)制位)。該碼用一個字節(jié)表示,一共編碼了128個字符(實(shí)際上一個字節(jié)可以表示256個字符)
2.Unicode碼:該碼用兩個字節(jié)表示,實(shí)現(xiàn)了字母與漢字的編碼統(tǒng)一(但缺點(diǎn)就是容易浪費(fèi)空間)。該碼是第二個編碼,是適應(yīng)中國用戶而編創(chuàng)的,可以認(rèn)為它是ASCII碼的拓展。實(shí)際上,該碼將世界上所有常用符號都納入其中了。因此,使用該碼一般不會出現(xiàn)亂碼
3.utf-8碼:該碼其實(shí)是Unicode碼的改進(jìn),字母由于數(shù)量少,字節(jié)數(shù)要求少,故字母使用1個字節(jié)。而漢字?jǐn)?shù)量多,字節(jié)數(shù)要求多,故漢字使用3個字節(jié)(表示更多的漢字)。從而節(jié)約了內(nèi)存空間。
4.gbk碼:該碼可謂是為漢字而生,在utf-8碼的基礎(chǔ)上,再次壓縮,漢字僅占兩個字節(jié),且范圍更加廣泛(但兩個字節(jié)并沒有完全囊括所有漢字)
5.gb2312碼:也是為漢字而生,但表示的漢字比較少,較為少用
6.big5碼:該碼實(shí)現(xiàn)了對繁體漢字編碼,方便了港澳臺地區(qū)的使用(但只支持繁體字的存儲)
(九) 布爾類型
只能用于存儲 真[true] 與 假[false]

六 基本數(shù)據(jù)類型轉(zhuǎn)換
(一) 自動類型轉(zhuǎn)換

例如:
int a = ' c ' ;
該語句中,變量a被定義為整型int,但賦值了一個字符型char。由于自動類型轉(zhuǎn)換機(jī)制的存在,字符型 c字母根據(jù)編碼表轉(zhuǎn)換為了整型,故編譯時沒有報(bào)錯
PS:轉(zhuǎn)換可以跨越,不一定要相鄰轉(zhuǎn)換
例如:
double d = 80
變量d是雙精度,賦的值80是整型。由于符合精度大小排序,盡管之間間隔了long型,float型,但仍一步到位,在計(jì)算機(jī)中變量d的存儲其實(shí)為80.0
(二) 自動類型轉(zhuǎn)換注意與細(xì)節(jié)

說明:
1.第一點(diǎn)與第六點(diǎn)本質(zhì)相同,可以合在一起講。其中這里容量最大的類型不光要看定義變量時的數(shù)據(jù)類型,還要看數(shù)值在默認(rèn)狀態(tài)下的數(shù)據(jù)類型。例如1.1數(shù)值出現(xiàn)時,默認(rèn)為double類型,10數(shù)值出現(xiàn)時,默認(rèn)為int
2.在進(jìn)行計(jì)算時,一定要牢記自動類型轉(zhuǎn)換的變換鏈,不得出現(xiàn)大轉(zhuǎn)小情況
例如: float a = 10 + 1.1 該表達(dá)式錯誤的原因是因?yàn)樽兞縜是單精度類型,而10 + 1.1根據(jù)第一點(diǎn)與第六點(diǎn),這里的運(yùn)算結(jié)果是雙精度double類型,根據(jù)這條賦值語句,出現(xiàn)了大類型轉(zhuǎn)小類型的情況,故表達(dá)式錯誤
改: double a = 10 + 1.1 或 float a = 10 + 1.1F
3.對三四點(diǎn),可以類比上面講的內(nèi)容
(三) 強(qiáng)制類型轉(zhuǎn)換
用于逆自動類型轉(zhuǎn)換,往往是大轉(zhuǎn)小
注意:強(qiáng)制轉(zhuǎn)換,是可能造成數(shù)據(jù)部分丟失,其類型往往表現(xiàn)為精度缺失與數(shù)據(jù)溢出
強(qiáng)制轉(zhuǎn)換的方法:在要強(qiáng)制轉(zhuǎn)換的數(shù)值或變量前加 (數(shù)據(jù)類型)
例如: int a = (int)1.9;
或: int b = 100;
byte c = (byte) b;
(四) 強(qiáng)制數(shù)據(jù)類型轉(zhuǎn)換的細(xì)節(jié)說明

說明:
1.對第二點(diǎn)可以理解為就近原則與整體思想。就近原則即強(qiáng)制轉(zhuǎn)換的數(shù)值是與強(qiáng)轉(zhuǎn)代碼最近的那一個。
例如: int a = (int)10 + 1.1 該式子報(bào)錯的原因是因?yàn)榫徒瓌t,強(qiáng)制轉(zhuǎn)換的是10而不是10 + 1.1 ,而10 + 1.1的結(jié)果是double類型,出現(xiàn)了大轉(zhuǎn)小的情況。整體思想是指的強(qiáng)轉(zhuǎn)代碼最近的哪一個可以使用()來整體化,從而實(shí)現(xiàn)整體的強(qiáng)轉(zhuǎn)。由此上面的式子可以改為int a = (int)(10 + 1.1)
(五) 基本數(shù)據(jù)類型轉(zhuǎn)字符串String
語法:在基本類型的值或變量后加上 + “”即可
例如: int a = 100;
String b = a + "" ;
PS:1.敲擊空格鍵來輸出 空 也是一種字符
2.字符串使用雙引號
(六) String類型轉(zhuǎn)基本類型
語法:
通過在 基本類型包裝類 里調(diào)用一個叫parseXX的方法 的語句
類型:
1.轉(zhuǎn)整型:Integer.parseInt("字符串")
2.轉(zhuǎn)雙精度:Double.parseDouble("")
3.轉(zhuǎn)單精度:Float.parseFloat("")
4.轉(zhuǎn)短整型:Short.parseShort("")
5.轉(zhuǎn)長整型:Long.parseLong("")
6.轉(zhuǎn)布爾型:Boolean.parseBoolean("")
7.轉(zhuǎn)字節(jié)型:Byte.parseByte("")
8.轉(zhuǎn)字符型:“字符串”.charAt(數(shù)字N)
注意:字符串轉(zhuǎn)字符其實(shí)只取字符串的第N+1個字符
(七) 有關(guān)String類型轉(zhuǎn)換的細(xì)節(jié)

運(yùn)算符篇
一 什么是運(yùn)算符
運(yùn)算符是一種特殊的符號,可以用于數(shù)據(jù)的運(yùn)算、賦值、比較等
二 運(yùn)算符類型

(一) 算術(shù)運(yùn)算符
定義:用于運(yùn)算數(shù)值的符號
類型:

說明:
1.加號與減號在不同含義中有不同的語法,要注意區(qū)別
2.在計(jì)算時,仍然要滿足上文講的自動類型轉(zhuǎn)換原則。例如在計(jì)算 10 / 4時,由于最高精度是int,故計(jì)算結(jié)果用int表示,故答案是2而不是2.5。要想得到2.5,則需要在計(jì)算時用上double類型的數(shù)值
3.模%的使用運(yùn)用了數(shù)學(xué)上取余數(shù)的公式
a % b = a - [a/b] * b
[]表示取整,且a/b中a若是小數(shù),則會強(qiáng)轉(zhuǎn)為int型
4.++與-- 是在原來的數(shù)上加或減1。
如果只是單獨(dú)的++或--,那放前放后,結(jié)果都是一樣的
例如: int a = 10; int a = 10;
a ++ ; //結(jié)果為11 ++ a ; //結(jié)果為11
如果是用于表達(dá)式,則在前是先自增后運(yùn)行其它(賦值,比較等),在后則是先運(yùn)行其它再自增
例如: int b = 8;
int c = ++b //等價于 b=b+1;c=b;
int d = b++ //等價于 d=b;b=b+1;
補(bǔ)充:運(yùn)算中的疑難問題
(1) int i = 1
i = i++
計(jì)算機(jī)對此的處理順序?yàn)椋?/p>
第一步:將變量 i 賦值給計(jì)算機(jī)給的臨時變量temp,即temp = i
第二步:i 進(jìn)行自加,即 i = i + 1
第三步:將temp變量賦給變量 i = temp
故結(jié)果仍然為 1 (自加了個寂寞)
(2) int i = 1
i = ++i
計(jì)算機(jī)對此的處理順序?yàn)椋?/p>
第一步:i 進(jìn)行自加
第二步:將變量 i 賦值給臨時變量 temp
第三步:將temp 賦值回 i
故結(jié)果為 2
(3) 設(shè)計(jì)程序三部曲:
序章:了明目標(biāo)需求
主奏:根據(jù)需求找思路(怎么定變量,用什么代碼,用什么公式)
尾聲:寫代碼,跑代碼
(二)關(guān)系運(yùn)算符
比較數(shù)值,輸出boolean型。由于其特性,往往用于if結(jié)構(gòu)的條件中或循環(huán)結(jié)構(gòu)的條件中
類型:

說明:
1.一個 = 表示賦值。只有兩個 = 時才表示相等
2.instanceof將會在后面講類時會具體說明
3.字符串的比較不可用 == ,而是用【要判斷的字符串】.equals("要比較的字符串 ")
或者,將兩者調(diào)換位置【要比較的字符串】.equals("要判斷的字符串 ")。其中后者可以避免要判斷的字符串為空而報(bào)錯
(三) 邏輯運(yùn)算符
用于連接多個條件(即多個關(guān)系表達(dá)式),和關(guān)系運(yùn)算符一樣,運(yùn)算結(jié)果仍為boolean值
類型:

說明:
- a和b是兩個可含變量的條件語句
- &或&&可以理解為是否全為真(即高中的∩);|或||可以理解為是否有真(即高中的∪);!可以理解為高中的非;^可以理解為是否不同,如果相同則取反
- 相關(guān)名稱:&……邏輯與
|……邏輯或
^……邏輯異或
&&……短路與
||……短路或
!……取反
4.短路與邏輯的區(qū)別:短路不同于平常理解的短路,而是字面意思上的“短”。計(jì)算機(jī)在執(zhí)行時,若在判斷第一個條件時就已經(jīng)能夠得出最終結(jié)果時,就會直接跳過第二個條件的判斷,從而實(shí)現(xiàn)縮短執(zhí)行,使得代碼運(yùn)行更快。而邏輯的則是兩個都要進(jìn)行判斷,相對來說代碼運(yùn)行較慢。當(dāng)然,當(dāng)?shù)谝粋€不能得出結(jié)果,則仍然要判斷第二個
例如:

由于使用了短路與,在第一個條件不成立時就已經(jīng)可以得到false的的答案,故不再執(zhí)行對第二變量的判斷與運(yùn)算。故結(jié)果為:不輸出ok300,其中a=4,b仍然為9
(四) 賦值運(yùn)算符
用于將數(shù)值(包括運(yùn)算后的)賦給指定變量
類型與含義:

細(xì)節(jié)與特點(diǎn):

說明:對第四點(diǎn),對b += 2 若是理解為b = b + 2時,則會由于b是byte類型,而b + 2 的結(jié)果是int類型而報(bào)錯。然而并非如此,計(jì)算機(jī)對此的真正理解為 b = (byte) (b + 2),故不會報(bào)錯。同理b ++也有如此轉(zhuǎn)化
(五) 三元運(yùn)算符
可以理解為簡化的if語句
語法:條件表達(dá)式 ?表達(dá)式1 :表達(dá)式2;
說明:當(dāng)條件表達(dá)式為true,則執(zhí)行表達(dá)式1,反之執(zhí)行表達(dá)式2。由于往往涉及變量,則需要充分掌握變量中的易錯點(diǎn)(數(shù)據(jù)的轉(zhuǎn)化,數(shù)據(jù)類型等)。三元運(yùn)算符一般要配合其它語句一起使用。在理解語句時,往往先判斷,再把判斷出的表達(dá)式保留,其它的忽略,重新組合出一個整體的表達(dá)式
例如: int a = 10;
int b = 5;
int c = a > b ? a : b ;
在理解時,發(fā)現(xiàn)a>b成立,則只看表達(dá)式1,忽略其它,則重新組合的為 int c = a;
補(bǔ)充:
1.運(yùn)算符優(yōu)先級

說明:
(1)上一行運(yùn)算符總先于下一行,大致概括為

(2)單目運(yùn)算是對一個數(shù)或一個變量進(jìn)行運(yùn)算,例如++ 。而賦值運(yùn)算即表中最后一類
(3) 逗號的使用:例如int a = 1 , b = 2 ;實(shí)現(xiàn)了前后化整體的作用
(4)>> << >>>是位移運(yùn)算符(也稱移位運(yùn)算符)會在之后 位運(yùn)算符 章節(jié)講解
2.標(biāo)識符的規(guī)則與規(guī)范
(1)概念:即對各種變量、方法和類等命名時用的字符序列。例如 int a = 10 中 a 就是標(biāo)識符,對變量命名
(2)規(guī)則(必須遵守):

說明:所謂關(guān)鍵字,其實(shí)就是java中已經(jīng)存在的代碼名稱,具有特殊用途的字符串,比如class、public等。而保留字是java中將會加入的代碼名稱。而“包含”其實(shí)就是在一串字符中可以出現(xiàn)這些詞

(3)規(guī)范(更加專業(yè)):

3.鍵盤輸入語句
介紹:要實(shí)現(xiàn)計(jì)算機(jī)接收用戶的輸入信息,則需要使用鍵盤輸入語句
語法步驟:
在鍵盤輸入語句中需要一個掃描器(Scanner)及其包含的功能代碼。由于一般情況下,編程的代碼中并沒有一開始就加載上掃描器。這就需要我們?nèi)藶榧虞d。加載的原則是從包開始,再到類,最后到其它(如方法等)。而Scanner是一個類,它包含在一個包里,故我們要按照這個順序來一步步讓計(jì)算機(jī)找到這個類,從而實(shí)現(xiàn)加載(路徑的找法見上文java API文檔)。只有我們加載好類后,才可以調(diào)用該類里包含的方法,從而實(shí)現(xiàn)我們想要的功能
綜上,步驟如下:
第一步:導(dǎo)入包含Scanner的包
import java.util.Scanner;
第二步:創(chuàng)建該類的對象(即聲明變量)
??Scanner 變量 = new Scanner(System.in);
其中new就表示創(chuàng)建的意思
第三步:調(diào)用Scanner里的功能
??String name = myscanner.next();
接收輸入的字符串
??int name = myscanner.nextInt();
接收輸入的int
………
4.四種進(jìn)制
(1)類型與表示方式

例如:
二進(jìn)制……0b1010
八進(jìn)制……01234567
十進(jìn)制……123456789(輸出時的默認(rèn)進(jìn)制)
十六進(jìn)制……0x123456789ABCDEF
(2)進(jìn)制的轉(zhuǎn)換
i.二、八、十六進(jìn)制與十進(jìn)制的相互轉(zhuǎn)換聯(lián)系高中算法一章
ii.二進(jìn)制轉(zhuǎn)八進(jìn)制:從右開始,每三個一組,轉(zhuǎn)成十進(jìn)制即可(在二進(jìn)制中,每三個表示的數(shù)的范圍為0~7,故可以實(shí)現(xiàn)。在分組時,不夠三位的可以補(bǔ)充0在前即可)。同理轉(zhuǎn)十六進(jìn)制,每四個一組
iii.八進(jìn)制轉(zhuǎn)二進(jìn)制:從左開始,把每個數(shù)轉(zhuǎn)換為三位二進(jìn)制數(shù)(不足位的在前補(bǔ)充0)。十六進(jìn)制的,則是每個數(shù)轉(zhuǎn)換位四位的二進(jìn)制數(shù)
(六) 位移運(yùn)算符
1.引子:位移運(yùn)算中的“位”其實(shí)是計(jì)算機(jī)最底層的存儲數(shù)值的bit。bit里存儲1與0,是二進(jìn)制的算法。而這些1與0的共同組合出的整體叫“碼”,每個1與0占據(jù)的不同地方就是不同的“位”。為了計(jì)算機(jī)能直接利用這些碼,并用二進(jìn)制的方式運(yùn)算。人們將這些碼分為了原碼、反碼與補(bǔ)碼,方便識別負(fù)數(shù),從而方便計(jì)算加減乘除(在人算二進(jìn)制中,直接轉(zhuǎn)換往往只能得到正數(shù),故為了表達(dá)負(fù)數(shù)就出現(xiàn)了符號位。但是仍然用的1與0,對計(jì)算機(jī)來講,非常難以辨別。于是人們又創(chuàng)造出原碼、反碼與補(bǔ)碼,從而成功幫助計(jì)算機(jī)識別出符號位)。在進(jìn)行運(yùn)算時,一個數(shù)轉(zhuǎn)換成帶符號位的二進(jìn)制(即原碼),之后再轉(zhuǎn)換成反碼,最后轉(zhuǎn)換為補(bǔ)碼。計(jì)算機(jī)只有通過補(bǔ)碼才能實(shí)現(xiàn)正確的運(yùn)算。而我們?nèi)丝催\(yùn)算結(jié)果時,是看的原碼。
詳細(xì)內(nèi)容見知乎:
https://zhuanlan.zhihu.com/p/371184302
其中幾條重點(diǎn)知識:

2.位運(yùn)算符類型與運(yùn)算規(guī)則:


說明:
(1)注意區(qū)分邏輯運(yùn)算符,位運(yùn)算符是針對一個數(shù)的二進(jìn)制補(bǔ)碼,而邏輯運(yùn)算符針對是條件語句
(2)在運(yùn)算時,計(jì)算機(jī)是看的補(bǔ)碼,結(jié)果輸出是原碼
(3)運(yùn)算方法:
例如已知兩個補(bǔ)碼:10010001 與 11110010
首先將補(bǔ)碼豎著排列,依次對齊。在通過位運(yùn)算符規(guī)則,一個一個位比較得結(jié)果
10010001
11110010
------------- (按位與)
10010000
注意:計(jì)算機(jī)在存儲補(bǔ)碼時,要按照字符類型進(jìn)行存儲且第一個位為符號位,故一般不會出現(xiàn)位數(shù)不相等的情況
下面是編程時的推導(dǎo):

說明:這里2與3是int類型,4個字節(jié),32個位(bit)
(4)
算術(shù)右移>>運(yùn)算規(guī)則:
例如: int a = 1 >> 2
其中1表示要執(zhí)行操作的數(shù),2表示1轉(zhuǎn)換后的補(bǔ)碼整體向右移動兩位,溢出部分刪去,空出部分補(bǔ)符號位
| 00000001 |
| 0 00000 | 01
| 00000000 |
本質(zhì)為原來的數(shù)除多少個2
算術(shù)左移<<運(yùn)算規(guī)則:
例如:int b = 1 << 2
| 00000001 |
00 | 000001 |
| 00000100 |
本質(zhì)為原來的數(shù)乘多少個2
邏輯右移>>>運(yùn)算規(guī)則:
例如:int c = 1 >>> 2
| 00000001 |
| 000000 | 01
| 00000000 |
程序流程控制結(jié)構(gòu)篇
一 什么叫程序流程
程序中執(zhí)行代碼的順序。它包括三種基本流程:順序、分支、循環(huán)
二、順序控制
程序從上至下逐步執(zhí)行的一種流程,中間沒有任何判斷和跳轉(zhuǎn)
程序框圖如下:

注意:在調(diào)用變量時,只能用之前所定義的,即前向引用
三 分支控制
(一) if-else
1.單分支型
基本語法:
if(條件表達(dá)式){
代碼塊;
}
說明:當(dāng)且僅當(dāng)條件表達(dá)為ture時才會執(zhí)行代碼塊
2.雙分支型
基本語法:
if(條件表達(dá)式){
代碼塊1;
}
else {
代碼塊2;
}
說明:當(dāng)條件表達(dá)式成立執(zhí)行代碼塊1,否則執(zhí)行代碼塊2
3.多分支型
基本語法:
if(條件表達(dá)式1){
代碼塊1;
}
else if(條件表達(dá)式2) {
代碼塊2;
}
else if(條件表達(dá)式3) {
代碼塊3;
}
…………
else {
代碼塊N;
}
流程圖:

說明:可以省略最后的else部分。當(dāng)省略它時,若所有條件都不滿足,則沒有任何代碼塊執(zhí)行。反之,當(dāng)不省略時,若所有條件都不滿足,則只會執(zhí)行else所包含的代碼塊
4.嵌套分支型
顧名思義,在分支流程中再分支,如同樹枝一樣(為了可讀性強(qiáng),建議不要超過3層嵌套分支)
基本語法(舉例一種):
if(條件1){
if(條件1.1){
if(條件1.1.1){
代碼塊;
}else
代碼塊;
}else
代碼塊;
}
(二)switch
基本語法:
switch(表達(dá)式){
case 常量1:
代碼塊1;
break;
case 常量:
代碼塊2;
break;
………
case 常量N:
代碼塊N;
break;
default:
代碼塊;
break;
}
說明:表達(dá)式對應(yīng)一個值(其實(shí)只要有值返回,表達(dá)式為變量都可以),只可以為int,byte,short,char,enum(枚舉),String。當(dāng)表達(dá)式的值符合下方哪個常量(是從上往下依次檢索),就執(zhí)行哪個常量所對應(yīng)的代碼塊,一直運(yùn)行到break后跳出整個switch分支。若一個都不匹配,則執(zhí)行default處的代碼塊
注意:
1.匹配的常量數(shù)據(jù)類型應(yīng)當(dāng)與表達(dá)式數(shù)值一致,或者可以自動轉(zhuǎn)成可以相互比較的類型(例如char可以轉(zhuǎn)換為int)
2.default可以省略
3.break未寫,將不會跳出switch,而是順序執(zhí)行下一個代碼塊,一直運(yùn)行到結(jié)尾或下一個的break(即穿透情況)
四 循環(huán)控制
(一) for
基本語法:;
for(循環(huán)變量初始化;循環(huán)條件;循環(huán)變量迭代){
循環(huán)執(zhí)行的代碼塊;
}
例如:
for( int i = 1 ; i <= 10 ; i++){
System.out.println("你好,韓順平教育");
}
說明:
(1)執(zhí)行流程聯(lián)系高中算法中的當(dāng)型循環(huán),流程圖如下:

值得注意的是,迭代在循環(huán)執(zhí)行代碼塊后進(jìn)行
(2)括號內(nèi)的初始化與變量迭代可以寫在括號外的其它地方,但循環(huán)條件不可以,且循環(huán)條件兩頭的分號不可以省
(3)處于括號內(nèi)的新定義的變量不能在for循環(huán)外的代碼中使用
(4) for(;;)是死循環(huán)。利用cral + c實(shí)現(xiàn)終止程序退出
(5)可以初始化,迭代多個變量,變量間用逗號隔開
(二)while
基本語法:
while(循環(huán)條件){
循環(huán)代碼塊;
循環(huán)變量迭代;
}
說明:與for基本一致,只是基本要素位置不同而已。流程圖如下:

值得注意的是,未寫循環(huán)變量迭代,將會進(jìn)行死循環(huán)
(三) dowhile
基本語句:
do{
循環(huán)代碼塊;
循環(huán)變量迭代;
}while(循環(huán)條件);
說明:與for、while一樣,有循環(huán)語句的四要素(這里省略了變量初始化),只是位置不一樣。但與這兩個不一樣的是,該語句無論如何都要先執(zhí)行一遍,再進(jìn)行循環(huán)。流程圖如下:

與while一樣,未寫循環(huán)變量迭代,將會進(jìn)行死循環(huán)
(四) 多重循環(huán)
介紹:在一個循環(huán)體中嵌套另一個循環(huán)體(一般嵌套使用兩層,最多不要超過三層)
執(zhí)行流程概要:可以采取換元法,把內(nèi)層循環(huán)當(dāng)作整體作為外層循環(huán)的代碼塊,從而簡化思路。比如說,若外層的循環(huán)次數(shù)為m次,內(nèi)層 的循環(huán)數(shù)為n次,則外層每進(jìn)行一次,則內(nèi)循環(huán)要完整進(jìn)行n次,故總體內(nèi)循環(huán)執(zhí)行m*n次
五 跳轉(zhuǎn)控制
(一) break
用于終止最近某個語句塊的執(zhí)行,一般用在switch或循環(huán)語句中
基本語法:
……
break;
……
為了能控制break語句的發(fā)生,往往搭配If語句使用。例如:

補(bǔ)充:
break語句可以配合標(biāo)簽(在break后面加上標(biāo)簽名稱)來針對性地終止某一個代碼塊。標(biāo)簽的使用方法:在一個{}整體前面加上"【標(biāo)簽名稱】: "即可。但由于使用標(biāo)簽會使代碼的可讀性變差,故實(shí)際開發(fā)中盡量不要使用標(biāo)簽。例如:

說明:當(dāng)執(zhí)行到break時,由于標(biāo)簽的存在,使得lable1標(biāo)簽所指的代碼塊終止,即外循環(huán)終止,從而直接跳出到最外層
(二) continue
用于結(jié)束本次循環(huán),進(jìn)行下一個循環(huán)
基本語法結(jié)果與break一樣,也可以使用if來控制與使用標(biāo)簽來針對
(三) return
用于跳出方法,如果使用在主方法main中,將會直接退出程序
與上面的一樣,基本語法不變
有關(guān)方法,將在之后講解
數(shù)組篇
一 什么叫數(shù)組
顧名思義,數(shù)值的組合,可以理解為高中里的集合。通過使用數(shù)組,可以實(shí)現(xiàn)多個數(shù)值,多個變量的批量操作或者針對操作,從而簡化代碼。數(shù)組是一種數(shù)據(jù)類型,屬于引用類型,故也會涉及基本數(shù)據(jù)類型等相關(guān)知識
二 數(shù)組的基本使用方法
(一)定義數(shù)組
基本語法:
數(shù)據(jù)類型 數(shù)組名稱[] = new 數(shù)據(jù)類型 [大小];
例如:
int a[] = new int[5];
創(chuàng)建一個名為a的可包含5個int數(shù)值的數(shù)組
或者可以把[]放在第一個數(shù)據(jù)類型的后面
補(bǔ)充:可以只寫 數(shù)據(jù)類型 數(shù)組名稱[] 來聲明,之后再創(chuàng)建new語句。注意此時內(nèi)存并沒有分配空間給數(shù)組,若沒有new語句就直接賦值會報(bào)錯
(二)針對性調(diào)用
當(dāng)定義完數(shù)組并存儲了一定數(shù)量的數(shù)值時,可以類似于變量一樣,通過 數(shù)組名稱[n] 表示調(diào)用某一個數(shù)組里的單獨(dú)某個數(shù)值,其中[n]表示下標(biāo)。注意n表示第n+1個數(shù)值,也就是說,第一個數(shù)值其實(shí)是第零個[0]
(三)賦值數(shù)值
基本語法
1.數(shù)組名稱[n] = .......其中[n]表示下標(biāo)
2.數(shù)據(jù)類型 數(shù)組名稱[] = {a , b , c, ... };該方法又稱為靜態(tài)初始化
3.數(shù)據(jù)類型 數(shù)組名稱[] = new 數(shù)據(jù)類型[]{……};該方法[]不可以填任何數(shù)字
(四) 調(diào)用數(shù)組元素個數(shù)
基本語法:類似變量,利用 數(shù)組名稱.length 來表示
三 數(shù)組的使用細(xì)節(jié)
(一)數(shù)值與數(shù)組的數(shù)據(jù)類型要一致或能夠進(jìn)行自動轉(zhuǎn)換或能夠把小轉(zhuǎn)大才行
(二)數(shù)組創(chuàng)建后,如果沒有賦值,則計(jì)算機(jī)會以默認(rèn)值賦值給所有元素。分別如下:
int……0
short……0
byte……0
long……0
float……0.0
double……0.0
char……\u0000 [十六進(jìn)制]
boolean……false
String……null
(三)數(shù)組的下標(biāo)從0開始且只能在范圍內(nèi)使用
(四)由于數(shù)組的數(shù)據(jù)類型為引用類型,故其數(shù)據(jù)實(shí)則為 對象。但數(shù)組[n]是基本數(shù)據(jù)類型,要涉及基本數(shù)據(jù)類型中的使用細(xì)節(jié)
四 數(shù)組的賦值機(jī)制
數(shù)組在默認(rèn)情況下是引用傳遞,賦值的值本質(zhì)是地址。不同于基本數(shù)據(jù)類型的賦值(值傳遞),在這里,一個值賦值給另一個會影響到本身。例如:
int[] arr1 = {1,2,3};
int[] arr2 = arr1;
arr2[0] = 10;
執(zhí)行完后,不光是arr2第一個元素改變了,arr1也發(fā)生了變化
這里我們將詳細(xì)講解引用傳遞與值傳遞在計(jì)算機(jī)內(nèi)存上的具體體現(xiàn):
java在計(jì)算機(jī)上的內(nèi)存也可以稱為jvm的內(nèi)存。在這里,內(nèi)存大致可以分出三個區(qū)域:棧、堆、方法區(qū)。其中變量、數(shù)值(基本數(shù)值類型的)、地址在棧中存儲。堆中存儲地址所連接的詳細(xì)數(shù)據(jù)。(這里的地址可以理解為路牌,它只起到指引作用,不能起到存儲內(nèi)容的作用。而它指引的目的地,才是引用數(shù)據(jù)類型的內(nèi)容的集中處)
值傳遞:基本數(shù)據(jù)類型的一種賦值方式。它是在棧中進(jìn)行的。例如:
int a = 10;
int b = a;
此時a賦值給b的操作實(shí)際為:a變量在棧中分得空間,由變量a指向該空間,該空間中存儲int數(shù)值10。之后a將該空間數(shù)值復(fù)制給b變量指向的空間中。注意,復(fù)制的是數(shù)值本身。故此時改變b中數(shù)值,只在b指向的空間中執(zhí)行,并不會影響a變量指向的空間。
引用傳遞:引用數(shù)據(jù)類型的一種賦值方式,變量在棧中分得一定空間來存儲地址并在堆中一定空間中存儲實(shí)在的數(shù)值內(nèi)容。而地址作為索引,使計(jì)算機(jī)與堆中該空間聯(lián)系。例如之前的例子:
int[] arr1 = {1,2,3};
int[] arr2 = arr1;
arr2[0] = 10;
數(shù)組arr1在棧中與堆中分別獲得一定空間,在前者存儲地址,后者存儲數(shù)組中的數(shù)值(存儲的數(shù)值在該區(qū)域中會被分到更小的區(qū)域,互不干擾,從而實(shí)現(xiàn)了下標(biāo)功能)。之后地址與堆相聯(lián)系。在arr1賦值給arr2時,arr1在棧中復(fù)制地址給arr2(注意,賦值的是地址!),使得arr2所指向的地址又與堆中相同空間聯(lián)系(路牌內(nèi)容一樣,目的地只有一個,故兩者都會來到同一個地方)。若改變arr2中的數(shù)值,其實(shí)是計(jì)算機(jī)通過arr2中的地址找到堆中相應(yīng)位置后,再改變數(shù)值。故改變后,arr1也跟著改變。
注意:若出現(xiàn)這樣的賦值:
int[] arr1 = {1,2,3};
int[] arr2 = {1,2,3,4};
arr1 = arr2;
此時,由于arr2直接賦值給arr1,使得arr1原先地址替換,導(dǎo)致原來的數(shù)組arr1由于沒有地址聯(lián)系而被計(jì)算機(jī)清除

五 數(shù)組的拷貝
由于數(shù)組的賦值的不同,需要靠其它方式進(jìn)行像值傳遞一樣的復(fù)制方式
基本方法:在堆中開辟出新的數(shù)組區(qū)域,將原來的數(shù)組所含數(shù)值復(fù)制到該新區(qū)域,并讓新的數(shù)組建立出聯(lián)系該區(qū)域的地址
基本語法:
int[] arr1 = {……};
int[] arr2 = new int[arr1.length];
//開辟出新的數(shù)組區(qū)域
for(int i = 0;i < arr1.length;i++){
arr2[ i ] = arr1[ i ];
}
//將數(shù)組arr1中的數(shù)依次復(fù)制到arr2中
六 數(shù)組的反轉(zhuǎn)
將數(shù)組中的數(shù)值根據(jù)下標(biāo)倒置過來
效果例如:
{10,20,30,40} >>>>{40,30,20,10}
基本思路1:

基本代碼1:

說明:temp變量是用于交換數(shù)值的中間變量,就如同倒水一樣,把兩個杯子里的水互換時,必須要第三個杯子幫助。而temp就是這第三個杯子。
基本思路2:通過創(chuàng)建新的數(shù)組來存儲倒序后的數(shù)值,再把這個數(shù)組復(fù)制到目標(biāo)數(shù)組
基本代碼2:

說明:由于要逆序復(fù)制,數(shù)組1復(fù)制到數(shù)組2時要倒著進(jìn)行,這也是 i-- 的原因。但到數(shù)組2時要正著導(dǎo)入,這便是 j++ 的原因
七 數(shù)組的擴(kuò)容與縮減
能夠?qū)崿F(xiàn)動態(tài)地增加或減少數(shù)組中的元素個數(shù)的方法
基本思路與代碼:

說明:縮減的方法,就是在擴(kuò)容的思路上,大致上把加改減即可
八 基本排序
用于將多個數(shù)據(jù)按照指定的順序進(jìn)行排列的方法
(一)分類
1.內(nèi)部排序:所需要排序的數(shù)據(jù)可以全部加載到內(nèi)存處理器中來進(jìn)行排序(包括:交換式排序法、選擇式排序法和插入式排序法)
2.外部排序:所需要排序的數(shù)據(jù)不能完全加載到內(nèi)存處理器中,需要在外部存儲來進(jìn)行排序(包括:合并排序法和直接合并排序法)
(二) 冒泡排序法
基本思路:對待排序的數(shù)按照序號從后往前依次比較相鄰數(shù)的大小,改變相鄰數(shù)的順序使得較大的數(shù)從前移向后部,實(shí)現(xiàn)將數(shù)從小到大排列

說明:每次比較時,都是從前往后依次兩個兩個比較。第一次比較24與69,第二次比較69與80,依次類推。然后逐漸將大的數(shù)通過兩兩交換,排到后面去。
過程特點(diǎn):

說明:
1.第2點(diǎn)與第3點(diǎn)說明是一個雙層循環(huán)結(jié)構(gòu)
2.第4點(diǎn)涉及的代碼為常見的交換數(shù)值代碼
3. 外循環(huán)次數(shù)與內(nèi)循環(huán)次數(shù)有相同的值(即4),說明可以套用相同的變量,且4又恰好等于數(shù)組元素個數(shù)減1,可以方便實(shí)現(xiàn)“先死后活”
4.每次比較時,內(nèi)循環(huán)次數(shù)再逐漸變少,涉及 減法的計(jì)算
參考代碼:

九 順序查找
一種按照從前往后的順序在數(shù)組中找到目標(biāo)數(shù)值的方法
基本語法:


說明:利用index變量紀(jì)錄是否找到所需要的值,若找到則index變量原來的值會改變,否則將保持原來的值。這時,只用判斷index是否變化就可以判斷是否找到
十 二維數(shù)組
如果將之前學(xué)的那一列數(shù)組當(dāng)作一維數(shù)組,則二維數(shù)組則是將多個一維數(shù)組組合起來。
例如:
數(shù)組1: 1,0,5,8
數(shù)組2: 4,5,8,6
數(shù)組3: 1,6,9,0
那么二維數(shù)組為:
1,0,5,8
4,5,8,6
1,6,9,0
(一) 二維數(shù)組的內(nèi)存存放方式
類似于一維數(shù)組的地址操作,在這里,不同在于在堆中又存放了一個地址來連接一維數(shù)組

(二)創(chuàng)建二維數(shù)組
基本語法1:
數(shù)據(jù)類型[] [] 數(shù)組名稱 = new 數(shù)據(jù)類型[大小1] [大小2]
(類比一維數(shù)組的創(chuàng)建方式)
說明:
大小1表示二維數(shù)組中包含了多少個一維數(shù)組,大小2表示一個一維數(shù)組包含多少元素。在賦值時,[][]也表示相同的指代。例如:arr[1][2] = 1;表示把下標(biāo)為1的一維數(shù)組中的下標(biāo)為2的元素賦值為1
同一維數(shù)組,也可以先聲明,再new。而且二維數(shù)組也有相同的默認(rèn)賦值
補(bǔ)充:
二維數(shù)組可以出現(xiàn)“列數(shù)不確定”現(xiàn)象。即二維數(shù)組中的一維數(shù)組中的元素不一定要相同。例如:
1 ,
2,1
1,0,0
那么此時創(chuàng)建方式略有不同:
數(shù)據(jù)類型[] [] 數(shù)組名稱 = new 數(shù)據(jù)類型[大小1] []
(注意:沒有填 大小2 ,就導(dǎo)致了一維數(shù)組其實(shí)并沒有new一個實(shí)際的空間出來,此時里面全為空null)
之后要單獨(dú)地為每個一維數(shù)組開(new)空間:
數(shù)組名稱[下標(biāo)] = new int[大小]
最后依次賦值
基本語法2:
數(shù)據(jù)類型 數(shù)組名稱[][] = {{值1,值2...},{值...}}
說明:
[][]位置可以直接放在數(shù)據(jù)類型的后面,也可以像這樣:int[] y[] = ……
該方法可以免去賦值的代碼
(三)遍歷二維數(shù)組的方法
基本語法

說明:
(注意關(guān)注循環(huán)部分)
對二維數(shù)組來說,arr.length得到的是有多少個一維數(shù)組。arr[i].length才是得到的某個一維數(shù)組中有多少個元素
arr[ i ][ j ]是遍歷二維數(shù)組的關(guān)鍵,而嵌套循環(huán)的主要作用就是幫助改變i與j的值
楊輝三角作業(yè)參考:

評價:未考慮到只有1行或2行的情況,這里少了if去判斷。未能簡化思路:除了首末就是中間元素,剛好可以分別賦值,由此考慮if-else并使用邏輯條件
老師思路(更簡潔):

面向?qū)ο缶幊唐ɑA(chǔ))
一 類與對象
(一) 什么是對象與類
一個程序就是一個世界,在這個世界中存在許多的事物(如樹,貓,狗,人……)。而這些事物又存在許多特征 ,包括外貌的特征,心理的特征,行為的特征等等。我們把這些事物稱為對象,一個對象主要具備屬性,行為的特征(就像寫個人信息表一樣,屬性就是指那些如身高、體重、年齡一樣的數(shù)據(jù),而行為就像是指你喜歡做什么,口頭禪是什么一樣的數(shù)據(jù))。每個對象都是獨(dú)一無二的(就像人一樣),但存在一些對象具有一些某方面上的相似性,我們就把這些對象統(tǒng)一起來,分門別類,把他們整體稱為類(就好比生物中的界門綱目科屬種一樣)

(二)類在編程中解決的問題
如上文說到,類中包含的對象具有一些方面的相似性,或者說這些對象都有同樣的可描述的方面,比如說人這個類里,每個人都有性別,年齡,身高,體重等等可描述的方面。而類就是以這些個方面來歸納的。如果我們創(chuàng)建一個類,那么這些個類中就有這些個描述對象的方面,就像是一個對象生成器一樣,一個特征編譯器的模子,只要按照這個類,就能輕松創(chuàng)造出具有一定屬性,行為的對象,方便管理對象的數(shù)據(jù)
類是一種自定義的數(shù)據(jù)類型,可以添加多種屬性,行為來歸納數(shù)據(jù),這些數(shù)據(jù)實(shí)際上就是對象。
由于類其優(yōu)越的數(shù)據(jù)管理能力,可以幫助我們在創(chuàng)建,調(diào)用對象時,可以一下子動用整個對象的全部數(shù)據(jù)來實(shí)現(xiàn)某些功能且不會出現(xiàn)混亂情況(在傳統(tǒng)的直接定義法定義某個對象時如int name = ....;int age = ....會使數(shù)據(jù)特別分散,尤其是要用到多個對象時,如果不好好命名變量名稱,是極容易弄亂的。利用數(shù)組法雖然可以整理數(shù)據(jù),但在調(diào)用數(shù)據(jù)時不是很直觀,比如int[] dog = {1,5,45};由于調(diào)用其中單獨(dú)數(shù)據(jù)時只能用dog[下標(biāo)]表示,如果我不提前記憶{}內(nèi)每個數(shù)據(jù)代表什么含義時,誰知道誰是誰?而且數(shù)組往往只能整合一種數(shù)據(jù)類型,比如我想添加狗的姓名時,由于是字符串類型,就無可奈何。而類則是解決了上面兩者情況的問題,并且整合了兩者的優(yōu)點(diǎn))
(三) 創(chuàng)建類與對象
1.創(chuàng)建類:
基本語法:
class 類名 {
數(shù)據(jù)類型 屬性1;
數(shù)據(jù)類型 屬性2;
數(shù)據(jù)類型 屬性3;
.........
}
注意:
要在主類main的{}外定義新的類;
數(shù)據(jù)類型可以有數(shù)組
例如(一個描述貓的類):

2.創(chuàng)建一個對象
基本語法:
類名 對象名 = new 類名();
對象名.屬性1 = ...;
對象名.屬性2 = ....;
……
例如:

注意:對象的創(chuàng)建一般放在主類里
(四) 對象與類在內(nèi)存的存在形式
由于類是引用數(shù)據(jù)類型,故基本原理與數(shù)組一樣,這里不再贅余(結(jié)合之前的知識來理解圖即可)


(超2w字了。。。可惡(#-.-))
(等以后筆記可以拓展了再更新)