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


采用直接賦值的方式,如果字符串相等,則會去字符串常量池中直接找到相應(yīng)字符串的地址。
jdk7之后堆內(nèi)存是跟方法的執(zhí)行有關(guān),進(jìn)棧出棧
堆內(nèi)存跟對象的存儲有關(guān),字符串常量池也在堆內(nèi)存中

new出來的字符串會在堆內(nèi)存中新開辟存儲空間,所以引用同一個字符數(shù)組,它們的地址值也不同。



ctrl+alt+t快捷鍵

Scanner sc = new Scanner(System.in);
String str = sc.next();
system.out.println("請輸入字符串");
int bigcount; //大寫字母計(jì)數(shù)器
int smallcount; //小寫字母計(jì)數(shù)器
int numbercount; //數(shù)字計(jì)數(shù)器
for(i = 0;i<str.length();i++){
char c = str.charAt(i);
if(c>= 'a' && c<='z'){
smallcount++;
}else if(c>= 'A' && c<='Z'){
bigcount++;
}else if(c>= '0' && c<='9'){
number++;
}else{
system.out.println("不屬于統(tǒng)計(jì)范圍");
}
}
system.out.println("大寫字母:"+bigcount);
system.out.println("小寫字母:"+smallcount);
system.out.println("數(shù)字:"+numbercount);

字符串拼接
金額轉(zhuǎn)換代碼
Scanner scanner = new Scanner(System.in); int money; while (true) { money = scanner.nextInt(); if (money >=0 && money <= 9999999){ break; }else { System.out.println("輸入金額錯誤"); } } System.out.println(money); String moneyStr = ""; //用來獲取大寫轉(zhuǎn)換之后的金額 // 從右往左,從個位到最高位 while (true) { //123 int ge = money % 10; //3 String capitialNumber = getCapitialNumber(ge); // 叁貳壹 moneyStr = capitialNumber + moneyStr; //用于正向輸出,壹貳叁 money = money / 10; //12 if (money == 0){ break; } } System.out.println(moneyStr); // 表示單位的數(shù)組 String[] arr = {"零","佰","拾","仟","佰","拾","圓"}; int count = 7 - moneyStr.length(); for (int i = 0; i < count; i++) { moneyStr = "零" + moneyStr; } String result = ""; for (int i = 0; i < moneyStr.length(); i++) { char c = moneyStr.charAt(i); result = result + c + arr[i]; } System.out.println(result); } public static String getCapitialNumber(int number){ String[] arr = {"零","壹","貳","叁","肆","伍","陸","柒","捌","玖"}; return arr[number]; }

substring用法

StringBuilder只是一個容器,說白了就是一個工具類,而用其對字符串進(jìn)行操作完之后,需要用toString()方法,轉(zhuǎn)成字符串,才能用字符串的相關(guān)方法

StringBuilder中的方法

StringBuilder的應(yīng)用場景

StringJoiner的構(gòu)造方法




java8之前,有變量參與的字符串拼接是通過先在串池中存儲,再通過StringBuilder進(jìn)行字符串拼接,再toString進(jìn)行字符串轉(zhuǎn)換

StringBuilder的擴(kuò)容機(jī)制



集合不能直接存基本數(shù)據(jù)類型,需要定義成相應(yīng)的包裝類,集合可以自由伸縮長度
數(shù)組可以直接存儲基本數(shù)據(jù)類型和引用數(shù)據(jù)類型,數(shù)組長度固定
引入泛型的概念,在arraylist中指限定集合存儲的類型

arraylist不能直接添加基本數(shù)據(jù)類型,要在泛型里面規(guī)定基本數(shù)據(jù)類型所對應(yīng)的包裝類

下面是錯誤示范,循環(huán)創(chuàng)建對象的時候要把對象放在循環(huán)里面,不然只是在循環(huán)外面創(chuàng)建了一個對象,而循環(huán)里面拿著這一個對象的地址值去創(chuàng)建對象,堆中的對象地址值是一樣的,相當(dāng)于復(fù)制。

shift+alt+↓可以一定代碼,選中多行也可以移動多行
加了static的就是靜態(tài)的東西,是隨著類加載而加載的,優(yōu)先于對象,是共享的

在類中,普通的成員方法默認(rèn)會有一個this,記錄方法調(diào)用者的地址值,這是由虛擬機(jī)賦值的,但是靜態(tài)的成員沒有this


靜態(tài)方法中不能調(diào)用非靜態(tài)的成員變量和方法
,因?yàn)樯厦嬉呀?jīng)說過,非靜態(tài)的默認(rèn)有一個this去調(diào)用變量和方法,而靜態(tài)沒有,也就是說靜態(tài)沒有對象去調(diào)用變量和方法



jdk9之后允許private修飾的方法,以下是jdk9用private修飾的方法



適配器設(shè)計(jì)模式:

當(dāng)某個類只需要實(shí)現(xiàn)接口中的一部分方法時,可以在實(shí)現(xiàn)類與接口之間夾一層適配器類,對接口中的方法進(jìn)行空實(shí)現(xiàn),該實(shí)現(xiàn)類再去繼承適配器,實(shí)現(xiàn)其中的某些方法就可以了

