首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

JDK核心JAVA源码解析(2) - String(上)

,我们可以通过字节码解释: 0 ldc #2 //从常量池中取出"123"的引用,在编译启动过程中,字符串字面量就会被存入常量池 2 astore_1 //保存到第一个变量,就是sub1...的引用 8 astore_3 //保存到第三个变量,就是string1 9 ldc #4 //从常量池中取出"123456"的引用 11 astore 4 //保存到第四个变量,就是...这以为这字符串池的内存限制等于应用程序的内存限制。 在 Java 7 和 8 中使用 -XX:StringTableSize 来设置字符串池 Map 的大小。...原因很简单,因为ISO8859-1编码的编码表根本就不包含汉字字符,当然也就无法通过”中”.getBytes(“ISO8859-1”);来得到正确的”中”字在ISO8859-1中的编码值了,所以,再通过...("中".getBytes("UTF-8"),"ISO8859-1"),这样得到的s_iso8859-1字符串实际是三个在ISO8859-1中的字符,在将这些字符传递到目的地后,目的地程序再通过相反的方式

1.3K31

JVM字节码与Java代码层调优

.class文件是无法直接使用文本编辑器查看的,至于字节码的查看,我们可以使用javap这个jdk自带的工具。...0, 1 // 本地变量0加1 5: iload_0 // 本地变量0压栈,此时这个本地变量的值为1 6: istore_1 // 出栈保存到本地变量...6: istore_1 // 出栈保存到本地变量1里面,即代码中的变量j 从字节码层面上,可以看到两者之间始终是区别于先+还是后+,并没有哪里少操作或多操作了一步。...而f2();方法的字节码中,只创建了一次StringBuilder的实例,并且执行的指令也要少一些。所以使用StringBuilder进行字符串拼接,比使用 + 拼接的效率高。...---- String Constant Variable 在关于字符串拼接那一小节中,我们得知了在使用 + 进行字符串拼接的时候,实际上会创建StringBuilder实例来完成字符串的拼接。

