Java中字符串定义,初始化,赋值为null的区别

原创 2017年07月10日 17:12:01




1、概述:

字符串定义 只定义不分配内存空间,不做任何操作;

字符串初始化 两种方式直接等号赋值,用new初始化,直接等号赋值放入内存池,其它变量也可以引用;new初始化分配内存空间,不可引用;

字符串赋值为null 初始化了,并且有了引用,但是没有指向任何内存空间;

2、详解:

String s;和String s=null;和String s="a";有什么区别?


第一个只是定义了一个String类型变量s,并没有给它赋初值,在Java中,默认在使用一个变量的时候必须赋予它初值(降低风险)。 
第二个和第三个都定义了String类型变量s,并赋予它初值,只不过第二个赋予的值为null(空)罢了


主要要理解的是
String s; s为一个引用~~它不是对象   


第一个是没有初始化的引用;   
第二个为空引用;
第三个是在字符串池里写入一个字符'a',然后用s指向它。


String s;只是给s分配一个内存空间   
String s=null;是分配的空间中存储的值为空值   
String s="a";这句就不用我多说了分配的空间的值为字符a


特别关注:String s="a"和String s=new String("a");是有本质上的区别的 
  
前者是在字符串池里写入一个字符'a',然后用s指向它;
后者是在堆上创建一个内容为"a"的字符串对象。

1、双引号的方式
String x = abcd;
String y = abcd;
         
System.out.println(x==y);//true
System.out.println(x.equals(y));//true

上面的输出结果:
x==y 的结果为true 是因为通过双引号赋值的方式之后,x 和 y 都是指向同一个内存地址,他们的引用都是指向方法区中的同一个内容,引用地址是一样的, 当同一个String字面值无论被创建多少次,始终只有一个内存地址被分配,之后的都是这个String的拷贝,Java中称作“字符串驻留”,所有的字符串常量在编译之后都会自动的驻留。x = abcd这种方式创建的时候首先会查看字符串池中是否已经存在,存在就直接返回PermGen中的该String对象,否则就会创建一个新的String对象,之后再放进字符串池中。

JVM里,考虑到垃圾回收(Garbage Collection)的方便,将 heap 划分为三部分: young generation (新生代)、 tenured generation(old generation)(旧生代)和 permanent generation( permgen )(永久代)


字符串池是为了解决字符串重复的问题,生命周期长,它存在于 permgen 中。

编译 Java 源代码时,源文件中出现的双引号内的字符串都被收纳到常量池中,用 CONSTANT_utf8_info 项存储着。

JVM 中,相应的类被加载运行后,常量池对应的映射到 JVM 的运行时常量池中。其中每项 CONSTANT_utf8_info(也就试记录那些字符串的)都会在常量引用解析时,自动生成相应的 internal String,记录在字符串池中。

2、构造器的方式
String a = new String(abcd);
String b = new String(abcd);
         
System.out.println(a==b);//false
System.out.println(a.equals(b));//true

上面代码运行结果:

a==b 为false 是因为通过new 构造器的方法创建之后,在heap堆中分别分配了两个内存地址。a 和 b 分别指向了堆中的两个不同的对象,不同的对象就会有不同的地址分配。

下面这张图就很好的阐述了上面的两种情况:



 


版权声明:本文为博主原创文章,未经博主允许不得转载。

java字符串数组初始化和赋值

//一维数组 String[] str = new String[5]; //创建一个长度为5的String(字符串)型的一维数组 String[] str = new String[]{"","...
  • u012056417
  • u012056417
  • 2017年01月08日 21:32
  • 1854

java字符串数组初始化和赋值

//一维数组 String[] str = new String[5]; //创建一个长度为5的String(字符串)型的一维数组 String[] str = new String[]{"","...
  • u013337743
  • u013337743
  • 2015年04月20日 23:20
  • 54012

Java中String类通过new创建和直接赋值字符串的区别

方式一:String a = “aaa” ;方式二:String b = new String(“aaa”); 两种方式都能创建字符串对象,但方式一要比方式二更优。 因为字符串是保存在常量池中的,而通...
  • a986410589
  • a986410589
  • 2016年09月06日 22:39
  • 3867

java_String类的对象的两种赋值方式

a) String类的对象的两种赋值方式  b) 为什么String类的对象可以直接赋值 a) 1 类似普通对象,通过new创建字符串对象。String str = new String("Hel...
  • feicongcong
  • feicongcong
  • 2017年01月08日 18:19
  • 1322

JAVA中创建字符串的两种方式的区别

JAVA中创建字符串的两种方式的区别,通常在Java中创建一个字符串会有两种方式,通过双引号直接赋值和通过构造器来创建。建议在平时的应用中,应尽量使用String x = "abcd"这种方式来创建字...
  • hu1991die
  • hu1991die
  • 2014年12月17日 18:52
  • 2765

java字符串声明

一切从String str = new String("abc")说起...     这行代码形式上很简单,其实很复杂。有一个常见的Java笔试题就是问上面这行代码创建了几个String对象。  ...
  • Joe_study
  • Joe_study
  • 2014年10月28日 19:16
  • 1477

java基础:为什么有的对象只声明不初始化不会报错?

最近在学习多线程,在学习过程中遇到一个与Java基础相关的问题,如下有注释的那行,为什么对象只声明不初始化不会报错? public class PrintNumber { public int i...
  • aspkhdp
  • aspkhdp
  • 2015年07月24日 11:09
  • 740

Java声明变量并赋值

1.声明变量a并赋值,判断a是正数(if语句) public class A{ public static void main(String[] args){ int a =3;   if(a>0){...
  • SuperCreators
  • SuperCreators
  • 2017年06月22日 20:32
  • 324

Java—String的两种赋值方式及区别

1、String s ="abc"(采用字面值方式赋值) (1)查找String Pool中是否存在“abc”这个对象,如果不存在,则在StringPool 中创建一个“abc”对象,然后将Stri...
  • u011528390
  • u011528390
  • 2015年02月12日 13:57
  • 1259

Java中String直接赋值和使用new的区别

String str1 = "ABC";String str2 = new String("ABC");String str1 = “ABC”;可能创建一个或者不创建对象,如果”ABC”这个字符串在j...
  • OREO_GO
  • OREO_GO
  • 2016年05月13日 19:39
  • 11254
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java中字符串定义,初始化,赋值为null的区别
举报原因:
原因补充:

(最多只允许输入30个字)