String、常量池以及intert方法

.class文件常量池

常量池主要存放两类常量:字面量符号引用

字面量指文本字符串等。

符号引用指:

  • 类和接口的全限定名
  • 字段的名称和描述符
  • 方法的名称和描述符

编译期结束,当类加载器加载类时,.class文件常量被加入运行常量池,如果常量已存在则不再加载。

.class文件常量对象(如String)被创建是预定好的,除非已常量已存在则不再加载。

String intern方法

String str1 = new String("Hello");
String str2 = new String("Hello");
String str1 = new String("Hello").intert();
String str2 = new String("Hello").intert();

intern方法可以再运行期往运行常量池中添加常量。

JDK7,intern方法检查常量池中是否存在此String,如果存在返回常量池对应的引用;如果没有,往常量池中添加该对象的引用,同时返回引用。

intert方法可以避免重复创建相同的String实例,优化内存。

此方法通过常量池判断是否存在相同的String实例,如果存在,将引用指向同个对象,将其他相同但冗余的对象取消引用,利用内存回收机制回收new创建的对象。如果不存在,在运行常量池加入该对象或其引用。

原文地址:https://www.cnblogs.com/weixia-blog/p/9489994.html

时间: 2024-11-10 20:25:44

String、常量池以及intert方法的相关文章

java基础知识回顾之---java String final类 容易混淆的java String常量池内存分析

/** *   栈(Stack) :存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放  在常量池中). 堆(heap):存放所有new出来的对象. *   静态存储:存放静态成员(static定义的). 常量池(constant pool):在堆中分配出来的一块存储区域,存放储显式的String常量和基本类型常量(float.int等).另外,可以存储不经常改变的东西 *                       p

String 常量池

public class TestString { public static void main(String[] args) { /** * **** String类型.包装类型.常量池(与堆.栈) * * * 1)== :比较桟区地址 * 2)equals:String/Integer的 equals 比较(变量所指向的在常量池或堆区的)内容 * * 3)String常量池 * * 只要使用new定义,无论如何都返回新的引用(栈区保存新的地址),如果要创建的字符串在常量池没有找到,则要新加

java-多线程 String 常量池缓存功能带来的问题

在JVM中有string常量池缓存的功能. package com.leran.thread.demo1; public class Test { public static void main(String[] args) { String a = "a"; String b = "a"; System.out.println(a == b); } } 结果:true; for  example: public class Service { public sta

String常量池

面试题:String到底创建了几个? String s1 = new String("hello"); String s2 = new String("hello"); /** * s1创建了两个对象,new String在堆中,然后引用着在常量池中创建"hello"区域. * 而s2,只创建一个对象,就是堆的new String();因为常量池已有hello存在,所以便直接引用 */ System.out.println(s1==s2);//f

string 常量池的理解

1: String a="123"; String b="12"+"3"; String c="1"+"23"; System.out.println( a==b );true System.out.println( a==c );true 2: String a = "ab"; String bb = "b"; String b = "a" +

java中的String类常量池详解

test1: package StringTest; public class test1 { /** * @param args */ public static void main(String[] args){ String a = "a1"; String b = "a"+ 1; System.out.println(a==b); }//true } test2: package StringTest; public class test2 { /** *

内存分配及变量存储位置(堆、栈、方法区常量池、方法区静态区)

转载来源:http://www.cnblogs.com/protected/p/6419217.html 侵删! 程序运行时,有六个地方都可以保存数据: 1. 寄存器:这是最快的保存区域,因为它位于和其他所有保存方式不同的地方:处理器内部.然而,寄存器的数量十分有限,所以寄存器是根据需要由编译器分配.我们对此没有直接的控制权,也不可能在自己的程序里找到寄存器存在的任何踪迹. 2. 堆栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中(new 出来的对象).驻留于常规RAM

Java中的String与常量池

string是java中的字符串.String类是不可变的,对String类的任何改变,都是返回一个新的String类对象.下面介绍java中的String与常量池. 1. 首先String不属于8种基本数据类型,String是一个类类型. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. new String()和new String(“”)都是申明一个新的空字符串,是空串不是null: 3. String str=”k

Java中的String与常量池[转帖]

string是java中的字符串.String类是不可变的,对String类的任何改变,都是返回一个新的String类对象.下面介绍java中的String与常量池. 1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. new String()和new String("")都是申明一个新的空字符串,是空串不是null: 3. String st