懒人要学java了(一)
欢迎技术交流。 QQ:138986722
懒人要学java了(一)
突然感觉周末挺无聊的、给自己找点事情做吧、翻开了老早以前就买但是一直没有看的书、java核心技术卷。刚刚看了没几页就在里面找到了很多共鸣、在这里记录下来吧!在书中变量初始化小节提到:声明一个变量之后、必须用赋值语句对变量进行显式初始化、千万不要使用未被初始化的变量。
看到这个想起了前几天一个校友(兼以前的同事)问我的一个问题
null!=a 跟 a !=null ""!=a 跟a!=""有什么区别!
这个问题、老早以前在论坛那是有过争论的、哎哟喂、那口水喷得哟、在这里我只说个人见解、有错误希望大家指出来、千万别喷我、我天生就怕这个!
首先变量未被初始化就拿来使用是不对的!就上面的问题、我们看一段代码!
String a; System.out.println(a); if(null==a){ System.out.println("a的值为null"); }这样编译无法通过的。
String a = "", b = null ; System.out.println(a); if(null==b){ System.out.println("a的值为null"); } if(b==null){ System.out.println("a的值为null"); } if(a==""){ System.out.println("a的值为空"); } if(""==a){ System.out.println("a的值为空"); }这样运行半点错误没有、而且两个if都能正确的进入并且输出。
为什么会有""在前变量在后的这种写法呢、据说是c/c++流传下来的、因为在c/c++中if(a="")也能编译通过、很多时候大家一不小心就很可能会少写那么一个=号。所以便有了把""放在前面的那么一个习惯。
所以我们在java中随便你怎么写都行。
当然如果你这样做的时候就得考虑下了!
String a = null; if(a.equals("")){ System.out.println("a的值为空"); }这个时候你会收到一个销魂的NullPointerException异常!
先来看看equals方法、它用来比较字符串是否相等、如果直接等于(==)判断那么(==)判断的是目标地址是否相等、而不是两个字符是否一样。看下面的代码:
String str1 = "胡汉三很懒"; String str2 = "胡汉三很懒"; System.out.println(str1==str2); System.out.println(str1.equals(str2));这样的结果都是true。
为什么呢、因为str1跟str2的目标地址是一样的。在核心技术卷一中、不可变字符串小节有讲到:"编译器可以让字符串共享、为了弄清具体的工作方式,可以想像将各种字符串存放在公共的存储池中。字符串变量指向存储池中相应的位置。如果复制一个字符串变量,原始字符串与复制的字符串共享相同的字符。"。但是很多时候我们总是人为的new一个新的字符、人为hold住了java字符串的共享机制。
如下面一段代码:
String str1 = "胡汉三很懒"; String str2 = new String("胡汉三很懒"); System.out.println(str1==str2); System.out.println(str1.equals(str2));这样过后、str1=str2终于false了。因为他们不在共享存储池中存放字符地址了!new关键字给str2对象开辟了另一个存储空间。从而使目标地址不在一致。
所以便有了在java中比较字符串是否相等得用equals方法的编程习惯。因为有时候、很多时候我们使用的字符串的目标地址都是不一致的。
让我们在回到刚刚的null==a的问题。通常我们验证字符是否为空的时候都要这样做!
if(a!=null&&!a.equals("")){ //... }这样即时a真的等于null了、销魂的NullPointerException也是不会抛出来!
||和&&是按照"短路"方式求值的。如果第一个操作数已经能够确定表达式的值、第二个操作数就不必计算了。
如果用&&对两个表达式进行计算:a!=null && !a.equals("") 如果第一个个表达式值为false、结果不可能为真、因此第二个表达式就没有必要计算了。
与之类似的是、a==null || a.equals("") 当第一个表达式为true时、结果自动为true、不必在计算第二部分。
这样在前面加上a!=null就可以避免直接使用equals方法时、对象为空、造成的NullPointerException。
讲了一大堆、主要是想说、在java中验证字符串非空时、先要验证a!=null、在用!a.equals("")!
如果你想直接使用equals()方法、就可以用""在前面了。
String a = null; if("".equals(a)){ System.out.println("a的值为空"); }这样销魂的NullPointerException也不会出来了......
呀哟、饿了、吃饭去......