博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java:String
阅读量:6690 次
发布时间:2019-06-25

本文共 1076 字,大约阅读时间需要 3 分钟。

String类是final类,它内部的方法也默认被final修饰,不能重写.

字符串常量池

当这样声明一个字符串

String str = "hello java";

JVM会检测字符串常量池中是否存在这个值的字符串,如果存在,就直接赋值给str,否则创建一个新的,再赋值给str.

当连续用同样的方式声明两个字符串并作比较

String str1 = "hellojava";String str2 = "hellojava";boolean flag = str1==str2;//true

结果为true.

当我们这样声明

String str1 = "hello";String str2 = "java";String str3 = "hellojava";String str4 = str1+str2;boolean flag = str3==str4;//false

结果为false.这是因为str4是有两个引用类型结合而成,它的值在编译期无法确定.

如果将str1和str2声明为final类型

final String str1 = "hello";final String str2 = "java";String str3 = "hellojava";String str4 = str1+str2;boolean flag = str3==str4;//true

str1和str2都是被final修饰的字符串常量,那么str4在编译期就可以被确定.因此结果是true.

通过new创建字符串

String str3 = "hellojava";String str4 = new String("hellojava");boolean flag = str3==str4;//false

这是因为new会在堆中创建一个hellojava的实例对象,并用栈中的str4指向它.而str3指向的是方法区中字符串常量池中的hellojava.当然堆中的hellojava指向的也是字符串常量池中的hellojava(如果存在的话).

要了解一下str3和str4的声明做了什么?

先声明str3.会在方法区的字符串常量池中直接创建一个字符串"hellojava",使str3指向它.紧接着用new创建str4时,会先查找字符串常量池中是否包含字符串"hellojava".如果有直接返回,没有就在常量池中创建.然后在堆中创建实例对象,并将这个实例对象指向常量池中的字符串"hellojava",然后将实例对象赋给栈中的str4.

转载地址:http://byeao.baihongyu.com/

你可能感兴趣的文章
剑指OFFER——顺时针打印矩阵
查看>>
Live Archive 3490 - Generator 概率
查看>>
洛谷 1417 烹调方案
查看>>
Oracle SQL Developer
查看>>
基于DDD的.NET开发框架 - ABP初探
查看>>
Redis持久化机制
查看>>
dede的使用-2
查看>>
C++银行储蓄程序代码
查看>>
Java 线程池框架核心代码分析
查看>>
第六次作业:素数判断及求和
查看>>
「学习笔记——Linux」Linux软件管理(RPM,Dpkg,APT)
查看>>
Soft NMS
查看>>
Linux命令的那些事(二)
查看>>
强制转https
查看>>
Ubuntu下GTK的安装、编译和测试
查看>>
javascript中window.open()与window.location.href的区别
查看>>
Respond.js的作用
查看>>
FCN笔记(Fully Convolutional Networks for Semantic Segmentation)
查看>>
外部线程停止Java子线程的方法
查看>>
java对象内存占用
查看>>