內(nèi)部類有:成員內(nèi)部類,靜態(tài)內(nèi)部類,局部內(nèi)部類,匿名內(nèi)部類

匿名內(nèi)部類:這里所說的類名和接口名,其實(shí)是其他類的類名和接口名,匿名內(nèi)部類本身沒有名字
匿名內(nèi)部類會在編譯之后,java自動生成一個字節(jié)碼文件,用來保存匿名內(nèi)部類所包含的信息

找到這個字節(jié)碼文件所在的包,利用javap 匿名內(nèi)部類的字節(jié)碼文件,就可以反編譯出來

當(dāng)一個類只用一次,比如狗這個類,只調(diào)用一次,這時就只需要把匿名內(nèi)部類作為參數(shù)定義就可以了
整個匿名內(nèi)部類可以看作一個對象,可以在大括號后面"."出來它包含的方法或?qū)傩?/p>

API

Math.cbrt()開立方根


System工具類

arraycopy:如果是基本數(shù)據(jù)類型,數(shù)據(jù)源數(shù)組與目的地?cái)?shù)組的數(shù)據(jù)類型要一致,不然會報(bào)ArrayStoreException異常。
RunTime

System.out.println:
System:類名
out:java定義的靜態(tài)變量
println:方法
當(dāng)我們打印一個對象的時候,底層會調(diào)用對象的toString()方法,把對象變成字符串,打印在控制臺上,打印完畢再進(jìn)行處理
Object
1·toString()方法是Object類中的方法,其他類默認(rèn)繼承object類,想要打印對象可以在類中重寫toString()方法
2·equals()與重寫equals():如果不重寫equals,默認(rèn)使用的是Object類中的equals()方法,比較的是兩個對象的地址值是否相等;在類中重新equals方法則,比較的是兩個對象的內(nèi)容是否相等。
instanceof是一個二元比較運(yùn)算符,比較兩邊是否是同一對象或繼承樹中的對象,是則返回true



淺克?。翰还苋叨唬瑢⒁寺ο蟮乃行畔⒍伎截惖搅硪粋€對象中,缺點(diǎn)是原來的內(nèi)容變了,拷貝過來的也要變

深克?。褐灰皇鞘謩觧ew的東西,克隆的地址不變,比如字符串都是存儲在串池中的,根據(jù)字符串優(yōu)化機(jī)制,會找到內(nèi)容相同的字符串,而數(shù)組則是new出來的,所以克隆時會新開辟空間,將原來數(shù)組中的內(nèi)容復(fù)制過去。

重寫clone()方法,使其變成深克隆,因?yàn)閚ewData是新創(chuàng)建的數(shù)組,其地址值與原來數(shù)組的地址值不同,所以只要再把newData的地址值賦值給data就可以了

BigInteger

bigInteger一旦創(chuàng)建,則里面的值不能改變

BigInteger中的valueOf靜態(tài)方法,等表示的范圍限于Long類型的范圍

正則表達(dá)式

[]:只匹配一個字符,要想多個匹配,可以多些幾次或用{}
正則表達(dá)式里&只是表示一個符號,&&才是而且的意思
{}:表示前面匹配的表達(dá)式往后匹配多少次
(?i):忽略大小寫
快速編輯正則表達(dá)式的插件:any-rule


爬蟲(一般都是字符串):
1.先用Pattern.compile(“相應(yīng)的正則表達(dá)式”).matcher(字符匹配器,要爬取的字符串),賦值給一個字符串變量m保存。
2.因?yàn)椴恢雷址拈L度,需要用while循環(huán)去循環(huán)獲取
while(m.find()){//m.find()表示讀取字符串中的內(nèi)容
String s = m.group();
System.out.println(s);
}
有條件的匹配爬?。?/p>
String regex = "Java(?=8|11|17)"
其中只有在括號中的?表示前面的數(shù)據(jù)Java
?=表示匹配前面的數(shù)據(jù),但是=后面的數(shù)據(jù)匹配上后不顯示
?:表示:后面的數(shù)據(jù)也一塊顯示

貪婪爬?。?/p>
正則表達(dá)式后面只寫+或者*
非貪婪爬取:
在+或者*后面再寫一個?



Date d = new Date(0L);//表示時間原點(diǎn)
d.setTime(1000L);//setTime的參數(shù)是Long類型,并且返回的是從時間原點(diǎn)開始,過了1000毫秒的時間



先用SimpleDateFormat去規(guī)定格式
再用parse將傳進(jìn)來的字符串轉(zhuǎn)換成日期對象
再用getTime方法獲取毫秒值


Calendar是一個抽象類,不能直接new,需要用getIntence方法來創(chuàng)建對象。默認(rèn)獲取的是當(dāng)前時間,會把所有信息都保存在一個叫ZoneInfo的數(shù)組中。



Integer調(diào)用valueOf()方法時,先判斷傳進(jìn)來的數(shù)據(jù)是否在[-128,127]之間,如果在,則直接返回,不在則new一塊空間存儲數(shù)據(jù)。

模擬parseInt,將字符串轉(zhuǎn)換為整型


mid = (min + max)/2 向下取整

等差數(shù)列法確定mid
