2015年12月31日

          地址:https://irusist.github.io


          !





          posted @ 2015-12-31 00:37 irusisit 閱讀(83) | 評論 (0)編輯 收藏

          2012年1月10日

              java虛擬機處理byte,short,char,int類型之間的“+”操作都是將他們轉化成int類型,壓入操作數棧,用int類型來做加法操作的,當java程序中有還有long,float,double中的一種時,會轉化成他們之中優先級最高的,優先級從long,float,double依次增高。boolean類型與上面所說的4種類型進行"+"運算,編譯報錯不通過。基礎類型與String以外的引用類型進行"+"操作時,編譯器報錯不通過。 當兩個非String的引用類型進行“+”操作時,編譯器會報錯不通過。
              當byte,short,int類型與String的引用類型進行“+”操作時,比如,在一個靜態方法里定義如下:
                     byte b = 127;
                  String str1 = "string";
                   String str = b + str1;  

             產生的字節碼為:

                   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
               可見,String對象的與byte進行“+”操作會先生成一個StringBuilder(jdk5以后,jdk5以前是StringBuffer)對象,將byte類型轉換為int類型傳入StringBuilder.append(int)的方法內,再將String對象傳入StringBuilder.append(String)方法內,最后調用這個StringBuilder對象的toString方法得到String對象。同理,short,boolean,long,float,double類型,引用類型與String對象進行“+”操作也是同樣處理,分別調用StringBuilder的不同參數的重載方法,不過char對象與short會有所不同,他不會轉換成int類型,而是直接將char類型的值傳遞給StringBuilder的append(char)的方法。

           

          posted @ 2012-01-10 22:35 irusisit 閱讀(199) | 評論 (0)編輯 收藏

          2012年1月7日

              昨天晚上公司年會,散了之后一個人走在大街上,想到了很多,來南京有9個月了,2012,新的一年又該何去何從呢。有時候理想和生活很難并行,在一個好的公司上班,有個好的領導,是最讓人期望的了,想起了剛來時面試的一道面試題。
              大概講的是一幅撲克牌,四種花色從A、2、到K,每種花色13張,一共52張,一開始每種花色的按順序擺放,然后進行洗牌:分成2半,將一半的第一張放到另一半的第一張下面,第2張放到另一半的第2張下面,直到一半的所有牌都放到另一半的下面,一次洗牌完成,問至少要洗多少次牌才能恢復成原來的順序。
              假設將這52張牌排好序,分別為1到52,則1到13為一個花色,14到26為一個花色,27到39一共花色,40到52為一個花色。假設洗牌之前牌的序號為i,經過一次洗牌過后,1到13序號的牌分到了1到25,則洗牌過后的序號為2i-1;14到26序號的牌被分到27到51,洗牌過后的序號為2(i-13) - 1 + 26;27到39的牌分到了2到26,洗牌過后的序號為2(i - 26) ;40到52序號的牌被分到28到52,洗牌過后的序號為 2(i - 39)  + 26。
              用代碼來表示就是
                  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);
              }
              在main方法里,用下面方式的num便是所要求的最小洗牌次數
                  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;
                  }
              
          posted @ 2012-01-07 22:29 irusisit 閱讀(143) | 評論 (0)編輯 收藏
          僅列出標題  
           
          主站蜘蛛池模板: 苗栗县| 山东省| 白沙| 文水县| 印江| 贵南县| 衢州市| 凤庆县| 扎赉特旗| 盈江县| 涿鹿县| 化隆| 宾阳县| 泌阳县| 大英县| 孟州市| 靖安县| 鄄城县| 莱州市| 出国| 格尔木市| 蓬溪县| 寿宁县| 尼勒克县| 平安县| 巩义市| 高阳县| 大田县| 马边| 青冈县| 汝阳县| 佛学| 九台市| 芒康县| 赤峰市| 西丰县| 姜堰市| 铁岭市| 伊金霍洛旗| 双桥区| 东明县|