java中String比较问题
近日在工作中遇到一个关于String的问题,不大不小,但是查错的过程浪费了不少时间,以此文记录此问题所带出的对于java中String知识点的回顾。
出错的地方是一条判断语句,判断一个String对象是否为空(是否为null或“”),改之前的语句是这样写的,if(s=="" || s==null)。程序中赋值语句如下:s="";判断结果为true。但是实际中赋值的语句为s=new String();如此判断的结果就为false了,但是逻辑上判断结果同样为true才对,因此出错。
后来发现是判断语句出了问题,将判断语句改为:if(s==null || s.equals(""));或if(s==null || s.length()<=0);结果就正确了。在解决问题后才反应过来这应该是java中String的一些特性造成的。
java中有常量池技术,使声明两个对象String s=""和String t=""实际指向内存中同一地址,因此判断s==""和s==t都为true。但是如果是new出一个对象则结果就不同了,如声明String s = new String("");String t=""则s==""和s==t均为false。
知道了其原理,若要回避此问题,最好的方法是在判断两个字符串的值是否相等时使用.equals()方法进行判断,若判断为空则可使用.length()<=0方法来判断,在使用这两个方法前,不要忘了先对其是否是null进行判断以防出错。
随后又对java中String对象的特点进行了回顾,我主要关注的地方如下:
在java中String对象是不可变的,String类中每一个看起来会修改String的方法值的方法,实际上都是创建了一个全新的String对象,以包含修改后的字符串内容,而最初的String对象丝毫未动。
这就是我近日遇到的这个小问题的总结,新手上路,欢迎大家吐槽。
浙公网安备 33010602011771号