2012年1月7日

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


!





posted @ 2015-12-31 00:37 irusisit 阅读(78) | 评论 (0)编辑 收藏
 
    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 阅读(193) | 评论 (0)编辑 收藏
 
    昨天晚上公司年会,散了之后一个人走在大街上,想到了很多,来南京有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 阅读(139) | 评论 (0)编辑 收藏