Java 语言中十大“坑爹”功能!
  
    
    
  
   
     
     
   int count = 
   
     
     
   1;
   
     
     
   
   
     
     
   switch(count){
   
     
     
   
    
   
     
     
   case 
   
     
     
   1:
   
     
     
   
        System.
   
     
     
   out.println(
   
     
     
   "one");
   
     
     
   
    
   
     
     
   case 
   
     
     
   2:
   
     
     
   
        System.
   
     
     
   out.println(
   
     
     
   "two");
   
     
     
   
    
   
     
     
   case 
   
     
     
   3:
   
     
     
   
        System.
   
     
     
   out.println(
   
     
     
   "three");
   
     
     
   
}
   
     
     
   
  
    
    
    
one
two
three
然而,这并不是我们想要的,或者说违反了我们的常识。满足了某种条件,当然就只需要执行这种条件下的逻辑即可,其他的case应该不予理会、直接跳过,象上面这段代码,只需要输出one就行了。当然,在每个case结尾处加上break就可以达到我们期望的效果。
  
    
    
  
   
     
     
   int 
   
     
     
   num = 
   
     
     
   1;
   
     
     
   
System.out.println(
   
     
     
   false && ((
   
     
     
   num++)==
   
     
     
   1));
   
     
     
   
System.out.println(
   
     
     
   num);
   
     
     
   
  
    
    
    
  
    
    
  
   
     
     
   int[] arr = 
   
     
     
   new 
   
     
     
   int[]{
   
     
     
   1,
   
     
     
   3,
   
     
     
   5,
   
     
     
   7,
   
     
     
   9};
   
     
     
   
   
     
     
   for(
   
     
     
   int i=
   
     
     
   0;i<arr.length;i++){
   
     
     
   
System.
   
     
     
   out.println(
   
     
     
   "the element is:"+arr[i]);
   
     
     
   
}
  
    
    
    
  
    
    
  
   
     
     
   String str = 
   
     
     
   "hello world";
   
     
     
   
System.
   
     
     
   out.println(str.charAt(
   
     
     
   1));
  
    
    
    
  
    
    
  
   
     
     
   public static void main(String[] args) {
   
     
     
   
   List<String> 
   
     
     
   list = 
   
     
     
   new ArrayList<String>();
   
     
     
   
   
   
     
     
   list.add(
   
     
     
   "abc");
   
     
     
   
   
   
     
     
   list.add(
   
     
     
   "bc");
   
     
     
   
   
   
     
     
   list.add(
   
     
     
   "bc");
   
     
     
   
   
   
     
     
   list.add(
   
     
     
   "abcd");
   
     
     
   
   
   
     
     
   list.add(
   
     
     
   "abcdef");
   
     
     
   
   
   
     
     
   //报错
   
     
     
   
   
   
     
     
   int length = 
   
     
     
   list.size();
   
     
     
   
   
   
     
     
   for(
   
     
     
   int i = 
   
     
     
   0;i < length;i++){
   
     
     
   
       
   
     
     
   if(
   
     
     
   list.get(i).equals(
   
     
     
   "bc")){
   
     
     
   
           
   
     
     
   list.remove(i);
   
     
     
   
       }
   
     
     
   
   }
   
     
     
   
}
  
    
    
    
  
    
    
  
   
     
     
   for(
   
     
     
   int i=
   
     
     
   0;i<
   
     
     
   list.size();i++){
   
     
     
   
   
   
     
     
   if(
   
     
     
   list.get(i).equals(
   
     
     
   "bc")){
   
     
     
   
       
   
     
     
   list.remove(i);
   
     
     
   
   }
   
     
     
   
}
  
    
    
    
  
    
    
  
   
     
     
   char symbol = 
   
     
     
   '8';
   
     
     
   
System.
   
     
     
   out.println((
   
     
     
   int) symbol);
   
     
     
   
  
    
    
    
  
    
    
  
   
     
     
   int i = 
   
     
     
   0;
   
     
     
   
   
     
     
   while(i++<
   
     
     
   3)
   
     
     
   
       System.
   
     
     
   out.print(
   
     
     
   "A");
   
     
     
   
       System.
   
     
     
   out.print(
   
     
     
   "B");
  
    
    
    
AAAB
而不是3个A、3个B,更“坑爹”的是,如果两条语句放在一行上,迷惑性会更大:
  
    
    
  
   
     
     
   int i = 
   
     
     
   0;
   
     
     
   
   
     
     
   while(i++<
   
     
     
   3)
   
     
     
   
       System.
   
     
     
   out.print(
   
     
     
   "A");System.
   
     
     
   out.print(
   
     
     
   "B");
  
    
    
    
  
    
    
  
   
     
     
   public static void main(String[] args){
   
     
     
   
   Integer a = 
   
     
     
   100;
   
     
     
   
   Integer b = 
   
     
     
   100;
   
     
     
   
   Integer c = 
   
     
     
   200;
   
     
     
   
   Integer d = 
   
     
     
   200;
   
     
     
   
   System.
   
     
     
   out.println(a==b);
   
     
     
   
   System.
   
     
     
   out.println(c==d);
   
     
     
   
}
   
     
     
   
  
    
    
    
true
false
这确实太出乎意料了,同样的代码,只是数值不同(而且差别不太大的样子),就产生了不一样的输出,这也太离谱了。原来,Integer中有一个静态内部类IntegerCache,在类加载的时候,它会把[-128, 127]之间的值缓存起来,而Integer a = 100这样的赋值方式,会首先调用Integer类中的静态valueOf方法,这个方法会尝试从缓存里取值,如果在这个范围之内就不用重新new一个对象了:
  
    
    
  
   
     
     
   public static Integer valueOf(int i) {
   
     
     
   
   
   
     
     
   if (i >= IntegerCache.low && i <= IntegerCache.high)
   
     
     
   
       
   
     
     
   return IntegerCache.cache[i + (-IntegerCache.low)];
   
     
     
   
   
   
     
     
   return 
   
     
     
   new Integer(i);
   
     
     
   
}
   
     
     
   
  
    
    
    
  
    
    
  
   
     
     
   int i = 
   
     
     
   1;
   
     
     
   
   
     
     
   while(i<
   
     
     
   4){
   
     
     
   
   System.
   
     
     
   out.println(i++);
   
     
     
   
}
   
     
     
   
  
    
    
    
  
    
    
  
   
     
     
   int i = 
   
     
     
   1;
   
     
     
   
   
     
     
   while(i<
   
     
     
   4);{
   
     
     
   
   System.
   
     
     
   out.println(i++);
   
     
     
   
}
   
     
     
   
  
    
    
    
  
    
    
  
   
     
     
   int i = 
   
     
     
   100;
   
     
     
   
i =+ 
   
     
     
   2;  
   
     
     
   //注意,加号在后面
   
     
     
   
System.
   
     
     
   out.println(i);
   
     
     
   
  
    
    
    
  
    
    
  
   
     
     
   public static void main(String[] args){
   
     
     
   
    
   
     
     
   // \u000d System.out.println("Hello World!");
   
     
     
   
}
   
     
     
   
  
    
    
    
热 文 推 荐
☞
