java字符串连接操作符“+”之谜
1. 3+3=33?
2. char[] test = {'1','2','3'}; System.out.print("test"+test);输出test=123吗??
3. "hello world" 不等于"hello"+"world"???
4.“hello world" 也不等于”hello world“????
测试代码及结果如下:
解惑:
1.众所周知,+号除了有加法功能外,最多的就是被用来连接字符串了,那么这里的+号是用作什么功能呢?显然是用作连接字符串。那么System.out.println('3'+'3');呢?结果将会输出102(3的uicode值是51),这里+号用加法功能。 在java里我们要区别好字符串与字符类型的区别,局部相加并不等于整体。‘H’+‘i’ 不等于“hi”。
2. 这与char数组上调用toString方法有关,数组是从Object哪里继承了tostring方法而没有重载,在规范中描述道“返回一个字符串,它包含了该对象所属类的名字,”@“符号以及表示对象散列码的一个无符号十六进制整数”,所以就有了我们那个丑陋的输出了。要正确的输出字符序列,我们可以先调用String.valueOf(test)方法返回一个字符串对象再进行输出(把字符数组先转化为字符串)。当然我们还可以将System.out.println("test="+test);;分开两次来输出以达到目的效果,即:System.out.println("test=");System.out.println(test);
3.这与==符号有关,只有“==”两边的引用指向了同一个对象时结果才会返回true,一般情况下判断引用是否相等我们都推介使用equals方法。
4.这里与“+”号的优先级有关系,不管+号是用作加法还是用作连接字符串,它的优先级都要比“==”号要高,所以System.out.println("h1==h2?:"+h1==h2);等价于:System.out.println(("h1==h2?:"+h1)==h2);永远输出false。如果我们使用System.out.println("h1==h2?:"+h1.equals(h2));就会得到正确的结果了。可见用equals方法可以为我们除掉很多不必要的麻烦。
--例子参考自《java解惑》