首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Java解惑之字符谜题(二)

2012-09-13 
Java解惑之字符谜题(2)11、字符相加System.out.println(H + a)System.out.println(H + a)? ? ?

Java解惑之字符谜题(2)

11、字符相加

System.out.println("H" + "a");System.out.println('H' + 'a');

? ? ? 上面两行代码打印出来的结果是不同的,第一行的结果是Ha,第二行的结果是169。这个很明显吧,'H'和'a'都是char类型的字面常量,char类型不能相加,会自动转换为int类型进行计算。

????? 如果需要对字符进行字符串拼接,有以下几种方法:

????? (1) 在前面预置一个空字符串,例如:"" + 'H' + 'a';

????? (2) 将第一个操作数用String.valueOf显示转换成一个字符串,例如:String.valueOf('H') + 'a';

????? (3) 使用StringBuffer或StringBuilder,例如:

StringBuffer buffer = new StringBuffer();buffer.append('H');buffer.append('a');

????? (4) 如果使用jdk5.0或更高版本,可以用printf方法,例如:System.out.printf("%c%c", 'H', 'a')。

?

12、字符串数组的输出

char[] numbers = {'1', '2', '3'};System.out.println("Hi~ " + numbers);输出结果:Hi~ [C@6bbc4459

????? 是不是很丑?数组没有重写父类的toString()方法,是继承自Object的,于是这个输出就变成这个样子了:“[”表示数组,“C”表示char,“@”后面那一串是该对象在内存中的地址。

????? 但是,有些常用的函数会有char[]的重载版本,System.out.println(numbers)将会输出123。

?

13、字符串相等

????? 字符串赋值有以下几种情况:

??????? String s1= "one";
??? ??? String s2= s1;
??? ??? String s3= new String("one");
??? ??? String s4= "on";
??? ??? String s5= "e";
??? ??? String s6= s4+ s5;

??????? String s7 = "on" + "e";

????? 其中,s1、s2、s7是相等的,它们都是直接指向String池里的“one”,s3和s7则不同,s3指向堆栈中的对象,这个对象存的是String池中“one”的地址,s6也指向堆栈中的对象,但是是一个新的对象,与s3指向的对象不是同一个,同样,这个对象保存的也是String池中的“one”的地址。

????? 判断字符串相等时应优先使用equals函数,“==”比较的是对象的标示而不是对象的值。

?

14、转义字符

????? System.out.println("a\u0022.length()+\u0022b".length());

????? 这行代码将输出什么?首先我们需要确认\u0022代表什么,这个转义字符是双引号,因此它等价于"a".length()+"b".length(),这样看就清楚了,结果是2。

????? 一般情况下,请不要在程序中用转义字符,很容易混淆,而且很难记住每个转义字符代表什么...

?

15、非法的转义字符

????? 我们直接看下面这段注释:

????? /**

?????? * from F:\TestRoot\apps\a1\units\include

?????? */

????? 程序中的这段注释会报错!注释也会报错?是的,这个错误是Invalid unicode,问题出在”\units“,它被认为是一个非法的转义字符。因此,所有的“\u”都需要注意,要确保它不出现在一个合法的Unicode转义字符上下文之外,即使在注释中也是如此。

?

16、注释中的行分隔符

????? 依旧是注释中的问题,来看下面的代码:

?????? // Note: \u000A is Unicode representation of linefeed(LF)

?????? char c = 0x000A;

????? 上面的代码在注释那一行报错了!问题出在”\u000A“是换行符,因此”//“其实只限定到”Note: “,后面的字符串就是下一行的了。这种行为是平台无关的,在任何平台上都不能编译通过。

?

17、还是转义字符

????? 天哪,能不能不要讲转义字符了,真的好丑!呃,直接上结论吧,如非必须,不要使用转义字符!

?

18、字符串奶酪

?

19、多行注释

????? 多行注释遇到第一个”*/“就表示注释块结束,如下:

??????? /* if ("+-*/" >= 0)" +
??? ??? ??? ??? return 0;
??? ??? */

????? 在第一行”*/“的地方注释块就结束了,真不安全啊!遇到嵌套的多行注释就更容易出问题了,最外层的”/*“遇到第一个”*/“就结束注释了。因此,最好还是使用单行注释”//“。

?

20、正则表达式的”.“

?

?

?

?

热点排行