學(xué)習(xí)Java的一些筆記
注意事項(xiàng)
- Java對(duì)大小寫很敏感
- 類名必須以字母開頭旅急,后面可以跟字母和數(shù)字,也可以用 _和$ 兩種符號(hào)碍讨。不能使用Java保留字媳荒。(標(biāo)準(zhǔn)類名:以大寫字母開頭歧譬,如果類名由多個(gè)單詞組成宜猜,每個(gè)單詞首字母應(yīng)該要大寫
- 源代碼文件名必須與公共類的名字相同
- 為了代碼能夠你執(zhí)行涂圆,必須包含一個(gè)main方法
Java中的三種注釋
- 單行注釋( // )
- 多行注釋( /* */)
- 多行注釋 可以自動(dòng)生成文檔( /** */)
數(shù)據(jù)類型
類型 | 儲(chǔ)存需求 | 取值范圍 | |
---|---|---|---|
boolean | 1字節(jié) (8 bit) | true, false | |
char | 2字節(jié)(16 bit) | 0 ~ 216-1 | |
byte | 整型 | 1字節(jié) (8 bit) | -128 ~ 127 |
short | 整型 | 2字節(jié) (16 bit) | -32 768 ~ 32 767 (-215 ~ 215-1) |
int | 整型 | 4字節(jié) (32 bit) | -2 147 483 648 ~ 2 147 483 647 (-231 ~ 231-1) |
long | 整型 | 8字節(jié) (64 bit) | -9 223 372 036 854 776 808 ~ 9 223 372 036 854 775 807 (-263 ~ 263-1) |
float | 浮點(diǎn)類型 | 4字節(jié) (32 bit) | 大約±3.402 823 47E + 38F(有效位數(shù)為6~7位) |
double | 浮點(diǎn)類型 | 8字節(jié) (64 bit) | 大約±1.797 693 134 862 315 70E + 308(有效位數(shù)為15位) |
- 長整數(shù)型有一個(gè)后綴L (如4000000000L)
- 十六進(jìn)制數(shù)值有一個(gè)后綴0x (如0xCAFE)
- 八進(jìn)制有一個(gè)前綴 0 (如010)
- 二進(jìn)制有一個(gè)前綴 0b (如0b1001)
- Float類型的數(shù)值有一個(gè)后綴F (如 3.14F)
final 關(guān)鍵字
final關(guān)鍵字表示變量只能被賦值一次们镜,一旦被賦值后,就不能被更改润歉。
例如:
Final double CMCC = 2.54
如果希望某個(gè)常量可以在一個(gè)類中的多個(gè)方法中使用模狭,稱這個(gè)常量為類常量〔锐茫可以使用關(guān)鍵字static final 設(shè)置一個(gè)類常量椰于,定義的位置在main方法外部。因此零抬,同一個(gè)類的其他方法中也可以使用這個(gè)常量猎拨。如果一個(gè)常量被聲明為public,那么其他類的方法也可以使用這個(gè)常量萌朱。
運(yùn)算符
在java中宴树,算術(shù)運(yùn)算符可以用+ - * / 來代表加減乘除。
當(dāng)參與除(/)運(yùn)算的兩個(gè)操作數(shù)為整數(shù)時(shí)晶疼,表示整數(shù)除法酒贬,答案為整數(shù)。否則翠霍,表示浮點(diǎn)除法锭吨。
求余數(shù)可以用%
例如 10%3等于1,10%3.0等于1.0
注意:整數(shù)除以0將會(huì)產(chǎn)生一個(gè)異常寒匙,而浮點(diǎn)數(shù)除以0將會(huì)得到無窮大或NaN結(jié)果零如。
i++ 和 ++i 的 區(qū)別
- 如果只是看i++和++i躏将,這兩個(gè)是等價(jià)的,都等同于i=i+1考蕾,都是變量自身加1祸憋。
- 在一般情況下,它們都是跟賦值聯(lián)系在一起肖卧。
比如:
int a;
a=i++; //將i的值賦值給a蚯窥,即a=i;然后再執(zhí)行i=i+1塞帐;
也就是【a=i++;】與【a=i; i=i+1;】等價(jià)拦赠。
a=++i;//將i+1的值賦給a,即a=i+1;然后再執(zhí)行i=i+1;
也就是【a=++i;】與【a=i+1;i=i+1;】等價(jià)葵姥。
總結(jié)一下
- 前置++是將自身加1的值賦值給新變量荷鼠,同時(shí)自身也加1;
- 后置++是將自身的值賦給新變量榔幸,然后才自身加1.
關(guān)系運(yùn)算符
三元操作符
Condition? expression1: expression2
當(dāng)Condition為true時(shí)允乐,計(jì)算或返回第一個(gè)表達(dá)式expression1,如果為false,則計(jì)算第二個(gè)表達(dá)式expression2.
如 x <y ? x: y
返回x和y中較小的那個(gè)值牡辽。
數(shù)值類型之間的轉(zhuǎn)換
整型喳篇、實(shí)型(常量)、字符型數(shù)據(jù)可以混合運(yùn)算态辛。運(yùn)算中麸澜,不同類型的數(shù)據(jù)先轉(zhuǎn)化為同一類型,然后進(jìn)行運(yùn)算奏黑。轉(zhuǎn)換過程中可能導(dǎo)致溢出或損失精度
低----------------------------------------------------------高
byte, short, char—> int —> long—> float —> double
自動(dòng)類型轉(zhuǎn)換
必須滿足轉(zhuǎn)換前的數(shù)據(jù)類型的位數(shù)要低于轉(zhuǎn)換后的數(shù)據(jù)類型炊邦。
自動(dòng)轉(zhuǎn)換由低到高的順序轉(zhuǎn)換
int n = 123456789;
float f = n;//f值為1.234567892E8
當(dāng)使用上面兩個(gè)數(shù)值進(jìn)行二元操作時(shí)(例如 n+f , n是整數(shù),f是浮點(diǎn)數(shù))熟史,先要將兩個(gè)操作數(shù)轉(zhuǎn)換為同一種類型馁害,然后再進(jìn)行計(jì)算。
如果兩個(gè)操作數(shù)中有一個(gè)是double類型蹂匹,另一個(gè)操作數(shù)就會(huì)轉(zhuǎn)換為double類型碘菜;
否則,如果其中一個(gè)操作數(shù)是float類型限寞,另一個(gè)操作數(shù)將會(huì)轉(zhuǎn)換為float類型忍啸;
否則,如果其中一個(gè)操作數(shù)是long類型履植,另一個(gè)操作數(shù)將會(huì)轉(zhuǎn)換為long類型计雌。
否則,兩個(gè)操作數(shù)都將被轉(zhuǎn)換為int類型玫霎。
強(qiáng)制類型轉(zhuǎn)換
高的向低的順序轉(zhuǎn)換
double x = 3.94;
int y = (int) x;
x的結(jié)果為3凿滤,強(qiáng)制類型轉(zhuǎn)換通過截?cái)嘈?shù)部分將浮點(diǎn)值轉(zhuǎn)為整型妈橄。
如果想要四舍五入,得到最接近的整數(shù)翁脆【祢荆可以使用Math.round方法
double x = 3.14;
int y = (int) Math.round(x);
結(jié)果為 4,當(dāng)調(diào)用round時(shí)鹃祖,仍然需要使用強(qiáng)制類型轉(zhuǎn)換(int).其原理是因?yàn)閞ound方法返回的結(jié)果為long類型溪椎。由于存在信息丟失的可能性普舆,所以只有使用顯式的強(qiáng)制類型轉(zhuǎn)換才能夠?qū)ong類型轉(zhuǎn)換成int類型恬口。
不要在boolean類型與任何類型之間進(jìn)行強(qiáng)制類型轉(zhuǎn)換,這樣可以防止發(fā)生錯(cuò)誤沼侣。
運(yùn)算符優(yōu)先級(jí)
優(yōu)先級(jí) | 運(yùn)算符 | 簡介 | 結(jié)合性 |
---|---|---|---|
1 | [ ]祖能、 .、 ( ) | 方法調(diào)用蛾洛,屬性獲取 | 從左向右 |
2 | !养铸、~、 ++轧膘、 -- | 一元運(yùn)算符 | 從右向左 |
3 | * 钞螟、/ 、% | 乘谎碍、除鳞滨、取模(余數(shù)) | 從左向右 |
4 | + 、 - | 加減法 | 從左向右 |
5 | <<蟆淀、 >>拯啦、 >>> | 左位移、右位移熔任、無符號(hào)右移 | 從左向右 |
6 | < 褒链、<= 、>疑苔、 >=甫匹、 instanceof | 小于、小于等于惦费、大于兵迅、大于等于,對(duì)象類型判斷是否屬于同類型 | 從左向右 |
7 | == 趁餐、!= | 2個(gè)值是否相等喷兼,2個(gè)值是否不等于。 下面有詳細(xì)的解釋 | 從左向右 |
8 | & | 按位與 | 從左向右 |
9 | ^ | 按位異或 | 從左向右 |
10 | | | 按位或 | 從左向右 |
11 | && | 短路與 | 從左向右 |
12 | || | 短路或 | 從左向右 |
13 | ?: | 條件運(yùn)算符 | 從右向左 |
14 | =后雷、 += 季惯、-= 吠各、*= 、/=勉抓、 %=贾漏、 &=、 |=藕筋、 ^=纵散、 <、<= 隐圾、>伍掀、>= 、>>= | 混合賦值運(yùn)算符 | 從右向左 |
字符串
子串substring
String類的substring方法可以從一個(gè)較大的字符串提取出一個(gè)子串暇藏。
substring(a,b)
- a 表示開始的位置(從0開始計(jì)數(shù))
- b表示不想復(fù)制的第一個(gè)位置
例如
String greeting = "hello";
String s = greeting.substring(0,3);
// s = hel
//從0開始計(jì)數(shù)蜜笤,直到3位置,但是不包括3盐碱,所以返回 hel
substring的一個(gè)優(yōu)點(diǎn):容易計(jì)算子串的長度把兔,長度為b-a。
例如 hel的長度為 3-0=3
檢測(cè)字符串是否相等
可以使用equals來檢測(cè)兩個(gè)字符串是否相等瓮顽。
s.equals(t)
如何相等县好,會(huì)返回true,否則,返回false. s和t可以是字符串變量暖混,也可以是字符串常量缕贡。
eg: "hello".equals(greeting)
檢測(cè)是否相等,而且不區(qū)分大小寫儒恋,可以使用equalsIgnoreCase方法善绎。
eg: "hello".equalsIgnoreCase("HeLLO)
不能使用==運(yùn)算符來檢測(cè)兩個(gè)字符串是否相同,這個(gè)運(yùn)算符只能夠確定兩個(gè)字符串是否放置在同一個(gè)位置诫尽。
空串和Null串
空串是一個(gè)Java對(duì)象禀酱,有自己的串長度(0)和內(nèi)容(空)∧良担可以通過調(diào)用以下代碼檢查字符串是否為空剂跟。
if(str.length()==0)
或
if (str.equals(""))
null
表示目前沒有任何對(duì)象與該變量關(guān)聯(lián)『ㄔ澹可以通過調(diào)用以下代碼檢查字符串是否為null
if (str == null)
要檢測(cè)一個(gè)字符串既不是null也不是空串:
if (str != null && str.length()!=0)
length() 與 charAt()
length方法會(huì)返回采用UTF-16編碼表示的給定字符串所需的代碼單元數(shù)量曹洽。
想要得到實(shí)際的長度,即代碼點(diǎn)數(shù)量辽剧,可以調(diào)用
xxx.codePointCount(0,xxx.length())
調(diào)用s.chatAt(n)將返回位置n的代碼單元送淆,n介于0~ s.length()-1 之間。
eg:
String greeting = "Hello"
char first = greeting.charAt(0); // first is H
char last = greeting.charAt(4); // last is o
想得到i個(gè)的代碼點(diǎn)怕轿,可以使用
int index= greeting.offsetByCodePoints(0,i);
int cp = greeting.codePonintAt(index);
輸入輸出
讀取輸入
為了能夠讀取用戶在控制臺(tái)的輸入偷崩,首先需要?jiǎng)?chuàng)建一個(gè)Scanner對(duì)象辟拷,并與“標(biāo)準(zhǔn)輸入流”System.in關(guān)聯(lián)。
Scanner in = new Scanner (System.in)
- next()
讀取到輸入有效的字符才會(huì)結(jié)束輸入阐斜,對(duì)于輸入有效的字符之前的空白會(huì)自動(dòng)去掉衫冻,輸入有效的字符之后的空白作為分隔符或者結(jié)束符。next() 不能得到帶有空格的字符串谒出。 - nextLine()
以enter為結(jié)束符隅俘,nextLine()可以得到帶有空格的字符串,不會(huì)去掉空白笤喳,會(huì)全盤輸出为居。 - nextInt()
得到int類型的數(shù)據(jù)。nextDouble(),nextFloat()以此類推莉测。 - boolean hasNext()
檢測(cè)輸入中是否有還有其他單詞颜骤。
記得要import java.util.*;
import java.util.*;
public class Input_and_Output {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
System.out.print("what is your name :");
String name = in.nextLine();
System.out.print("age :");
int age = in.nextInt();
System.out.println("the name is " + name + ",the age is "+age);
}
//輸入結(jié)果:
//what is your name :jerry
//age :24
//the name is jerry,the age is 24
格式化輸出
System.out.print(X)會(huì)將以x對(duì)應(yīng)的數(shù)據(jù)類型所允許的最大非0數(shù)字位數(shù)打印輸出x
double x = 10000.0/3.0;
System.out.print(x); // x = 3333.3333333333335
為了能夠方便格式輸出結(jié)果唧喉,可以使用printf()捣卤。
double x = 10000.0/3.0;
System.out.printf("8.2f",x);
// x = 3333.33 使用8個(gè)字符的寬度和小數(shù)點(diǎn)后兩位字符的精度打印x
// 因?yàn)樾?shù)點(diǎn)后2位,為3333.33八孝。但是指定要8個(gè)字符的寬度董朝,所以左邊會(huì)補(bǔ)一個(gè)空格
// x結(jié)果為(1個(gè)空格)3333.33
用于printf的轉(zhuǎn)換符
轉(zhuǎn)換符 | 類型 | 舉例 |
---|---|---|
%s | 字符串類型 | "Hello" |
%c | 字符類型 | 'H' |
%b | 布爾類型 | true OR false |
%d | 整數(shù)類型(十進(jìn)制) | 10 |
%x | 整數(shù)類型(十六進(jìn)制) | 9f |
%o | 整數(shù)類型(八進(jìn)制) | 237 |
%f | 浮點(diǎn)類型 | 15.9 |
%a | 十六進(jìn)制浮點(diǎn)類型 | 0x1.fccdp3 |
%e | 指數(shù)類型 | 6.23e+24 |
%g | 通用浮點(diǎn)類型(f和e類型中較短的) | 42.5000 |
%h | 散列碼 | 42628b2 |
%% | 百分比類型 | % |
%n | 換行符 | 相當(dāng)于"\n"換行作用 |
%tx | 日期與時(shí)間類型(x代表不同的日期與時(shí)間轉(zhuǎn)換符) | 見博文下表 |
大數(shù)值
如果基本的整數(shù)和浮點(diǎn)數(shù)精度不夠滿足需求,那么可以使用java.math包中的兩個(gè)很有用的類:BigInteger和BigDecimal干跛。這兩個(gè)類可以處理包含任意長度數(shù)字序列的數(shù)值子姜。
- BigInteger 實(shí)現(xiàn)任意精度的整數(shù)運(yùn)算
- BigDecimal 實(shí)現(xiàn)任意精度的浮點(diǎn)數(shù)運(yùn)算
把普通的數(shù)值轉(zhuǎn)換成大數(shù)值,可以使用靜態(tài)的function valueOf() { [native code] }方法
BigInteger a = BigInteger.function valueOf() { [native code] }(100)
大數(shù)值的運(yùn)算不能使用常用的算術(shù)運(yùn)算符(如+楼入,*)處理哥捕,而是要使用大數(shù)值類中的add
和multiply
BigInteger c = a.add(b); // c=a+b
BigInteger d = c.multiply(b.add(BigInteger.function valueOf() { [native code] }(2))); // d = c*(b+2)
其他的運(yùn)算包括有 subtract(減)
,divide(除)
和mod(余數(shù))
數(shù)組
數(shù)組聲明
數(shù)組是一種數(shù)據(jù)結(jié)構(gòu)嘉熊,用來存儲(chǔ)同一類型值的集合
數(shù)組聲明方式:
int[] array 或者int array[]
數(shù)組初始化
int[] array = new int[100];
int[] arry = new int[]{1,2,3,4,5}
int[] array = {1,2,3,4,5}
創(chuàng)建一個(gè)數(shù)字?jǐn)?shù)組時(shí)遥赚,所有的元素都初始化為0。
boolean數(shù)組的元素會(huì)初始化為false
對(duì)象數(shù)組的元素會(huì)初始化為一個(gè)特殊值null
public class Array {
public static void main(String[] args) {
int[] test = new int[5];
for(int i =0;i<test.length;i++) {
System.out.println(test[i]);}
}
}
輸出的結(jié)果會(huì)是: 0 0 0 0 0
重要:
一旦創(chuàng)據(jù)數(shù)組阐肤,就不能再改變數(shù)組的大小凫佛。如果需要在運(yùn)行中擴(kuò)展數(shù)組的大小,則需要使用另一種數(shù)據(jù)結(jié)構(gòu)——數(shù)組列表(array list)
for each循環(huán)
Java有一種很強(qiáng)的循環(huán)結(jié)構(gòu)孕惜,可以用來依次處理數(shù)組中的每個(gè)元素而不必為指定下標(biāo)值而分心愧薛。
格式:
for(variable:collection) statement
定義一個(gè)變量用于暫存集合中的每一個(gè)元素,并執(zhí)行相應(yīng)的語句衫画。
collection這一集合表達(dá)式必須必須是一個(gè)數(shù)組或者是一個(gè)實(shí)現(xiàn)了Iterable接口的類對(duì)象(例如Arraylist)毫炉。
eg:
for(int element :a)
System.out.println(element)
//打印數(shù)組a的每一個(gè)元素,一個(gè)元素占一行
// for each element in a
數(shù)組拷貝
在java中削罩,允許將一個(gè)數(shù)組變量拷貝到給另一個(gè)數(shù)組變量瞄勾。這時(shí)遵馆,兩個(gè)變量將引用同一個(gè)數(shù)組
int[] a = {2,3,5,7,11,12};
int[] b = a;
a[5] = 12 // b[2] = 12
如果想將一個(gè)數(shù)組的所有值拷貝到一個(gè)新的數(shù)組去,使用Arrays類的copyTo方法丰榴。
int[] copieda = Arrays.copyTo(a,a.length);
第二個(gè)參數(shù)是新數(shù)組的長度货邓,可以通過這個(gè)方法來增加數(shù)組的大小。
eg: Arrays.copyTo(a,2*a.length);
增加到2倍大
如果數(shù)組元素是數(shù)字?jǐn)?shù)組時(shí)四濒,多余的元素都賦值為0换况。
如果數(shù)組元素是boolean數(shù)組,多余的元素會(huì)賦值為false
如果數(shù)組元素是對(duì)象數(shù)組的元素盗蟆,多余的元素賦值為特殊值null
如果長度小于原始數(shù)組的長度戈二,則只拷貝前面的數(shù)據(jù)元素