Java陷阱(二)
欢迎来到阿八个人博客网站。本 阿八个人博客 网站提供最新的站长新闻,各种互联网资讯。 喜欢本站的朋友可以收藏本站,或者加QQ:我们大家一起来交流技术! URL链接:https://www.abboke.com/xwzhj/2019/0611/378.html
文章目录

摘自《Java解惑》。这些问题都很经典,可以细细品味。
今天讲解的问题如下,最后的笑声、ABC、动物庄园、字符串奶酪。
最后的笑声
public class LastLaugh { public static void main(String[] args) { System.out.println("H"+"a"); System.out.println('H'+'a'); } }
分析
①将字符类型数值的操作数提升为int数值,从char数值到int的拓宽基本类型转换时将16位的char数值零扩展到32位的int。
②当且仅当+操作符的操作数中至少有一个是String类型时,才会执行字符串连接操作。否则,执行加法。
解决
方案一:预设一个空字符串(推荐)
System.out.println(""+'H'+'a');方案二:将一个数值用String.valueOf显式地转化成一个字符串
System.out.println(String.valueOf('H')+'a');方案三:使用字符串缓冲区(推荐)
StringBuffer sb = newStringBuffer(); sb.append('H'); sb.append('a'); System.out.println(sb.toString());方案四:JDK5.0,可以用printf方法
System.out.printf("%s"+'a','H');
ABC
public class Abc { public static void main(String[] args) { String letters = "ABC"; char[] numbers = {'1', '2', '3'}; System.out.println(letters+"easy as "+numbers.toString()); } }
建议
要将一个char数组转换成一个字符串,就要调用String.valueof(char[])方法
解决
方案一:
public class Abc2 { public static void main(String[] args) { String letters = "ABC"; char[] numbers = {'1', '2', '3'}; System.out.print(letters+"easy as "); System.out.println(numbers); } }方案二:
public class Abc3 { public static void main(String[] args) { String letters = "ABC"; char[] numbers = {'1', '2', '3'}; System.out.print(letters+"easy as "+String.valueOf(numbers)); } }
动物庄园
public class AnimalFarm { public static void main(String[] args){ String pig = "length: 10"; String dog = "length: " + pig.length(); System.out.println("Animalare equals:"+ pig == dog); } }
分析
这种用法错误,“+”的优先级比“==”高
建议
在使用字符串连接操作符时,总是将重要的操作数用括号括起来。在比较对象引用时,应该优先使用equals方法而不是==操作符
解决
方案一:在使用字符串连接操作符时,总是将重要的操作数用括号括起来。
System.out.println("Animal areequals:"+ (pig == dog));方案二:在比较对象引用时,应该优先使用equals方法而不是==操作符
System.out.println("Animal areequals:"+ pig.equals(dog));
字符串奶酪
public class StringCheese { public static void main(String[] args) { bytebytes[] = new byte[256]; for(int i = 0; i < 256; i++) bytes[i] = (byte)i; String str = new String(bytes); for(int i = 0, n = str.length(); i < n; i++) System.out.println((int)str.charAt(i)+ " "); } }
分析
这里的罪魁祸首就是String(byte[])构造器。有关它的规范描述道:“在通过解码使用平台缺省字符集的指定byte数组来构造一个新的String时,该新String的长度是字符集的一个函数,因此,它可能不等于byte数组的长度。当给定的所有字节在缺省字符集中并非全部有效时,这个构造器的行为是不确定的”[Java-API]。
建议
每当你要将一个byte序列转换成一个String时,你都在使用某一个字符集,不管你是否显式地指定了它。如果你想让你的程序的行为是可预知的,那么就请你在每次使用字符集时都明确地指定。
解决
public class StringCheese { public static void main(String[] args) throws Exception { byte bytes[] = new byte[256]; for(int i = 0; i < 256; i++) bytes[i] = (byte)i; String str = new String(bytes,"ISO-8859-1"); for(int i = 0, n = str.length(); i < n; i++) System.out.println((int)str.charAt(i)+ " "); } }