黑馬程序員Java零基礎(chǔ)視頻教程_上部(Java入門(mén),含斯坦福大學(xué)練習(xí)題+力扣算

this的本質(zhì):代表方法調(diào)用者的地址值。

兩個(gè)引用指向一個(gè)對(duì)象,用同一個(gè)地址值,每次賦值都會(huì)覆蓋。

構(gòu)造方法

兩個(gè)對(duì)象的內(nèi)存空間原理,新new一個(gè)對(duì)象會(huì)開(kāi)辟一個(gè)新的空間。

封裝和private關(guān)鍵字

引用和基本數(shù)據(jù)的內(nèi)存。

Java內(nèi)存分配。

==比的到底是誰(shuí)什么?

String.charAt(int index) 獲取字符串索引處的字符。字符串拼接,就是 '+' 。
String.substring(int beginindex, int endindex) 截取字符串,需要返回值接收。
String.replace(舊值,新值) 字符串中的替換,也需要返回值接收。
StringBuilder:創(chuàng)建之后可以變化。StringBulider.append(任意類(lèi)型)添加數(shù)據(jù),返回本身;.reverse()反轉(zhuǎn)內(nèi)容;.length()長(zhǎng)度;.toString轉(zhuǎn)換成String(toString的底層會(huì)new一個(gè)新的字符對(duì)象)。 (反轉(zhuǎn)和拼接想到用StringBulider)。
StringJoiner:StringJoiner.add(添加的內(nèi)容);.length;.toString。 new StringJoiner(間隔符,開(kāi)始符,結(jié)束符)。


集合的方法:

static靜態(tài):靜態(tài)只能訪問(wèn)靜態(tài)!靜態(tài)的東西都可以直接用 ’ . ‘ 直接調(diào)用。

封裝:對(duì)象代表什么,就得到封裝對(duì)應(yīng)的數(shù)據(jù),并提供對(duì)應(yīng)的行為。

繼承:
extends關(guān)鍵字,可以讓一個(gè)類(lèi)和另一個(gè)類(lèi)建立起繼承關(guān)系。(當(dāng)類(lèi)和類(lèi)之間,存在相同的內(nèi)容,并滿足子類(lèi)是父類(lèi)中的一種,就可以考慮使用繼承,來(lái)優(yōu)化代碼。)
super表示直接訪問(wèn)父類(lèi),this訪問(wèn)成員變量,不加訪問(wèn)局部變量,其實(shí)就是就近原則。
子類(lèi)能繼承父類(lèi)的變量,包括加了private關(guān)鍵字的變量,能繼承方法不能繼承private方法,不能繼承構(gòu)造方法。
繼承的子類(lèi)的在被創(chuàng)建對(duì)象時(shí)會(huì)開(kāi)辟兩個(gè)空間,一個(gè)是父類(lèi)的,一個(gè)是自己私有的。
多態(tài):
只有重寫(xiě)方法了才能繼承。

調(diào)用成員變量:編譯看左邊,運(yùn)行看左邊。
調(diào)用成員方法:編譯看左邊,運(yùn)行看右邊。
編譯看左邊:javac編譯代碼的時(shí)候,會(huì)看左邊的父類(lèi)中有沒(méi)有這些方法/變量,有編譯成功,無(wú)則失敗。 (編譯是運(yùn)行的前提,能完成編譯才能進(jìn)行運(yùn)行??!)
運(yùn)行看右邊:運(yùn)行的時(shí)候?qū)嶋H上看的是左/右邊
理解多態(tài)的創(chuàng)建對(duì)象:Animal a = new Dog(); a去調(diào)用方法和變量,實(shí)際上是在Animal中尋找。成員變量:子類(lèi)中會(huì)繼承父類(lèi)的成員變量,而成員方法會(huì)重寫(xiě)方法,所以是繼承下來(lái)的虛方法表,也就是本身的重寫(xiě)之后的方法。
但是創(chuàng)建對(duì)象的子類(lèi)里面如果有私有變量,編譯先看左邊或者說(shuō)定義的類(lèi)型是父類(lèi),父類(lèi)里并找不到子類(lèi)私有的方法或者變量,編譯就無(wú)法通過(guò),也就談不上運(yùn)行。

