Java基礎-1
一、HelloWord
/**
*打印字符串
*@author 01
*@version 1.0 2019-7-15
*/
public class Main {
public static void main(String[] args){
System.out.println("Hello world!");//打印
}
}
- 每個文件可以有多個class,但只能有一個public class 其中類名與文件名相同
- public 是權限修飾符,所有類都可以訪問;private是隻有所在的類內可以訪問,子類可以繼承但是不能訪問;protected是子類可以繼承也能訪問,包外不能訪問;默認是define,只有包內可以訪問。
- import寫在package之後
- 註釋寫法和C語言一樣
- 最好是一個類一個文件
-
類名最好大寫
-
編譯後的後綴名是.class 是執行文件,源代碼後綴是.java
-
源代碼編譯成.class文件,class文件由JVM解釋執行,所以java是半編譯,半解釋型語言。
二、數據類型
- boolean //1位 不能類型轉換
- byte //1個字節 ASCII編碼,和C的char相等,本質其實是整形
- char //2個字節 UTF-16即unicode編碼
- short //2個字節
- int //4個字節
- long //8個字節 18位以內一定不會溢出
- float //4個字節
- double //8個字節
數據寫法與類型轉換
- 整數數值默認int,long的寫法是加L或l後綴
- 浮點默認是double,自動加後綴D,float要加f或F後綴
- 數據轉換:大內存類型不能轉小內存類型、int 不能轉float,long不能轉double
- char可以轉int,但不能按d%打印
- 0b或0B表示2進制
- 0x或0X表示16進制
- 浮點16進制科學計數法 0XFF00P2,p後面跟的是2的指數,e後跟的是10的指數,只有16進制浮點有p
- 非10進制小數寫法只有科學計數法
- 數值爲了方便看,可以加_分割符,比如0B0100_0100,1_000_000
- 0.0d/0=>Double.NaN
- 1.0d/0是無窮大,0/0或1/0報錯,因爲只有double有無窮大無窮小和NaN(not is number)
- 2.0-1.1結果爲0.8999......
三、變量
- final 修飾常量
- 變量定義可以有$,其他和C一樣,但是$最好不用
- java沒有逗號表達式
- 變量必須初始化才能用,屬性會默認初始化
- 超過18位的整數用BigInteger類
- 複雜數學計算用java.lang.Math類
四、字符串
常用函數
- charAt(int index)
- codePoinAt(int index)
- compareTo(String other)
- subSyting(int n)
- subString(int n,int m)
- equals(String s)
- length()
- replace()
- replaceAll()
- toLowerCase()
- trim()
- String.join(...)
- indexOf(String s)
- lastIndexOf(String s)
- startWith(String s)
- endWith(String s)
- Integer.toBinaryString(int i)
- repeat(int n) //java12纔有
- String.format
StringBuilder
- insert
- delete
- append
- reverse
- setCharAt
五、輸入輸出
1、格式化輸出
System.out.format()
- %d
- %x
- %a //16進制浮點
- %o //8進制
- %,3.2f
- %e
- %g
- %s //類型轉字符串輸出
- %c
- %b
2、輸入輸出
用java寫PTA的題,如果輸入選scanner,很容易發生超時。用緩存流輸入效率會高很多。不過代碼比較多,沒辦法,java語言沒有像C語言一樣的scanf。
下面是一個輸入n行矩陣放入整形數組中,然後打印出來的代碼。很簡單的功能,但是要寫這麼多,有時候java比C還囉嗦很多。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.stream.Collectors;
public class Solution {
private static void outputArray(int[] a){
var s=Arrays.stream(a).mapToObj(x-> x+"").collect(Collectors.joining(" "));
System.out.println(s);
}
private static int[] inputArray(BufferedReader br, int n) throws IOException {
int[] a=new int[n];
String[] str = br.readLine().split("\\s");
for (int i = 0; i < n; i++) {
a[i] = Integer.parseInt(str[i]);
}
return a;
}
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
int n=Integer.parseInt(br.readLine());
int[][] a=new int[n][n];
for(int j=0;j<n;j++) {
a[j]=inputArray(br,n);
}
for (int[] i:a)
outputArray(i);
}
}
六、數組
int[] a={1,2,5,4,3,6,1};
//copy#1
int[] b=new int[10];
System.arraycopy(a,0,b,0,a.length);
System.out.println(Arrays.toString(b));
//copy#2
b=Arrays.copyOf(a,9);
System.out.println(Arrays.toString(b));
//copy#3
int[] c=Arrays.copyOfRange(a,0,4);
System.out.println(Arrays.toString(c));
//快排
Arrays.sort(a);
System.out.println(Arrays.toString(a));
//二分查找
int i=Arrays.binarySearch(a,3);
System.out.println(i);
//fill
Arrays.fill(a,3);
System.out.println(Arrays.toString(a));
七、正則表達式
pattern新建方法:調用Pattern.compile
正則符號 | 意思 |
---|---|
\\d | 一個數值 |
\\w | a-zA-Z0-9 |
\\s | 空格和會車 |
\\\\ | \ |
\n | 回車 |
+ | {1,} |
* | {0,} |
? | {0,1} |
. | 任意字符 |
$ | 結束 |
^ | 開始 |
[^] | 表示不是括起來的內容 |
[] | 表示括起來的內容中選其中一個 |
| | 或者 |
\b | 單詞邊界,非捕獲 |
.*? | 非貪婪 |
(?=) |
八、數據結構
HashMap根據hashcode進行存儲,調用key的equals,hashcode和==判斷key是否相等,key只能是唯一的,hash碰撞時,用紅黑樹存儲。
get取值根據equals和hashcode取值。根據hashcode獲取數組下標,根據equals查找對應的key。
如果equals和hashcode不一致,就很容易出現錯誤,造成取不出來的情況。數組下標一樣,hashcode不一定一樣,但是hashcode不一樣,equals又恰好一樣,就會產生取不出來的情況。
另外,如果重寫hashcode方法,根據屬性內容計算hashcode,變量的hash值會根據變量的內容變化,同時數組下標位置不會變,這樣也會發生錯誤。比如本來equals相等,hashcode相等的key是不能同時存在的,但如果放進去的時候不同,經過後來變量的賦值,變的一樣了,其中一個值就會取不出來。
但如果不重寫呢?不重寫是根據內存地址計算hashcode,這樣就不能根據內容取數據,只能根據實例取數據。這樣的話,最好把equals重寫成==。這樣萬無一失。
LinkedList作爲棧的操作是push和pop,隊列是offer和poll。