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

Java的String#intern()方法是如何实现的?

在Java中,String#intern()方法是一个本地方法,它的实现与具体的Java虚拟机(JVM)实现有关。String#intern()方法的主要作用是将字符串添加到字符串常量池或从字符串常量池中获取该字符串的引用。

以下是String#intern()方法的实现概述:

  1. 如果字符串常量池中已经存在该字符串,则返回该字符串的引用。
  2. 如果字符串常量池中不存在该字符串,则将该字符串添加到字符串常量池,并返回该字符串的引用。

字符串常量池是JVM中的一个特殊区域,用于存储已经被加载的字符串字面量。String#intern()方法可以用于优化内存使用和提高性能,因为字符串常量池中的字符串可以被多个对象共享。

以下是一个简单的示例,演示了如何使用String#intern()方法:

代码语言:java
复制
public class StringInternDemo {
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "hello";
        String s3 = new String("hello");
        String s4 = s3.intern();

        System.out.println(s1 == s2); // true
        System.out.println(s1 == s3); // false
        System.out.println(s1 == s4); // true
    }
}

在这个示例中,s1s2是字符串字面量,它们被存储在字符串常量池中。s3是通过new关键字创建的新字符串对象,它不在字符串常量池中。s4是通过调用String#intern()方法将s3添加到字符串常量池中,并返回该字符串的引用。因此,s1s4指向同一个字符串常量池中的字符串,所以它们相等。

总之,String#intern()方法是一个有用的工具,可以帮助优化Java应用程序的内存使用和性能。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

JavaLambda如何实现

在上面的字节码中,我们可以看到一个名为 lambdamain0 方法,该方法在编译阶段自动生成,其对应于示例源码中lambda方法体。...在main方法字节码中,invokedynamic整个lambda实现关键,不过由于该字节码在JVM中实现逻辑非常复杂,在这里我们就不看具体代码了,只说下大致思路。...那这个对象对应哪里来呢?对,也是动态生成。...依据上面的示例,我们再来总结下lambda如何实现: 在编译阶段,javac会自动生成一个lambdamain0方法,该方法对应了lambda方法体。...$Lambda1类,该类实现java.util.function.Consumer接口,且在其accept方法中直接调用了编译阶段生成lambdamain0方法

1.1K30

Java内部类如何实现

内部类(inner class)定义在另一个类中类。 内部类方法可以访问该类定义所在作用域中数据,包括私有的数据。...语法和用法大家很容易就学会了,那么内部类如何实现直接访问其他类私有成员变量呢?我们知道Java私有成员变量只有类实例本身能访问。...在最初学习Java语法时候,把内部类当做该类一个属性去记忆和理解,因此,自然可以访问私有变量。这个理解,现在看来错误。 内部类一种编译器现象,与虚拟机无关。...内部类一个特性可以访问外部私有成员变量,这又是如何做到呢。...同理,依旧将这两个变量转换程内部类成员变量,实现传递。

