2012年1月7日
java虛擬機(jī)處理byte,short,char,int類型之間的“+”操作都是將他們轉(zhuǎn)化成int類型,壓入操作數(shù)棧,用int類型來(lái)做加法操作的,當(dāng)java程序中有還有l(wèi)ong,float,double中的一種時(shí),會(huì)轉(zhuǎn)化成他們之中優(yōu)先級(jí)最高的,優(yōu)先級(jí)從long,float,double依次增高。boolean類型與上面所說(shuō)的4種類型進(jìn)行"+"運(yùn)算,編譯報(bào)錯(cuò)不通過(guò)。基礎(chǔ)類型與String以外的引用類型進(jìn)行"+"操作時(shí),編譯器報(bào)錯(cuò)不通過(guò)。 當(dāng)兩個(gè)非String的引用類型進(jìn)行“+”操作時(shí),編譯器會(huì)報(bào)錯(cuò)不通過(guò)。
當(dāng)byte,short,int類型與String的引用類型進(jìn)行“+”操作時(shí),比如,在一個(gè)靜態(tài)方法里定義如下:
byte b = 127;
當(dāng)byte,short,int類型與String的引用類型進(jìn)行“+”操作時(shí),比如,在一個(gè)靜態(tài)方法里定義如下:
byte b = 127;
String str1 = "string";
String str = b + str1; 產(chǎn)生的字節(jié)碼為:
0: bipush 127
2: istore_1
3: ldc #2; //String string
5: astore_2
6: new #3; //class java/lang/StringBuilder
9: dup
10: invokespecial #4; //Method java/lang/StringBuilder."<init>":()V
13: iload_1
14: invokevirtual #5; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
17: aload_2
18: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
21: invokevirtual #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
24: astore_3
25: return
可見(jiàn),String對(duì)象的與byte進(jìn)行“+”操作會(huì)先生成一個(gè)StringBuilder(jdk5以后,jdk5以前是StringBuffer)對(duì)象,將byte類型轉(zhuǎn)換為int類型傳入StringBuilder.append(int)的方法內(nèi),再將String對(duì)象傳入StringBuilder.append(String)方法內(nèi),最后調(diào)用這個(gè)StringBuilder對(duì)象的toString方法得到String對(duì)象。同理,short,boolean,long,float,double類型,引用類型與String對(duì)象進(jìn)行“+”操作也是同樣處理,分別調(diào)用StringBuilder的不同參數(shù)的重載方法,不過(guò)char對(duì)象與short會(huì)有所不同,他不會(huì)轉(zhuǎn)換成int類型,而是直接將char類型的值傳遞給StringBuilder的append(char)的方法。
昨天晚上公司年會(huì),散了之后一個(gè)人走在大街上,想到了很多,來(lái)南京有9個(gè)月了,2012,新的一年又該何去何從呢。有時(shí)候理想和生活很難并行,在一個(gè)好的公司上班,有個(gè)好的領(lǐng)導(dǎo),是最讓人期望的了,想起了剛來(lái)時(shí)面試的一道面試題。
大概講的是一幅撲克牌,四種花色從A、2、到K,每種花色13張,一共52張,一開(kāi)始每種花色的按順序擺放,然后進(jìn)行洗牌:分成2半,將一半的第一張放到另一半的第一張下面,第2張放到另一半的第2張下面,直到一半的所有牌都放到另一半的下面,一次洗牌完成,問(wèn)至少要洗多少次牌才能恢復(fù)成原來(lái)的順序。
假設(shè)將這52張牌排好序,分別為1到52,則1到13為一個(gè)花色,14到26為一個(gè)花色,27到39一共花色,40到52為一個(gè)花色。假設(shè)洗牌之前牌的序號(hào)為i,經(jīng)過(guò)一次洗牌過(guò)后,1到13序號(hào)的牌分到了1到25,則洗牌過(guò)后的序號(hào)為2i-1;14到26序號(hào)的牌被分到27到51,洗牌過(guò)后的序號(hào)為2(i-13) - 1 + 26;27到39的牌分到了2到26,洗牌過(guò)后的序號(hào)為2(i - 26) ;40到52序號(hào)的牌被分到28到52,洗牌過(guò)后的序號(hào)為 2(i - 39) + 26。
用代碼來(lái)表示就是
public static List<Integer> nextResult(List<Integer> list){
for(int i=1;i<53;i++){
list.add(i);
}
// change num
int num = 0;
List<Integer> list1 = list;
while(true){
num++;
List<Integer> retList = nextResult(list1);
if(list.equals(retList)){
break;
}
list1 = retList;
}
大概講的是一幅撲克牌,四種花色從A、2、到K,每種花色13張,一共52張,一開(kāi)始每種花色的按順序擺放,然后進(jìn)行洗牌:分成2半,將一半的第一張放到另一半的第一張下面,第2張放到另一半的第2張下面,直到一半的所有牌都放到另一半的下面,一次洗牌完成,問(wèn)至少要洗多少次牌才能恢復(fù)成原來(lái)的順序。
假設(shè)將這52張牌排好序,分別為1到52,則1到13為一個(gè)花色,14到26為一個(gè)花色,27到39一共花色,40到52為一個(gè)花色。假設(shè)洗牌之前牌的序號(hào)為i,經(jīng)過(guò)一次洗牌過(guò)后,1到13序號(hào)的牌分到了1到25,則洗牌過(guò)后的序號(hào)為2i-1;14到26序號(hào)的牌被分到27到51,洗牌過(guò)后的序號(hào)為2(i-13) - 1 + 26;27到39的牌分到了2到26,洗牌過(guò)后的序號(hào)為2(i - 26) ;40到52序號(hào)的牌被分到28到52,洗牌過(guò)后的序號(hào)為 2(i - 39) + 26。
用代碼來(lái)表示就是
public static List<Integer> nextResult(List<Integer> list){
// return array
Integer[] retArray = new Integer[52];
// array index
int index = 0;
for(int i=1;i<list.size()+1;i++){
if(i<=13){
index = 2 * i -1;
} else if(i >13 && i <= 26){
index = 2 * (i-13) - 1 + 26;
}else if(i >26 && i <= 39){
index = (i - 26) * 2;
}else if(i >39 && i <= 52){
index = (i - 39) * 2 + 26;
}
retArray[index-1] = list.get(i-1);
}
return Arrays.asList(retArray);
}
Integer[] retArray = new Integer[52];
// array index
int index = 0;
for(int i=1;i<list.size()+1;i++){
if(i<=13){
index = 2 * i -1;
} else if(i >13 && i <= 26){
index = 2 * (i-13) - 1 + 26;
}else if(i >26 && i <= 39){
index = (i - 26) * 2;
}else if(i >39 && i <= 52){
index = (i - 39) * 2 + 26;
}
retArray[index-1] = list.get(i-1);
}
return Arrays.asList(retArray);
}
在main方法里,用下面方式的num便是所要求的最小洗牌次數(shù)
List<Integer> list = new ArrayList<Integer>();
List<Integer> list = new ArrayList<Integer>();
for(int i=1;i<53;i++){
list.add(i);
}
// change num
int num = 0;
List<Integer> list1 = list;
while(true){
num++;
List<Integer> retList = nextResult(list1);
if(list.equals(retList)){
break;
}
list1 = retList;
}