JLS

JLS 7 3.10.5定义了它并给出了一个实例:此外,字符串文字总是引用类字符串的同一个实例。这是因为字符串文本-或者更普遍地说,字符串是常量表达式的值(§15.28)-是“内部的”,以便使用String.intern方法共享唯一的实例。

例3.10.5-1。字符串文字

由汇编单位组成的程序(第7.3节):package testPackage;class Test {

public static void main(String[] args) {

String hello = "Hello", lo = "lo";

System.out.print((hello == "Hello") + " ");

System.out.print((Other.hello == hello) + " ");

System.out.print((other.Other.hello == hello) + " ");

System.out.print((hello == ("Hel"+"lo")) + " ");

System.out.print((hello == ("Hel"+lo)) + " ");

System.out.println(hello == ("Hel"+lo).intern());

}}class Other { static String hello = "Hello"; }

汇编单位:package other;public class Other { public static String hello = "Hello"; }

产生输出:true true true true false true

JVMS

JVMS 7 5.1说说实习是神奇而高效地用一个专用的CONSTANT_String_infostruct(与大多数具有更一般表示形式的其他对象不同):字符串文字是对类字符串实例的引用,它来自类或接口的二进制表示中的常数_String_INFO结构(§4.4.3)。ConstantString_INFO结构给出了构成字符串文本的Unicode代码点的顺序。

Java编程语言要求相同的字符串文本(即包含相同的代码点序列的文本)必须引用相同的类字符串实例(JLS§3.10.5)。此外,如果对任何字符串调用方法String.intern,则结果是对如果该字符串以文字形式出现将返回的同一个类实例的引用。因此,以下表达式必须具有true值:("a" + "b" + "c").intern() == "abc"

要派生字符串文本,Java虚拟机将检查CONTER_STRING_INFO结构给出的代码点序列。如果以前在包含Unicode代码序列的类字符串实例上调用了方法String.intern,则String文字派生的结果是对该类字符串实例的引用。

否则,将创建一个类String的新实例,该实例包含由ConstantString_INFO结构提供的Unicode代码点序列;对该类实例的引用是字符串文字派生的结果。最后,调用新字符串实例的intern方法。

字节码

让我们对一些OpenJDK 7字节码进行反编译,以查看实习生的实际情况。

如果我们分解:public class StringPool {

public static void main(String[] args) {

String a = "abc";

String b = "abc";

String c = new String("abc");

System.out.println(a);

System.out.println(b);

System.out.println(a == c);

}}

我们有一个固定的游泳池:#2 = String             #32   // abc[...]#32 = Utf8               abc

和main:0: ldc           #2          // String abc

2: astore_1 3: ldc           #2          // String abc

5: astore_2 6: new           #3          // class java/lang/String

9: dup10: ldc           #2          // String abc12: invokespecial #4          // Method java/lang/String."":

(Ljava/lang/String;)V15: astore_316: getstatic     #5          // Field java/lang/System.out:Ljava/io/PrintStream;19: aload_120:

invokevirtual #6          // Method java/io/PrintStream.println:(Ljava/lang/String;)V23: getstatic     #5

// Field java/lang/System.out:Ljava/io/PrintStream;26: aload_227: invokevirtual #6

// Method java/io/PrintStream.println:(Ljava/lang/String;)V30: getstatic     #5

// Field java/lang/System.out:Ljava/io/PrintStream;33: aload_134: aload_335: if_acmpne     4238: iconst_139: goto

4342: iconst_043: invokevirtual #7          // Method java/io/PrintStream.println:(Z)V

注意:0和

3*相同

ldc #2常量被加载(文字)

12*创建一个新的字符串实例(与

#2作为论据)

35: a和

c作为常规对象进行比较。

if_acmpne

常量字符串的表示在字节码上非常神奇:它有一个专门的结构,不像常规对象(例如:

new String)

结构指向包含数据的。这是表示字符串的唯一必要数据。

上面的JVMS引用似乎表明,每当指向的UTF 8是相同的,那么相同的实例将被ldc.

我对字段做了类似的测试,并且:static final String s = "abc"通过

非最终字段没有该属性,但仍然可以用

ldc

结语对字符串池有直接的字节码支持,内存表示是有效的。

奖励:将其与整数池,它没有直接的字节码支持(即否)。CONSTANT_String_info模拟)。