抽象方法所在的類(lèi)必須是抽象類(lèi) abstract,子類(lèi)必須重寫(xiě)抽象方法。并且只能按照規(guī)定的格式。
接口: public interface name{} ,如何去對(duì)應(yīng)接口: 在public class后面 寫(xiě)上 implements 接口名。類(lèi)用接口叫做實(shí)現(xiàn),這個(gè)類(lèi)就是實(shí)現(xiàn)類(lèi),可以單實(shí)現(xiàn),也可以多實(shí)現(xiàn)(也就是可以使用多個(gè)接口)。接口和接口之間可以有繼承關(guān)系。
內(nèi)部類(lèi):
成員內(nèi)部類(lèi),在成員位置,屬于外部類(lèi)的成員??梢栽谕獠款?lèi)編寫(xiě)方法提供內(nèi)部類(lèi)對(duì)象,或者Outer.Inner oi = new Outer.new Inner();
靜態(tài)內(nèi)部類(lèi),只能訪問(wèn)外部類(lèi)的靜態(tài)變量或者靜態(tài)方法。要訪問(wèn)得創(chuàng)建對(duì)象。
匿名內(nèi)部類(lèi):

Runtime中的常用API:通過(guò)Runtime r = Runtime.getRuntime();來(lái)創(chuàng)建對(duì)象。

BigInteger 中的方法:new BigInteger(“一個(gè)數(shù)”)創(chuàng)建一個(gè)對(duì)象,括號(hào)中為字符串,能獲得或者計(jì)算更大的整數(shù)。subtract減法add加法

Java中小數(shù)直接計(jì)算不準(zhǔn)確,有些會(huì)很長(zhǎng)超過(guò)范圍會(huì)發(fā)生截?cái)?,?dǎo)致數(shù)據(jù)不準(zhǔn)確。要?jiǎng)?chuàng)建BigDecimal()對(duì)象進(jìn)行精確計(jì)算,創(chuàng)建一個(gè)對(duì)象,括號(hào)中為字符串。

正則表達(dá)式:簡(jiǎn)化校驗(yàn)字符串的操作!調(diào)用String . matches(regex:“”) regex為正則表達(dá)式(String類(lèi)型),寫(xiě)法如下:

如何在大串中尋找符合要求的小串?
Pattern p = Pattern.compile(regex“”)
Matcher m = p.matcher(str);
。默認(rèn)為貪婪爬取+ * , 在后面加上?為非貪婪爬取。貪婪爬取為盡可能多的爬取。分組:組內(nèi)使用是\\,組外使用是$。以左括號(hào)為準(zhǔn)向右計(jì)算組號(hào)。

String replaceAll(String regex, String replacement)替換指定正則表達(dá)式為第二個(gè)參數(shù)。String[] split(String regex)按照正則表達(dá)式在字符串中滿足的地方做切割,截取被切開(kāi)的字符串放入字符數(shù)組。
m要在str中尋找滿足p這個(gè)正則表達(dá)式的小串,并通過(guò)m.group()去返回滿足條件的小串,一次只能找到一個(gè),要繼續(xù)得再次調(diào)用,所以用while(m.find(){sout("m.group")}進(jìn)行改進(jìn).因?yàn)閙.find的返回值是Boolean類(lèi)型的。這個(gè)過(guò)程,就叫做爬蟲(chóng)?。?!爬取數(shù)據(jù)。
Date類(lèi):SimpleDateFormat類(lèi):Calendar類(lèi):getInstance()獲取當(dāng)前時(shí)間日歷對(duì)象。
JDK8以后新增的時(shí)間類(lèi):有一點(diǎn)規(guī)律: .now()獲取現(xiàn)在的時(shí)間,.minus往前走 ,.plus往后,.ofXxx()獲取指定時(shí)間,.with開(kāi)頭改變時(shí)間,is開(kāi)頭為判斷。
計(jì)算時(shí)間間隔:例如ChronoUnit.Day.betwe(ld1,ld2),第二個(gè)減第一個(gè)的天數(shù)。

