摘要:类是类它内部的方法也默认被修饰不能重写字符串常量池当这样声明一个字符串会检测字符串常量池中是否存在这个值的字符串如果存在就直接赋值给否则创建一个新的再赋值给当连续用同样的方式声明两个字符串并作比较结果为这个操作符比较的是什么对于基本变量比较
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.intern()方法
//"java"字符串在常量池中 String str1 = "java"; //直接从常量池中获取"java"字符串 String str2 = str1.intern(); boolean equal = str1==str2;//true //在堆内存中声明一个"java"字符串 String str3 = new String("java"); //常量池没有"java"字符串,将str3的字符串加入到常量池,再返回这个常量池中的"java"字符串给str4 String str4 = str3.intern(); boolean equal = str3==str4;
intern()方法会先在字符串常量池中查找是否有"java"这个字符串,如果有就直接返回这个字符串的引用,如果没有,就把str1指向的"java"字符串加入到常量池,再返回常量池中"java"字符串的引用.
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/73542.html
摘要:证明返回常量池中已存在的对象,不等于新建的对象。为什么要设计成一下内容来自发现百度的中文版本基本也是此文的翻译版。总之,安全性和字符串常量池缓存是被设计成不可变的主要原因。 String是Java中最常用的类,是不可变的(Immutable), 那么String是如何实现Immutable呢,String为什么要设计成不可变呢? 前言 关于String,收集一波基础,来源标明最后,不确...
摘要:编译器发生了什么通过查看文件可以知道在编译的过程中间就将加直接处理成了但是如果是这样查看文件可以看出是而且可以看到表示在栈内存生成了一个引用变量指向堆内存的。 package com.spring; public class Day01 { public static void main(String[] args) { ...
摘要:所以我决定先从类入手,深入的研究一番来开个好头。之所以会有以上的效果,是因为有字符串常量池的存在。同时运行时实例创建的全局字符串常量池中有一个表,总是为池中的每个字符串对象维护一个引用,所以这些对象不会被。 开始写 Java 一年来,一直都是遇到什么问题再去解决,还没有主动的深入的去学习过 Java 语言的特性和深入阅读 JDK 的源码。既然决定今后靠 Java吃饭,还是得花些心思在上...
摘要:而字节码运行在之上,所以不用关心字节码是在哪个操作系统编译的,只要符合规范,那么,这个字节码文件就是可运行的。好处防止内存中出现多份同样的字节码安全性角度特别说明类加载器在成功加载某个类之后,会把得到的类的实例缓存起来。 前言 只有光头才能变强 JVM在准备面试的时候就有看了,一直没时间写笔记。现在到了一家公司实习,闲的时候就写写,刷刷JVM博客,刷刷电子书。 学习JVM的目的也很简单...
阅读 3286·2021-11-12 10:36
阅读 2428·2021-11-02 14:43
阅读 2118·2019-08-30 14:23
阅读 3435·2019-08-30 13:08
阅读 895·2019-08-28 18:09
阅读 3096·2019-08-26 12:22
阅读 3072·2019-08-23 18:24
阅读 1981·2019-08-23 18:17