JAVA105字符是什么_什么是Java字符串实习?相关推荐

  1. java字符串字符排列组合_如何在Java中查找字符串的所有排列

    java字符串字符排列组合 In this tutorial, we will learn how to find the permutation of a String in a Java Prog ...

  2. 什么是java字符串_什么是java字符串

    java字符串是string类,Java程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现.字符串是常量:它们的值在创建之后不能更改.字符串缓冲区支持可变的字符串.因 ...

  3. java万能编码转换_分享万能java字符串编码转换工具类

    package com.zuidaima.util; import java.io.UnsupportedEncodingException; /** * 转换字符串的编码 */ public cla ...

  4. java 字符串池_什么是Java字符串池?

    java 字符串池 As the name suggests, String Pool in java is a pool of Strings stored in Java Heap Memory. ...

  5. java char字符转编码_一、java基础-数据类型_数据类型转化_字符编码_转义字符

    1.Java  支持的8种基本数据类型: java的四种整数数据类型:byte 1    short 2     int4     long8 byte     8位带符号整数 -128到127之间的 ...

  6. java面向字符的输入流_详细解读Java编程中面向字符的输入流

    字符流是针对字符数据的特点进行过优化的,因而提供一些面向字符的有用特性,字符流的源或目标通常是文本文件. Reader和Writer是java.io包中所有字符流的父类.由于它们都是抽象类,所以应使用 ...

  7. java字符乱码问题_怎么解决java中的字符乱码问题

    怎么解决java中的字符乱码问题 发布时间:2020-06-28 14:53:09 来源:亿速云 阅读:108 作者:Leah 怎么解决java中的字符乱码问题?相信很多没有经验的人对此束手无策,为此 ...

  8. java 字符拼接_七种java字符串拼接详解

    01."+"号操作符 要说姿势,"+"号操作符必须是字符串拼接最常用的一种了,没有之一. String chenmo = "沉默"; Str ...

  9. java unicode字符串_如何检测Java字符串中的unicode字符?

    "unicode characters"的定义含糊不清,但将被视为标准ISO 8859 charset未涵盖的UTF-8字符.如果在您的情况下这是真的,则循环遍历String中的所 ...

  10. 判断字符为空_算法题:字符串转换整数 (atoi)

    题目描述 题解 分析 他人更优解 一.题目描述 二.题解 import math class Solution:def myAtoi(self,str):str = str.strip() #去除字符 ...

最新文章

  1. 80后博导当上双一流高校副校长:还是杰青获得者
  2. PostgreSQL 恢复大法 - 恢复部分数据库、跳过坏块、修复无法启动的数据库
  3. Master/Slave知识
  4. 部分网站为什么上不去_企业网站如何霸占搜索引擎首页
  5. 基于Guava API 轻松落地观察者模式
  6. systemverilog 起步
  7. C#WinForm WebBrowser (二) 实用方法总结
  8. python数据分析与基础实战_《python数据分析与挖掘实战》基础概念
  9. django 笔记17 ModelForm
  10. python代码封装加密_静态编译python源代码,使用Nuitka加密你的py源码
  11. Linux运行级别介绍和root忘记密码找回方法
  12. linux 使用rpm卸载软件的使用方法
  13. Flex 开发android程序键盘遮挡输入框解决方案
  14. Java接口和Java抽象类(转,原文已被删除)
  15. 别再透支你的社交信用了
  16. 自定义View之HenCoder学习笔记
  17. 【回归预测-ELM预测】基于樽海鞘算法结合极限学习机实现风电场功率回归预测附matlab代码
  18. 中小企业成本的会计核算方法
  19. .net core 下的 Strings.StrConv 繁简转换
  20. [ffmpeg]ffmpeg yasm not found, use --disable-yasm for a crippled build

热门文章

  1. 如何用drawInRect()显示中文?
  2. Bean Validation 技术规范特性概述
  3. JVM 为什么使用元空间替换了永久代
  4. JWT学习(二):Json Web Token JWT的Java使用 (JJWT)
  5. 过来人谈在美国大学里的中国研究生
  6. 解决在TP5中无法使用快递鸟的即时查询API
  7. CentOS7.2下python安装pip-8.0.2管理
  8. python小游戏之圣诞树
  9. FUCKED-BUG之python子进程的键盘中断
  10. PHP下ajax跨域的解决方案之window.name