Integer常用方法:parseInt(“String”)轉(zhuǎn)成int

數(shù)組的常見(jiàn)API:toString(arr) 轉(zhuǎn)成字符串。二分法找key,binarySearch(arr, key);copyOf(arr,newlength)拷貝數(shù)組;copyOfRange(arr,from,to);

集合的進(jìn)階!:集合體系結(jié)構(gòu)

Collection單列集合的接口,里面的方法有:

遍歷集合的各種方法,因?yàn)殡p列集合無(wú)索引。
用list.iterator();獲取迭代器對(duì)象(集合專(zhuān)用的遍歷方式)。it.next();獲取當(dāng)前位置的元素并移動(dòng)指針,it.hasNext();判斷這里有沒(méi)有元素。.remove();刪除當(dāng)前位置的元素。
增強(qiáng)for循環(huán):for(元素的數(shù)據(jù)類(lèi)型 變量名:數(shù)組 / 集合){} 。lambda表達(dá)式遍歷:list.forEach(consumer<>接口)。
數(shù)據(jù)結(jié)構(gòu):棧(先進(jìn)后出),隊(duì)列(先進(jìn)先出),數(shù)組(索引),鏈表(結(jié)點(diǎn),里面存了這個(gè)地址的數(shù)據(jù)和下一個(gè)結(jié)點(diǎn)的地址,所以相當(dāng)于鏈表互相綁在一起)。二叉樹(shù)(度是每一個(gè)節(jié)點(diǎn)的子節(jié)點(diǎn),二叉樹(shù)度≤2,樹(shù)高是數(shù)的總層數(shù),根節(jié)點(diǎn)是最頂層的節(jié)點(diǎn),左右子節(jié)點(diǎn),根節(jié)點(diǎn)的左右子樹(shù)),紅黑樹(shù)(特殊的二叉查找樹(shù),滿足紅黑規(guī)則即可),二叉查找樹(shù)(小的存左邊,大的村右邊,一樣的不存,四種遍歷方法),平衡二叉樹(shù)(在二叉查找樹(shù)加一個(gè)規(guī)則,任意節(jié)點(diǎn)左右子樹(shù)高度差不超過(guò)1)。
紅黑樹(shù)添加節(jié)點(diǎn)的規(guī)則:

泛型的使用(在類(lèi)型不確定的情況下,使用泛型):泛型類(lèi),泛型方法,泛型接口。
泛型類(lèi)在類(lèi)名后面加上<E> ,后面的所有方法都可以在不確定的情況下用<E>作為屬性值;而泛型方法是在修飾范圍的關(guān)鍵字后面加<E>,形參也用<E>作為形參的數(shù)據(jù)類(lèi)型,表示只有這個(gè)方法可以用;泛型接口實(shí)現(xiàn)類(lèi)在實(shí)現(xiàn)的時(shí)候后面給上具體類(lèi)型,或者實(shí)現(xiàn)類(lèi)延續(xù)泛型,也就是寫(xiě)成泛型類(lèi),創(chuàng)建對(duì)象時(shí)確定。
泛型不能繼承,但數(shù)據(jù)可以繼承,當(dāng)定義類(lèi)或者方法,接口時(shí)類(lèi)型不確定時(shí),但是能知道以后是某個(gè)繼承體系中的,可以通過(guò)泛型的通配符:?super E | | ? extends E。

單列集合:hashSet底層為數(shù)組,鏈表和紅黑樹(shù),hashCode方法計(jì)算哈希值,是根據(jù)哈希值得出要放的位置。TreeSet: 底層為紅黑樹(shù),類(lèi)重寫(xiě)Comparator方法,創(chuàng)建比較方法;或者在創(chuàng)建對(duì)象時(shí)寫(xiě)匿名內(nèi)部類(lèi)完成實(shí)現(xiàn)。
