String s;和String s=null;和String s=“a”和String s=""的区别

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()方法也不例外,而在方法之外编译器会自动赋初值。



猜你喜欢

转载自blog.csdn.net/weixin_39324977/article/details/80038951