关于String

来源:互联网 发布:气候数据 编辑:程序博客网 时间:2024/06/02 23:13

转自:http://hi.baidu.com/nemolfairy/blog/item/efb847f63e4528e57709d76b.html

今天看SqlAction中,发现了这么两行代码:

byte []buf = colName.getBytes();    String len = String.valueOf(buf.length);

其中,colName是String类型。当时我就在想为什么不直接用colName.length()呢?哦,对了,length()返回的整型,而上面的len是String类型的。原来,这儿String.valueOf是将int转化为String类型的。

那么这个参数与toString()方法有什么区别呢?

String.valueOf(Object)的基础是Object.toString()。但它与Object.toString()又有所不同。使用Object.toString()时需保证不为null。但采用String.valueOf(Object)时,将不用担心object是否为null值这一问题。为了便于说明问题,分析一下相关的源代码。Jdk里String.valueOf(Object)源码如下:  

     public static String valueOf(Object obj) {

        return (obj == null) ? "null" : obj.toString();
     }

从上面的源码可以很清晰的看出null值不用担心的理由。但是,这也恰恰有了隐患。应当注意到,当object为null时,String.valueOf(object)的值是字符串"null",而不是null 。在使用过程中切记要注意。试想一下,如果用


if(String.valueOf(object)==null)
{
       System.out.println("传入的值是null!");
}


这样的语句将可能会发生什么问题。再想一下,向控制台输出时,在视觉上如下语句在执行的结果上有什么不同:


System.out.println(String.valueOf(null));
System.out.println(null);


可以看到的输出将是一模一样的东西:null,但它们意义很明显是不一样的。

 

判断一个字符串为空

s为一个字符串,判断它为空的方法:
if(null==s ||"".equals(s)){
      ......
}

注意:这里的null==s和"".equals(s)不要写成s==null和s.equals(s),因为""这个值是已经确定的,预知的,而s是未知的,所以用得不小心的时候s.equals("")就会出现nullpoint异常。不一定的equals方法,包括其它很多处理,如果用确定的值处理问题会比未确定的处理少很多bug。

那么String.length()和String.getBytes().length有什么区别呢?

"ABCD".length() 结果是 4
"ABCD".getBytes().length 的结果也是4


不过如果换成中文就不一样了


"你好".length() 结果是 2
"你好".getBytes().length 的结果是4

还没完,需要补充,哈哈,看来小问题看出大文章来了,这与编码是有关系的,不是那么绝对的事情。

"张某某".getBytes("utf-8").length = 9
"张某某".getBytes("GBK").length = 6
"张某某".getBytes("ISO8859-1").length = 3
"张某某".getBytes().length = 6       //在windows中文版上运行
"张某某".getBytes().length = 3       //在SCO UNIX上运行

原创粉丝点击