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、正则表达式的”.“

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值