1、
问:null和""的区别
String s=null; s.trim()//会抛出空指针异常
String s=""; s.trim();//没有异常
答:
null代表声明了一个空对象,表示未申请任何内存资源,即声明了一个引用变量并初始化该引用,但是该引用并未指向任何对象。但可以把它作为参数传递或其它使用,不能调用他作为对象的方法,根本就不是一个字符串;
“”代表声明了一个对象实例,这个对象实例的值是一个长度为0的空字符串。该语句表示声明并引用到一个对象,只不过这个对象为0个字节。所以既然有了对象,就可以调用对象的方法;
“”代表一个字符串存在,它的值就是“”;
null代表字符串根本没有实际的值,并不知道它是什么。
2、
问:
String s; String s=null; String s="a";
有什么区别?针对这三种情况,使用out.println(s)的时候,第一个会出现异常,第二个会输出null,第三个则会输出a。
答:
第一个语句只是声明了一个引用变量,但是并没有初始化引用,所以对变量s的任何操作(除了初始化赋值外)都将引发异常;
第二个和第三个都定义了String类型变量s,并赋予它初值,只不过第二个赋予的值为null(空)。
3、
问:
String s="a"; String s=new String("a");
有什么区别?
答:
本质上的区别,前者是在字符串池里写入一个字符'a',然后用s指向它;后者是在堆上创建一个内容为“a”的空字符窜对象。
String str="aaa";//于栈上分配内存 String str=new String("aaa");//于堆上分配内存
4、
问:
声明了一个String a;在以后的判断中a==“”和a==null有何不同?
答:null是用来判断引用类型是否分配了存储空间,“”是针对字符串。在实际处理时,往往认为“”和null代表相同的含义,即都代表无值。
建议使用语法:
if(a==null||a==""){ }
5、
问:
String abc=null; String abc=""; String abc;
三种写法有什么区别?
答:
1、创建一个空字符串对象;
2、创建一个字符串为空的字符串对象;
3、声明一个字符串对象,但并没有分配内存,而1,2已经分配了内存
对于最后一种表示,不能if(abc==null),或者int length=abc.length();编译的时候会提示可能没有进行初始化;
6、
问:
String abc=null; String abc; String a=""; String b=""; String b=""; String c=new String(""); String d=new String("");
答:
1等于2,和c语言不同,Java因为安全原因不允许一个悬挂引用,没有赋值的引用地址一律自动赋值为null,以防止访问到任意内存;
3和4中,变量a和变量b将会指向同一内存地址(“”的地址);
5和6中,变量c和d不会指向同一个地址,而是两个“”内容的地址,并且和a,b不同;
String类维护着一个字符串池,对于3和4这样的赋值方法,String会在这个池中查找字符串是否已经在池中,如果在,就直接指向该地址;
如果不在,生成一个实例放入池中再指向那个地址,可见对于同样的内容的字符串多次引用3和4的方法要比5和6的方法省内存,之所以这样做,是因为String是一个内容不可变的量,运用的是设计模式GOF.FLYWeight
7、
问:
String s;在什么情况下可以等同于String s=null;而在什么情况下又不等同?
答:
public class StringTest{ static String s;//* public static void main(String[] args){ //String s;//** System.out.println(s); } }
编译并运行上面的代码,将打印null;
可见标有*号是自动初始化了的(s将被自动初始化为null);
而如果把标有**号的行取消注释,代码将不能通过编译,这是因为这行定义的是本地变量,而本地变量是不会自动进行初始化的;
由此得出结论:
在成员变量的定义中,String s;等同于String s=null;
而在本地变量(方法变量)的定义中,Strings;不等同于String s=null;这时要使用s必须显示的赋值。
只要是在方法中定义比那里都要显示赋初值,main()方法也不例外,而在方法之外编译器会自动赋初值。