Java中字符串定义,初始化,赋值为null的区别
来源:互联网 发布:js promise的用法总结 编辑:程序博客网 时间:2024/05/22 10:48
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中字符串定义,初始化,赋值为null的区别
- 空字符串和赋值为null的区别
- 字符串的定义与赋值及初始化
- 声明,定义,赋值,初始化的区别
- java 字符串初始化=“” 和=null的区别
- java 字符串初始化=“” 和=null的区别
- Java字符串中“” , “ ”,和null的区别
- 指针指向空字符串和指针赋值为NULL的区别
- java中字符串初始化的区别
- 【Java】变量声明、定义、赋值与初始化区别
- 变量的定义、声明、赋值和初始化的区别
- c++中初始化和赋值的区别
- 字符串初始化与赋值区别
- java和c语言中数组定义初始化的区别
- 字符串常量指针在头文件中定义初始化与源文件中定义并初始化的区别
- 初始化、赋值的区别
- java中null与空字符串的区别
- (转)Java变量初始化赋值null
- Android 一起来看看知乎开源的图片选择库
- 增强版basedao java 反射和映射
- Android利用gradle同时编译多包(测试环境地址、生产环境地址)
- 工作日记2017.07.10 @Temporal作用
- Java压缩技术(七) TAR——Commons实现
- Java中字符串定义,初始化,赋值为null的区别
- PL/SQL Developer 下载
- java抽象类
- 嵌入式学习3(Linux常用shell命令下)
- 红光验证码
- POJ 1637 Sightseeing tour 混合路欧拉回路判断
- 关于字符串函数的一些代码实现(strncpy strncat strncmp strchr strrchr)
- Python使用request调用http接口使用说明
- UVa 10670