i=0蔓挖;
i= i++ 呕缭;
結(jié)果i=0
因?yàn)橄纫贸夥希笥嬎?br> java使用中間變量緩存機(jī)制
i=i++可以分為幾步:1. temp = i (等號右邊的i)
- i=i+1(等號右邊的i) 3. i=temp (等號左邊的i)
java的字符類采用的Unicode編碼方案饱亿,每個Unicode碼占用16個位蚜退,2個字節(jié)
類初始化過程:
1.初始化父類中的靜態(tài)變量和靜態(tài)代碼塊
2.初始化子類中的靜態(tài)變量和靜態(tài)代碼塊
3.初始化父類中的普通成員變量,再執(zhí)行構(gòu)造器
4.初始化子類中的普通成員變量彪笼,再執(zhí)行構(gòu)造器
instance是java的二元運(yùn)算符钻注,用來判斷他左邊的對象是否為右邊類(接口,抽象類配猫,父類)的實(shí)例
父類沒有無參的構(gòu)造函數(shù)幅恋,子類要顯示調(diào)用父類的構(gòu)造函數(shù)
數(shù)據(jù)轉(zhuǎn)換:
java表達(dá)式轉(zhuǎn)型規(guī)則是由低到高轉(zhuǎn)換,不同類型優(yōu)先關(guān)系如下(低->高):
byte,short,int->long-float->double
低到高會自動轉(zhuǎn)換章姓,高到低需要強(qiáng)制轉(zhuǎn)換
方法重載和覆蓋:重載是在同一個類內(nèi)佳遣,方法名相同參數(shù)列表不同识埋,其他隨便凡伊。 覆蓋是子類重寫父類方法的具體內(nèi)容。
finally中代碼會在try和catch的return之前執(zhí)行窒舟,如果有return則覆蓋系忙。
值傳遞和引用傳遞
Java概念中是沒有指針的,只存在值傳遞惠豺。當(dāng)形參是對象(數(shù)組银还,類)的時候,看起來是引用傳遞洁墙,但是蛹疯,傳入的值是對象引用的copy,即是引用的地址热监,所以仍是值傳遞捺弦,傳遞的都是地址的值。
參數(shù)存放規(guī)則和內(nèi)存
字符串存放在常量池中,對象(數(shù)組列吼,類)存放在堆中幽崩,普通變量存放在棧中。
在函數(shù)中定義的一些基本類型的變量和對象的引用變量都是在函數(shù)的棧內(nèi)存中分配寞钥。當(dāng)在一段代碼塊中定義一個變量時慌申,java就在棧中為這個變量分配內(nèi)存空間,當(dāng)超過變量的作用域后理郑,java會自動釋放掉為該變量分配的內(nèi)存空間蹄溉,該內(nèi)存空間可以立刻被另作他用。
堆內(nèi)存用于存放由new創(chuàng)建的對象和數(shù)組您炉。在堆中分配的內(nèi)存类缤,由java虛擬機(jī)自動垃圾回收器來管理。在堆中產(chǎn)生了一個數(shù)組或者對象后邻吭,還可以在棧中定義一個特殊的變量餐弱,這個變量的取值等于數(shù)組或者對象在堆內(nèi)存中的首地址,在棧中的這個特殊的變量就變成了數(shù)組或者對象的引用變量囱晴,以后就可以在程序中使用棧內(nèi)存中的引用變量來訪問堆中的數(shù)組或者對象膏蚓,引用變量相當(dāng)于為數(shù)組或者對象起的一個別名,或者代號畸写。
標(biāo)識符定義規(guī)則
不能數(shù)字開頭驮瞧,不能中間有空格,不能有*號
類型轉(zhuǎn)換規(guī)則
1.若類型不一致枯芬,則先轉(zhuǎn)換為同類型论笔,再計算。
2.轉(zhuǎn)換按數(shù)據(jù)長度決定千所,保證精度不會降低狂魔。
3.所有的浮點(diǎn)運(yùn)算都是以雙進(jìn)度執(zhí)行的,單精度的float也要先轉(zhuǎn)為double
4.char,byte,short參與運(yùn)算淫痰,先轉(zhuǎn)為int
5.賦值運(yùn)算中最楷,若等號兩邊類型不同時,需要把右邊表達(dá)式的類型轉(zhuǎn)為左邊的類型待错。如果右邊類型比左邊大籽孙,會降低精度,且需要顯示轉(zhuǎn)換火俄。
線程安全的集合
vector : 類似于ArrayList的數(shù)組犯建,效率低,多了個同步化機(jī)制瓜客,安全适瓦。
HashTable : 比HashMap多一個線程安全機(jī)制
Stack:棧沟启,后進(jìn)先出,繼承了vector犹菇,所以安全德迹。
enum:枚舉,相當(dāng)于迭代器揭芍。
ConcurrentHashMap:利用了加鎖機(jī)制保證線程安全胳搞。
Volatile
用Volatile修飾的變量并不保證原子性,它的意思是每次從內(nèi)存中取值称杨。一旦這個變量被某個線程修改肌毅,對其他線程都是透明可見的,保證了取到最新的值姑原。
String,StringBuffer,StringBuilder
String類中悬而,用字符數(shù)組保存字符串,用final修飾锭汛,所以是不可變的
private final char value[];
StringBuffer和StringBuilder都是繼承的AbstractStringBuilder類
char value[]
字符內(nèi)容是可以變的笨奠。
StringBuffer對方法加了同步鎖,是線程安全的唤殴,它建立了一塊字符串內(nèi)存緩沖區(qū)般婆,效率比String + 要高。
StringBuilder沒有鎖朵逝,線程不安全配名。
StringBuilder效率最高渠脉,因?yàn)樗赼ppend的時候會調(diào)用System.arrayCopy没陡,這個方法效率很高索赏。
2個String = "123" 相等的問題贴彼。
String str1 = "123" ;
String str2 = "123" ;
Sout(str1 == str2 );
TRUE
在常量區(qū)中創(chuàng)建了一個常量"123",代碼中又一個str2="123"融涣。此時先判斷常量區(qū)中是否存在"123"的字符串威鹿,如果存在幼东,則直接返回該數(shù)據(jù)的地址;沒有則創(chuàng)建一個简逮,其他基本類型變量(int boolean double byte等)也是一樣。
HashMap和HashTable和conCurrentMap
HashMap:線程不安全尿赚,允許有null的鍵和值督赤,有containsValue方法和containKey方法性雄,效率較高是HashTable的輕量級實(shí)現(xiàn)约计。
HashTable:線程安全,不允許有null的鍵值,只有contain方法。
conCurrentHashMap是jdk1.5中conCurrent包中的類这橙,線程安全屈扎,但并不是所有方法都有synchronized同步的并村,它提供了一個"分段鎖"的概念,它把一個Map分成n個Segment荚孵,在操作的時候妹窖,通過hashcode()去尋找key位于哪個segment中,這樣的好處是效率大大提升了收叶。
equals()和hashcode()
equals的默認(rèn)實(shí)現(xiàn)方式是 return this == obj 骄呼;代表引用同一個對象。
hashcode()是返回對象的一個int型的散列碼判没,散列碼是為了更好的支持Java中的集合蜓萄,返回的實(shí)際上是一個地址數(shù)值。
重寫equals()也必須重寫hashcode()澄峰。
hashcode使用:在集合(set)中嫉沽,添加一個新元素,先調(diào)用這個元素的hashcode方法俏竞,得到散列碼绸硕,通過散列碼找到它應(yīng)該放到的位置上,如果這個位置沒有元素魂毁,則直接存儲玻佩;如果有元素,則調(diào)用equals()方法比較是否相同漱牵,不相同則散列到其他地址存儲夺蛇。
public,protected酣胀,private刁赦,default(friendly)
包裝類和基本類型
int--Integer double-Double byte-Byte char-Charcter
long-Long float - Float 。
自動拆箱:包裝類在跟基本類型計算或比較時闻镶,系統(tǒng)會自動轉(zhuǎn)換甚脉。
Collections,collection區(qū)別
Collection是java.util包中的一個接口類 铆农。 Collections的java.util包中的一個工具類牺氨,提供了一些靜態(tài)方法,比如集合的搜索墩剖,排序猴凹。
序列化
序列化是一種處理對象流,對象流就是將對象的內(nèi)容進(jìn)行流化岭皂〗荐可以對流化后的對象進(jìn)行讀寫操作,也可以將流化后的對象爷绘,傳輸于網(wǎng)絡(luò)之間书劝。序列化是為了解決對象流在讀寫時候出現(xiàn)的問題。
實(shí)現(xiàn):需要序列化的對象土至,類要實(shí)現(xiàn)Serializable接口购对。Serializable是標(biāo)注該對象可以被序列化,通過ObjectOutputStream實(shí)現(xiàn)對象的傳輸和讀寫操作陶因。
字符串操作
indexOf(String s):字符查找骡苞,返回首次查找到的字符位置。
lastIndexOf(String s):字符查找楷扬,返回最后一次查找找的字符位置解幽。
charAt(int index):查找位置,返回指定位置的字符毅否。
subString(int beginIndex):截取字符串亚铁,從beginIndex位置開始截取
subString(int begin,int end):截取字符串,從begin截取到end螟加。
trim():忽略字符串前置和后置空格徘溢,生成一個副本。
replace(String before,String new):將字符串內(nèi)before的內(nèi)容替換為new
startsWith(String s):判斷字符串是否以s字符串開頭捆探。
endsWith(String s):判斷字符串是否以s字符串結(jié)尾然爆。
toLowerCase():字符串中大寫字母轉(zhuǎn)小寫,生成副本黍图。
toUpperCase():字符串小寫字母轉(zhuǎn)大寫曾雕,生成副本。
split(String str):字符串分割助被,生成String數(shù)組剖张。