46620
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    一文读懂字符串String

    为什么说字符串是不可变的 在工作中,我们经常要在代码中对字符串进行赋值和改变它的值,但是,为什么我们说字符串是不可变的呢?...实际上是将引⽤放到哈希 表中),随后将引⽤赋给str1 如果存在,则不创建任何对象,直接将池中"abc"对象的引⽤返回,赋给str2。...如果有,则不往池中放"abc"对象的引⽤,直接在堆中创建⼀个"abc"字符串对象,然后将引⽤赋给 str4。...因此,保护String类对于提升整个应用程序的安全性至关重要。 当我们在程序中传递一个字符串的时候,如果这个字符串的内容是不可变的,那么我们就可以相信这个字符串中的内容。...StringBuffer和StringBuilder 演示 关于字符串,Java中除了定义了一个可以用来定义字符串常量的String类以外,还提供了可以用来定义字符串变量的StringBuffer和StringBuilder

    53220

    Java中规模软件开发实训——简单的文本编辑器(代码注释详解)

    用户还可以使用保存菜单项将代码编辑器中的内容保存到文件中。 编译代码:提供编译代码的功能。...用户可以通过打开菜单项选择要打开的文件,并将文件内容加载到代码编辑器中。用户还可以使用保存菜单项将代码编辑器中的内容保存到文件中。 代码编译功能:提供编译代码的功能。...代码编译与运行:将编辑区域的代码保存到名为 "Main.java" 的文件中,调用系统命令行执行 javac 命令进行编译。...因此,int lines = code.split("\n", -1).length; 将计算出字符串 code 中的行数,并将其存储在 lines 变量中。...* 当用户在颜色选择器对话框中选择了一个颜色后,JColorChooser.showDialog() 方法会返回用户选择的颜色值, * 并将其存储在 selectedColor 变量中

    18110

    【005期】JavaSE面试题(五):String类

    开篇介绍 大家好,我是Java面试题库的提裤姐,本篇文章是面试系列文章的第五篇,主要介绍了JavaSE中String相关的面试题,在之后会顺着开篇的思维导图一直总结下去,做到日更!...如果我能做到百日百更,希望你也可以跟着百日百刷,一百天养成一个好习惯。 Q: String、StringBuffer、StringBuilder 的区别?...一共有2个引用,3个对象; "aa"与"bb"都是常量,常量的值不能改变,当执行字符串拼接的时候,会创建一个新的常量"aabb",将其存到常量池中。...例如要在构造器中对一个名叫 s 的 String 引用变量进行初始化,把它设置为初始值,应当这样做: public class Demo { private String s; ......,jvm运行的时候不认为s3="abc",也就是无法使用常量池。

    45110

    字符串常量池 运行时常量池_常量池中的字符串是对象吗

    大家好,又见面了,我是你们的朋友全栈君。 字符串常量池 StringTable 概述 常量池在java用于保存在编译期已确定的,已编译的class文件中的一份数据。...,无法进行扩容操作,并且字符串种类复杂,很可能发生哈希碰撞现象,一旦字符串在哈希表中形成了链表等数据结构,就会使字符串常量池的性能下降,所以字符串常量池中需要加入垃圾回收机制。...变量拼接的原理是StringBuilder 如果拼接的结果调用intern()方法,根据该字符串是否在常量池中存在,分为: 如果存在,则返回字符串在常量池中的地址 如果字符串常量池中不存在该字符串,则在常量池中创建一份...中的toString()方法: 实际上调用了String类的构造法新建了一个String,而在这个String中只是将原来的char[]中的内容进行了复制,然后将复制的引用返回。...因为对字符串常量池进行了优化,所以 s3的值也是在堆中的String类型对象的引用值。

    27120

    Java内存大家都知道,但你知道要怎么管理Java内存吗?

    堆栈 堆栈内存负责保存对堆对象的引用和存储值类型(在Java中也称为基元类型),值类型保存值本身而不保存对堆中对象的引用。 此外,堆栈上的变量具有一定的可见性,也称为作用域。...堆 堆内存将实际对象存储在内存中。这些对象被堆栈中的变量引用。...然而,在后文中,我们将研究一些JVM配置,这些配置允许我们为正在运行的应用程序明确设定它们的大小 引用类型 如果仔细观察内存结构图片,你或许会注意到,代表对堆中对象引用的箭头的样式实际是不同的。...如果一个对象在X轮垃圾回收中存活了下来(取决于JVM的实现,在我的例子中是8轮),那么它很可能会永远存活下来,并被移入到Old(4)区。...因此,如果Java 6应用程序中有太多字符串,则它可能会崩溃。欢迎大家关注我的公种浩【程序员追风】,文章都会在里面更新,整理的资料也会放在里面。

    85820

    字节一面:说说 Java 内存管理

    1 栈 栈内存负责保存对堆对象的引用和存储值类型(在 Java 中也称为原始类型),它保存值本身而不是对堆中对象的引用。 此外,栈上的变量具有一定的可见性,也称为作用域。仅使用来自活动范围的对象。...例如,假设我们没有任何全局范围变量(字段),只有局部变量,如果编译器执行一个方法体,它只能从堆栈中访问方法体中的对象。它无法访问其他局部变量,因为它们超出了范围。...因此,每次创建和启动线程时,它都有自己的堆栈内存——并且不能访问另一个线程的堆栈内存。 2 堆 这部分内存将实际对象存储在内存中。这些由堆栈中的变量引用。...2.弱引用 简单来说,堆中对象的弱引用很可能在下一次垃圾回收过程之后无法生存。...).toString().intern(); //1 添加上述更改将创建以下输出: 字符串相等 5 垃圾收集过程 如前所述,根据堆栈中的变量对堆中对象的引用类型,在某个时间点,该对象符合垃圾收集器的条件

    59520

    深入理解Java:String

    对象, * 最后将刚生成的String对象的堆地址存放在局部变量str3中。...最后我再破除一个错误的理解:有人说,“使用 String.intern() 方法则可以将一个 String 类的保存到一个全局 String 表中 ,如果具有相同值的 Unicode 字符串已经在这个表中...,那么该方法返回表中已有字符串的地址,如果在表中没有相同值的字符串,则将自己的地址注册到表中”如果我把他说的这个全局的 String 表理解为常量池的话,他的最后一句话,”如果在表中没有相同值的字符串,...将清单1和清单2对应起来看,清单2的字节码中ldc指令即从常量池中加载“aaaaa”字符串到栈顶,istore_1将“aaaaa”存到变量1中,后面的一样,sipush是将一个短整型常量值(-32768...最后在33调用StringBuffer的toString函数获得String结果并通过astore存到变量3中。

    35710

    30个精简代码的小技巧

    3.尽可能使用局部变量 调用方法是传递的参数以及在调用中创建的临时变量都保存在栈中,相对速度比较快。其他变量,如,静态变量,实例变量等,都在堆中创建,速度较慢。...另外,栈中创建的变量,随着方法的运行结束,这些内容就消失了,不需要额外的垃圾回收。...如果会话要被转存到磁盘,就必须先序列化,在大规模集群中,对对象进行序列化代价是很大的。因此,应及时调用HttpSession的invalidate()方法清除会话。 19....21.将常量声明为 STATIC FINAL 这样在编译运行时就可以把这些内容放入常量池中,避免运行期间计算生成常量的值。另外,将常量的名字进行大写的原因。...(2) 参数较多会导致出错概率增加 27.字符串变量和字符串常量,equals的时候,将字符串常量写在前面 如: Strring str = “123”; if(str.equals(“123”))

    65821

    Java基础笔记之String相关知识

    我的理解:比如说 String myName = "Cherish";这个Cherish字符串一旦被创建,就会存到内存上某个地址如 0x58 处,然后这个字符串会被放到String Pool中,之后你再传建一个...另一边,如果我改变myName的值,则原来保存的值不会改变,而只会另外开辟一块空间,把改变后的字符串存进去,如下图: ?...当一个字符串调用 intern() 方法时,如果 String Pool 中已经存在一个字符串和该字符串值相等(使用 equals() 方法进行确定),那么就会返回 String Pool 中字符串的引用...;否则,就会在 String Pool 中添加一个新的字符串,并返回这个新字符串的引用。..."Cherish"对象,同时在堆中创建"Cherish"这个对象,然后将堆中的这个对象的地址返回赋给引用str,若实例池存在则直接在堆中创建"test"这个对象,然后将堆中的这个对象的地址返回赋给引用str

    38220

    Java Object类 和 String类 常见问答 6k字+总结

    ,所以不能够用 == 比较,应该用 equal() String 中默认重写过的 equal() 方法是用来比较字符串内容是否相同 我们要使用的是学生类的成员变量,所以父类 Object不能调用子类Student...这不对啊,B 明明是克隆 A 的,为什么我在克隆后,修改了 B 中两个值,但是 A 也变化了啊 这就是典型的浅克隆,在 Book 类,当字段是引用类型,例如 Partner 这个合作伙伴类,就是我们自定义的类...s, 刚才的匿名对象 "Hello" 就变成了一个垃圾对象,因为它没有被任何栈中的变量指向,会被GC自动回收。...> StringBuffer StringBuffer与StringBuilder,他们是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一个对象上操作的,不像String一样创建一些对象进行操作...首先java并不支持运算符重载(String类中的 “+” 和 “+=” 是 Java 中仅有的两个重载过的运算符),所以我们可以通过 “+” 符号 将多个字符串进行拼接 将图中代码(使用了 “+” 符号

    41120

    Java 基础常见知识点&面试题总结(中),2022 最新版!

    // 在堆中创建字符串对象”ab“ // 将字符串对象”ab“的引用保存在字符串常量池中 String aa = "ab"; // 直接返回字符串常量池中字符串对象”ab“的引用 String bb =...,如果没有保存的话,会在堆中创建对应的字符串对象并将该字符串对象的引用保存到字符串常量池中。...示例代码(JDK 1.8) : // 在堆中创建字符串对象”Java“ // 将字符串对象”Java“的引用保存在字符串常量池中 String s1 = "Java"; // 直接返回字符串常量池中字符串对象...final 修饰的基本数据类型和字符串变量 字符串通过 “+”拼接得到的字符串、基本数据类型之间算数运算(加减乘除)、基本数据类型的位运算(>、>>> ) 引用的值在程序编译期是无法确定的,编译器无法对其进行优化...如果 ,编译器在运行时才能知道其确切值的话,就无法对其优化。

    40710

    5分钟理解String的'+'的性能及原理

    #2; //String a // 将引用存放到 1 号局部变量中 2: astore_1 3: return 实验二:纯字符串相加 public class...0: ldc #2; //String b // 将引用存放到 1 号局部变量中 2: astore_1 // 检查到非常量的相加,这时创建 StringBuilder...; // 将 toString 的结果保存至 2 号局部变量 22: astore_2 23: return 实验四可以看出,非常量字会串相加时,由于相加的变量中存放的是字符串的地址引用...,因为在编译时无法确切地知道其他具体的值,也就没有办法对其进行优化处理,这时为了达到连接的效果,其内部采用了StringBuilder 的机制进行处理(JDK 5 中新增的,我这里没有 JDK 1.4,...实验四的结论表明,字符串与变量相加时在内部产生了 StringBuilder 对象并采取了一定的操作。

    49920

    Java大数据面试复习30天冲刺 - 日积月累,每日五题【Day01】——JavaSE

    而StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder 类,在AbstractStringBuilder中也是使用字符数组保存字符串 char[...性能 每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象。...对于三者使用的总结: 操作少量的数据 => 使用String 单线程操作字符串缓冲区下操作大量数据 => 使用StringBuilder 多线程操作字符串缓冲区下操作大量数据 => 使用StringBuffer...Java 中==和 equals 的区别 == 的作用: 基本类型:比较的就是值是否相同 引用类型:比较的就是地址值是否相同 equals 的作用:引用类型:默认情况下,比较的是地址值。...Error 类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢出等。对于这类 错误的导致的应用程序中断,仅靠程序本身无法恢复和和预防,遇到这样的错误,建议让程序终止。

    25710

    优化 C# 性能:最小化垃圾回收器负载

    尽管垃圾回收器会自动进行回收操作,但频繁的回收会极大地影响应用程序的性能。 我将介绍一些实用的技巧,用于减轻垃圾回收器的工作负载,让你的 C# 应用程序运行得更出色。 垃圾回收器究竟是如何工作的?...示例: var list = new List(); // 预定义容量 尽量减少装箱和拆箱操作 问题:将值类型装箱为引用类型以及反向的拆箱操作会导致多余的对象分配。...解决方案: 将大型对象拆分成较小的部分。 使用 StringBuilder 进行字符串拼接,而不是每次都创建新的字符串。...示例: var sb = new StringBuilder(); sb.Append("Part 1"); sb.Append("Part 2"); 避免滥用静态变量 问题:静态对象在整个应用程序生命周期内都存在...,垃圾回收器无法回收它们占用的内存。

    4210

    Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day1】 —— 基础篇1

    面试题1:Java 中操作字符串都有哪些类?它们之间有什么区别? 正经回答: 操作字符串的类有:String、StringBuffer、StringBuilder。   ...String:字符串常量 StringBuffer:字符串变量(有同步锁) StringBuilder:字符串变量(无同步锁) 从上面的名字可以看到,String是"字符串常量",也就是不可改变的对象。...我们来看一下这张对String操作时内存变化的图:   我们可以看到,初始String值为"唐伯虎",然后在这个字符串后面加上新的字符串"点香烟",这个过程是需要重新在栈堆内存中开辟内存空间的,最终得到了...然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。   ...线程对于堆中指定的一个String对象只能读取,无法修改。试问:还有什么不安全的呢?

    30931

    编写Java代码时应该避免的6个坑

    JVM 维护一个字符串池,在创建一个新字符串之前,它调用 String.intern() 方法,该方法从字符串池中返回一个与值匹配的实例(如果存在)。...这样做的原因是,在第 3 行中,运行时必须将 sum 变量转换为原始 int(自动拆箱),并且在执行添加后,结果将包装在一个新的 Integer 类中(自动装箱)。...方法就行,该方法为一系列输入值生成哈希代码,生成散列代码的方式就像将所有输入值都放入一个数组中一样,并且通过调用 Arrays.hashCode(Object[]) 对该数组进行散列。...它不是无法被修改的 它无法处理时区 充满已弃用但仍在使用的遗留代码 当程序中出现对日期支持的需求时,util 包中的 Date、Calendar 和 rest time 类就出现了。...在应用程序中需要处理时区时,最好在所有服务和数据库中使用同一个时区。当使用 Instant 时,一切都变成了 UTC,然后读者可以根据需要将其转换为不同的时区。

    43091

    【读码JDK】-java.lang包介绍

    比如定义了一个抽象方法,其中一个方法需要子类实现,不希望用户直接通过抽象方法调用,就可以在该方法中抛出该异常 Appendable 一个接口,定义了基本方法,用于将char序列追加到对象中,如StringBuilder...访问或修改null对象的字段。 将null的长度视为数组。 访问或修改值为null的元素。...抛出null ,它是Throwable值 NumberFormatException 抛出以表示应用程序已尝试将字符串转换为其中一种数字类型,但该字符串没有适当的格式 Number 提供数字值转换为基本数据类型...,例如基本指数,对数,平方根和三角函数 与Math中的方法类同,两种有互相调用 String 表示字符串,字符串不可变,值在创建后无法修改,并存与字符串缓冲区中 StringBuffer 线程安全的,...ThreadLocal 提供线程的局部变量,每个线程都拥有一个独立副本 Throwable 该类是所有的错误和异常的超类 TypeNotPresentException 当应用程序尝试使用表示类型名称的字符串访问类型时抛出

    1.6K20
    领券