73020
  • Java中Httpsession如何实现?

    假设Web Server一个商场存包处,HTTP Request一个顾客,第一次来到存包处,管理员把顾客物品存放在某一个柜子里面(这个柜子就相当于Session),然后把一个号码牌交给这个顾...在Java Web Server(即Servlet/JSP Server)中,Session ID用jsessionid表示(请参见Servlet规范)。...如果HTTP MethodPOST,说明这个HTTP Requestsubmit一个HTML Form结果, 那么Message Body为HTML Form里面定义Input属性。...由于Message Body方法必须需要一个包含Session IDHTML Form,所以这种方法不通用。 一般用来实现Session方法有两种: (1)URL重写。...我们来看Tomcat5源代码如何支持jsessionid。 org.apache.coyote.tomcat5.CoyoteResponse类toEncoded()方法支持URL重写。

    1.2K90

    React内部如何实现cache方法

    前几天写一篇介绍use这个新hook文章中聊到React原生实现了一个缓存函数方法 —— cache。...如果id改变,那么fetch方法重新发起请求是正常逻辑。 但是,React组件经常render,如果在id不变情况下,由于User组件render导致不断发起请求,显然不合理。...分析实现思路 整个方法实现一共有64行代码,首先我们来分析下实现要点。 如果参数不变,则使用缓存值。...而在Map中,key到value强引用,即使没有其他数据引用这个key,他也不会被垃圾回收。 实现原理 本文不会介绍具体代码实现(大段贴代码让人看起来头疼)。 我会用示例图讲解实现原理。...而原始类型值不存在这样问题,从图中可以发现,原始类型值对应一个map节点。 总结 cache方法React内部实现,未来会暴露给开发者使用缓存方法,可以缓存任意函数。

    1.2K30

    JavaJVM如何实现多线程

    Java线程模型 文章已同步至GitHub开源项目: Java超神之路 ​ 并发不一定都要用到线程,比如PHP中用到多进程。但是在Java中并发基本上都是使用线程来实现。...我们先来看看线程在Java虚拟机中如何实现。 线程实现 ​ 主流操作系统都提供了线程实现Java线程则提供了在不同硬件和操作系统下对线程统一处理。...每个已经start且并未结束Thread类实例对象都是一个线程。 ​ 我们查看ThreadJDK源码,发现所有的方法都被native修饰。也就是说,Thread使用平台相关手段来实现。...由于操作系统只将处理器资源分配到进程程度,所以阻塞如何处理,多处理器如今分配资源等问题都需要由用户解决。 Java,Ruby等语言都使用过用户线程,但是最终都放弃了。...Java线程实现Java规范中并没有具体要求使用哪种方式来实现 ​ 在JDK1.2之前,使用一种绿色线程用户线程来实现。 ​

    1K21

    JavaJVM如何实现多线程

    Java线程模型 文章已同步至GitHub开源项目: Java超神之路 ​ 并发不一定都要用到线程,比如PHP中用到多进程。但是在Java中并发基本上都是使用线程来实现。...我们先来看看线程在Java虚拟机中如何实现。 线程实现 ​ 主流操作系统都提供了线程实现Java线程则提供了在不同硬件和操作系统下对线程统一处理。...每个已经start且并未结束Thread类实例对象都是一个线程。 ​ 我们查看ThreadJDK源码,发现所有的方法都被native修饰。也就是说,Thread使用平台相关手段来实现。...由于操作系统只将处理器资源分配到进程程度,所以阻塞如何处理,多处理器如今分配资源等问题都需要由用户解决。 Java,Ruby等语言都使用过用户线程,但是最终都放弃了。...Java线程实现Java规范中并没有具体要求使用哪种方式来实现 ​ 在JDK1.2之前,使用一种绿色线程用户线程来实现。 ​

    1.1K31

    Java 如何实现线程间通信

    Java 里有哪些方法实现线程间通信。...我们需要更细粒度锁来控制执行顺序。 这里,我们可以利用 object.wait() 和 object.notify() 两个方法实现。...实际开发中,我们经常要创建子线程来做一些耗时任务,然后把任务执行结果回传给主线程使用,这种情况在 Java 里要如何实现呢?...那么下一个问题就是,如何把子线程结果回传回来呢?在 Java 里,有一个类配合 Callable 使用:FutureTask,不过注意,它获取结果 get 方法会阻塞主线程。...小结 多线程现代语言共同特性,而线程间通信、线程同步、线程安全是很重要的话题。本文针对 Java 线程间通信进行了大致讲解,后续还会对线程同步、线程安全进行讲解。

    19720

    Java 如何实现线程间通信

    Java 里有哪些方法实现线程间通信。...我们需要更细粒度锁来控制执行顺序。 这里,我们可以利用 object.wait() 和 object.notify() 两个方法实现。...实际开发中,我们经常要创建子线程来做一些耗时任务,然后把任务执行结果回传给主线程使用,这种情况在 Java 里要如何实现呢?...那么下一个问题就是,如何把子线程结果回传回来呢?在 Java 里,有一个类配合 Callable 使用:FutureTask,不过注意,它获取结果 get 方法会阻塞主线程。...小结 多线程现代语言共同特性,而线程间通信、线程同步、线程安全是很重要的话题。本文针对 Java 线程间通信进行了大致讲解,后续还会对线程同步、线程安全进行讲解。

    24650

    Java | Apollo 如何实现配置更新

    Apollo 如何实现配置更新 ?...这篇文档主要关注下配置修改后对应 Java 对象是如何更新,并不关注整体配置改动流程 所有代码都来自 apollo-client 项目 更新流程 在 Apollo 控制台进行配置修改并发布后,对应...找到对应关联到这个 key Spring Bean 信息,如果找不到则不处理 根据找到 Spring Bean 信息,进行对应关联配置更新 在第二步中会判断关联配置用过属性关联还是方法进行关联...key 找到对应 Spring Bean 信息 如何将 Apollo 配置值转换为 Spring 识别的值 public class AutoUpdateConfigChangeListener...predUrl; } } 在 Apollo 代码中,通过实现 BeanPostProcessor 接口来检测所有的Spring Bean 创建过程,在 Spring Bean 创建过程中会调用对应

    2.2K10

    Java | Spring Cloud 如何实现服务治理

    Spring Cloud 如何实现服务治理 文档写再好,也不如源码写好 源码地址: Spring Cloud Consul https://github.com/spring-cloud/...在 Spring Cloud 体系中,Spring Cloud Commons 最重要一个项目,其中定义了服务注册、服务发现、复杂均衡相关接口以及一些公共组件,通过看这个项目,我们可以简单理解一下...Spring Cloud 提供一个注册实现 public interface Registration extends ServiceInstance { // 这里面真没有代码 } 服务注册实际接口...Consul 中,首先自定义了 Registration 实现 其中 NewService 为 Consul 定义一些服务实例信息 public class ConsulRegistration...Consul 本身提供一些特有功能如:Tags、Check // 删除了通用 getter、setter、toString 方法 public class NewService { @SerializedName

    92020

    Java及JVM如何识别重载、重写方法?

    然而,Java编译器直接将我方法调用识别为调用第二个方法,这究竟是为什么呢? Java虚拟机怎么识别目标方法? 重载与重写 同一类中出现多个: 名字相同 参数类型相同 方法,则无法编译。...由于StringObject子类,因此Java编译器会认为第二个方法更贴切。 除同一个类中方法,重载也可作用于这个类所继承而来方法。...Java方法重写多态体现:允许子类在继承父类部分功能同时,拥有自己独特行为。...对Java中重写而Java虚拟机中非重写情况,编译器会通过生成桥接方法[2]实现Java重写语义。 由于对重载方法区分在编译阶段已完成,可认为JVM不存在重载概念。...经过上述解析步骤后,符号引用会被解析成实际引用: 对可静态绑定方法调用,实际引用是个指向方法指针 对需动态绑定方法调用,实际引用则是个方法索引 总结与实践 本文介绍了Java以及Java虚拟机如何识别目标方法

    1.2K51

    如何正确实现JavahashCode方法

    你知道一个对象唯一标志不能仅仅通过写一个漂亮equals来实现 太棒了,不过现在你也必须实现hashCode方法。 让我们看看为什么和怎么做才是正确。...否则相等对象是可能不会有相同哈希码,因为它们将调用Object's默认实现。...HashCode 准则 引用自官方文档 hashCode通用约定: * 调用运行Java应用程序中同一对象,hashCode方法必须始终返回相同整数。...这个整数不需要在不同Java应用程序中保持一致。 * 根据equals(Object)方法来比较,如果两个对象是相等,两个对象调用hashCode方法必须产生相同结果。...这就意味着如果重写了equals方法,那么就必须重写hashCode方法实现hashCode 使用与equals中使用相同字段(或者equals中使用字段子集) 最好不要包含可变字段。

    1.8K90

    Java如何实现平台无关性(跨平台)

    那么,到底什么平台无关性?Java又是如何实现平台无关性呢?本文就来简单介绍一下。 ?...2 平台无关性实现 对于Java平台无关性支持,就像对安全性和网络移动性支持一样,分布在整个Java体系结构中。...其中扮演者重要角色Java语言规范、Class文件、Java虚拟机(JVM)等。 编译原理基础 讲到Java语言规范、Class文件、Java虚拟机就不得不提Java到底如何运行起来。...所以,我们说Java平台无关性实现主要作用于以上阶段。如下图所示: ?...Java语言规范 已经有了统一Class文件,以及可以在不同平台上将Class文件翻译成对应二进制文件Java虚拟机,Java就可以彻底实现跨平台了吗?

    1.7K31

    Java如何实现平台无关性(跨平台)

    那么,到底什么平台无关性?Java又是如何实现平台无关性呢?本文就来简单介绍一下。...2 平台无关性实现 对于Java平台无关性支持,就像对安全性和网络移动性支持一样,分布在整个Java体系结构中。...其中扮演者重要角色Java语言规范、Class文件、Java虚拟机(JVM)等。 编译原理基础 讲到Java语言规范、Class文件、Java虚拟机就不得不提Java到底如何运行起来。...所以,我们说Java平台无关性实现主要作用于以上阶段。如下图所示: ?...Java语言规范 已经有了统一Class文件,以及可以在不同平台上将Class文件翻译成对应二进制文件Java虚拟机,Java就可以彻底实现跨平台了吗?

    1K50

    Java 虚拟机:JVM如何实现反射

    JVM 虚拟机.jpg 反射 Java 语言中一个相当重要特性,它允许正在运行 Java 程序观测,甚至修改程序动态行为。...如果你对反射 API 不是特别熟悉的话,你可以查阅我放在文稿末尾附录。 反射调用实现 首先,我们来看看方法反射调用,也就是 Method.invoke,怎么实现。...(注:这种性能评估方式并不严谨,我会在专栏第三部分介绍如何用 JMH 来测性能。) 在我这个老笔记本上,一亿次直接调用耗费时间大约在 120ms。这和不调用时间一致。...那么,如何消除这部分开销呢? 关于第二个自动装箱,Java 缓存了 [-128, 127] 中所有整数所对应 Integer 对象。...这个动态实现字节码自动生成,它将直接使用 invoke 指令来调用目标方法

    1.5K40

    什么Java多态?如何实现Java多态?

    大家好,又见面了,我你们朋友全栈君。 java多态这个概念在同学们深入学习java时候就会被提出,很多同学并不知道是什么意思,如何实现。...今天小千就来给大家介绍一下什么java多态和java如何实现多态。 什么多态? 指允许不同类对象对同一消息做出响应。即同一消息可以根据发送对象不同而采用多种不同行为方式。...(发送消息就是函数调用) 实现多态技术称为:动态绑定(dynamic binding),指在执行期间判断所引用对象实际类型,根据其实际类型调用其相应方法。...多态超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现。如图8.3 所示。...图中超类Shape规定了两个实现多态接口方法,computeArea()以及computeVolume()。子类,如Circle和Sphere为了实现多态,完善或者覆盖这两个接口方法

    1.3K10
    领券