java String类中的intern方法

java中字符串常量池 首先我们需要理解并不是所有字符串对象创建后都会放入串池,比如用字符串对象动态拼接生成的字符串对象只会在堆中创建对象而不会将其放入串池中,如下列代码中字符串对象s就是由两个字符串对象拼接而成只会在堆中创建对象而不会将该对象进行串池操作。执行第二句s.intern时,因为字符串常量池事先没有存放对象"ab",所以将s的指向放到了字符串常量池中,当执行s == “ab"时会去字符串常量池中寻找对象"ab”,因为已经存储了s的地址,所以s == “ab”判断下列对象s3是否等于s4,s3又是否等于s5。 阅读详情

原文地址:http://www.cnblogs.com/guozhenqiang/p/5633269.html
我没法收藏,就只好放自己这了!
解析Java中的String对象的数据类型

  1. String是一个对象。
    因为对象的默认值是null,所以String的默认值也是null;但它又是一种特殊的对象,有其它对象没有的一些特性。

  2. new String()和new String(“”)都是申明一个新的空字符串,是空串不是null;

  3. String str=”kvill”;
    String str=new String (“kvill”);的区别:
    在这里,我们不谈堆,也不谈栈,只先简单引入常量池这个简单的概念。
    常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。
    看例1:
    String s0=”kvill”;
    String s1=”kvill”;
    String s2=”kv” + “ill”;
    System.out.println( s0==s1 );
    System.out.println( s0==s2 );
    结果为:
    true
    true
    首先,我们要知结果为道Java会确保一个字符串常量只有一个拷贝。
    因为例子中的s0和s1中的”kvill”都是字符串常量,它们在编译期就被确定了,所以s0==s1为true;而”kv”和”ill”也都是字符串常量,当一个字符串由多个字符串常量连接而成时,它自己肯定也是字符串常量,所以s2也同样在编译期就被解析为一个字符串常量,所以s2也是常量池中”kvill”的一个引用。

    所以我们得出s0==s1==s2;

    用new String() 创建的字符串不是常量,不能在编译期就确定,所以new String() 创建的字符串不放入常量池中,它们有自己的地址空间。

    看例2:

    String s0=”kvill”;

    String s1=new String(”kvill”);

    String s2=”kv” + new String(“ill”);

    System.out.println( s0==s1 );

    System.out.println( s0==s2 );

    System.out.println( s1==s2 );

    结果为:

    false

    false

    false

    例2中s0还是常量池中”kvill”的应用,s1因为无法在编译期确定,所以是运行时创建的新对象”kvill”的引用,s2因为有后半部分new String(“ill”)所以也无法在编译期确定,所以也是一个新创建对象”kvill”的应用;明白了这些也就知道为何得出此结果了。

  4. String.intern():

    再补充介绍一点:存在于.class文件中的常量池,在运行期被JVM装载,并且可以扩充。String的intern()方法就是扩充常量池的一个方法;当一个String实例str调用intern()方法时,Java查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用,如果没有,则在常量池中增加一个Unicode等于str的字符串并返回它的引用;看例3就清楚了

    例3:

    String s0= “kvill”;

    String s1=new String(”kvill”);

    String s2=new String(“kvill”);

    System.out.println( s0==s1 );

    System.out.println( “****” );

    s1.intern();

    s2=s2.intern(); //把常量池中“kvill”的引用赋给s2

    System.out.println( s0==s1);

    System.out.println( s0==s1.intern() );

    System.out.println( s0==s2 );

    结果为:

    false


false //虽然执行了s1.intern(),但它的返回值没有赋给s1

true //说明s1.intern()返回的是常量池中”kvill”的引用

true

最后我再破除一个错误的理解:

有人说,“使用String.intern()方法则可以将一个String类的保存到一个全局String表中,如果具有相同值的 Unicode字符串已经在这个表中,那么该方法返回表中已有字符串的地址,如果在表中没有相同值的字符串,则将自己的地址注册到表中“如果我把他说的这个全局的String表理解为常量池的话,他的最后一句话,“如果在表中没有相同值的字符串,则将自己的地址注册到表中”是错的:

看例4:

String s1=new String(“kvill”);

String s2=s1.intern();

System.out.println( s1==s1.intern() );

System.out.println( s1+” “+s2 );

System.out.println( s2==s1.intern() );

结果:

false

kvill kvill

true

在这个类中我们没有声名一个”kvill”常量,所以常量池中一开始是没有”kvill”的,当我们调用s1.intern()后就在常量池中新添加了一个”kvill”常量,原来的不在常量池中的”kvill”仍然存在,也就不是“将自己的地址注册到常量池中”了。

s1==s1.intern()为false说明原来的“kvill”仍然存在;

s2现在为常量池中“kvill”的地址,所以有s2==s1.intern()为true。

  1. 关于equals()和==:

    这个对于String简单来说就是比较两字符串的Unicode序列是否相当,如果相等返回true;而==是比较两字符串的地址是否相同,也就是是否是同一个字符串的引用。

  2. 关于String是不可变的

    这一说又要说很多,大家只要知道String的实例一旦生成就不会再改变了,比如说:String str=”kv”+”ill”+” “+”ans”;

    就是有4个字符串常量,首先”kv”和”ill”生成了”kvill”存在内存中,然后”kvill”又和” “ 生成 ”kvill “存在内存中,最后又和生成了”kvill ans”;并把这个字符串的地址赋给了str,就是因为String的“不可变”产生了很多临时变量,这也就是为什么建议用StringBuffer的原因了,因为StringBuffer是可改变的。

海康威视isecure center 综合安防管理平台文件上传漏洞复现 工作发现,海康威视isecure center存在文件上传漏洞,该漏洞是由于海康威视isecure center存在不严谨可能导致存在任意文件上传漏洞。 阅读详情

相关推荐

绝缘检测原理和绝缘电阻计算方法

绝缘检测的目的就是计算绝缘电阻,当绝缘电阻低于某个阈值,则很可能会造成电池短路、漏电,威胁人员安全

m0_56208280的博客 4万+

详解Java的String 类型

1. 首先String不属于8种基本数据类型,String是一个对象。   ­­因为对象的默认值是null,所以String的默认值也是null;但它又是一种特殊的对象,有其它对象没有的一些特性。   ­­2. new String()和new String(“”)都是申明一个新的空字符串,是空串不是null;   ­­3. String str=”kvill”

张凡的专栏 804

Embarcadero Dev-C++ 6.3安装教程【保姆级】

Embarcadero Dev-C++ 6.3安装教程,保姆级教程~

Thebest_jack的博客 1万+

Hikvision海康威视综合安防平台加解密工具!

@wafinfo师傅写的一个海康威视综合安防平台后渗透利用工具,可替换sysadmin用户password和salt以及解密数据库的连接密码。

潇湘信安的博客 6592

PCB阻焊工艺全解析:从油墨选择到显影测试的完整指南

本文深入解析PCB阻焊工艺全流程,从材料科学角度对比液态光成像(LPI)油墨、干膜阻焊等核心材料特性,系统阐述前处理、涂覆、预烤曝光、显影固化等关键步骤的工艺要点与参数控制。重点探讨了如何通过优化油墨选择与工艺参数,解决常见缺陷,提升PCB的可靠性、美观度及可制造性,为工程师提供从理论到产线实战的完整指南。

s3t4u的博客 554

基于RTL8370N的8口千兆无管理交换机硬件设计

无管理交换机是局域网边缘接入的核心基础设备,其本质是通过硬件状态机实现MAC地址学习、线速转发与自动协商,无需软件配置即可完成即插即用组网。原理上依赖高度集成的PHY+交换矩阵单芯片(如RTL8370N),结合确定性硬件逻辑替代MCU固件,保障低延迟、高可靠与零运维。技术价值体现在成本压缩、体积精简与部署极简化,广泛应用于家庭网络扩展、工业现场设备联网及嵌入式系统桥接等场景。本文详解一款基于RTL8370N的紧凑型8端口千兆无管理交换机,覆盖芯片选型依据、PHY接口设计、电源与散热优化等关键工程实践。

weixin_42327217的博客 402

Hikvision海康威视数据库账号解密工具

这个工具可以用来解密Hikvision海康威视加密的数据库账号和密码,适用版本: 海康威视ivms-8700。

一只正的博客 3864

adas硬件_ADAS智能辅助驾驶系统硬件在环(HIL)测试之硬件介绍

这篇主要分享的是ADAS融合系统的HIL测试系统的硬件结构及其作用,其主要包括上位机、机柜、雷达模拟器系统、雷达暗箱系统以及视频暗箱。 上位机 上位机主要运行HIL测试系统的相关软件,测试人员所有的前期准备工作与测试操作均在上面进行,并监控测试结果,其通过网口实现与NI实时机的通信,上位机将VeriStand项目工程下载至NI实时机运行。机柜 机柜主要由可编程电源...

weixin_39580748的博客 2243

Java技术——你真的了解String类的intern()方法吗

0.引言 什么都先不说,先看下面这个引入的例子: String str1 = new String("SEU")+ new String("Calvin"); System.out.println(str1.intern() == str1); System.out.println(str1 == "SEUCalvin"); 本人JDK版本1.8,输出结果为: tru...

关于Android开发的一些技术点总结 ╮( ̄▽ ̄”)╭ 6万+

HDMI接口技术解析:从基础到应用

本文深入解析HDMI接口技术,从其发展历程、物理结构到传输原理,全面剖析HDMI如何成为影音传输的主流标准。通过对比不同版本的带宽升级和实际应用案例,展示HDMI在4K/8K视频传输中的卓越性能,并分享硬件设计中的实战经验与避坑指南。

weixin_30485379的博客 372

Chromatix_AEC—深入解析曝光表配置与传感器参数计算

本文深入解析高通Chromatix AEC模块中的曝光表配置与传感器参数计算,详细介绍了自动曝光控制(AEC)的核心概念、首行曝光时间计算、行时间与曝光模式对比、帧率计算逻辑以及曝光表高级配置技巧。通过实战案例展示如何优化传感器参数联调,帮助开发者掌握Chromatix工具在摄像头系统中的关键应用。

266

浅谈java中String类的intern方法

先说String,它是一个finally类,即不可被继承,其方法默认也是finally不可被重写。查看源码可知intern是一个内部方法,下面是jdk11里的原文: /** * Returns a canonical representation for the string object. * <p> * A pool of strings, ini...

week_ed的专栏 466

10-142 6-4 查询厂商“D“生产的PC和便携式电脑的平均价格

分数 10全屏浏览题目切换布局作者 lhm单位 河北农业大学本题目要求编写SQL语句,查询厂商D生产的PC和便携式电脑的平均价格。

dqd66的博客 2750

java基础-String类Intern()方法分析

说明:本文是我对自己学习知识的一个简单总结,可能存在许多不足,我希望通过此方式来回顾知识,加强理解,也希望大家能指出文中的错误与不足,互相学习,谢谢。 1.==分析 *Java中的对象默认都是Object类的子类,在Object中,equals方法与==都是比较地址(基本类型除外),下面看一段代码 public class Hello { public static void main...

qq_37803406的博客 854

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

关于Java String类的intern方法与字符串常量池分析

目录 1. String类简述 2. 字符串常量池 3. intern方法与字符串比较 String类简述 String作为Java中一个较为特殊的类,无论在开发过程还是面试时都是一个值得注意的地方。 首先,String类是一个final类,这意味着它不可被继承同时一旦创建了一个String对象不能被修改。关于这点,通过下面这段代码来解释: String str1 = "3"; str1 = "...

Mr_Liuzhongbin的博客 347

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Java-String类的intern()方法

String类的intern()方法 intern()方法 介绍 String类中定义了intern()方法,该方法的用途是为每一个字符序列生成一个且仅生成一个String的引用。intern()方法设计的初衷,就是重用String对象,以节省内存消耗。 作用 intern()方法的作用在jdk1.7之后是查看常量池中是否存在和调用方法的字符串内容一样的字符串,如果有的话,就返回该常量池中的字符串,若没有的话,就在常量池中写入一个堆中该字符串对象的一个引用,指向堆中的该对象,并返回该引用。 举例 案例1

weixin_43421142的博客 296

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Java String类中的intern()方法

Java String类中的intern()方法   今天在看一本书的时候注意到一个String的intern()方法,平常没用过,只是见过这个方法,也没去仔细看过这个方法。所以今天看了一下。个人觉得给String类中加入这个方法可能是为了提升一点点性能,因为从常量池取数据比从堆里面去数据要快一些。(个人感觉)   API上的那几句关于这个方法,其实总结一句就是调用这个方法之后把字符串对象加入...

常雪恨's Blog 281

了解Java中String类中的intern()方法

String类中的intern()方法是手动把String对象加入到字符串常量池中 先来看一个简单的代码: 示例1: @Test public void test1(){//测试通过 String str1 = new String("hello").intern() ; String str2 = "hello" ; Assert.assertTrue(str1 == str2); } 第一句:首先在堆中创建对象"hello",也会在常

qq_44723296的博客 326

Java的String类中的intern()方法

internpublic String intern()返回字符串对象的规范化表示形式。 一个初始为空的字符串池,它由类 String 私有地维护。 当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。

Jeffery Lee的专栏 1777

java---String类的intern方法

在《深入理解Java虚拟机》的第二章中的运行时常量池知识点的讲解中,说到“运行时常量池相对于Class文件常量池的另外一个重要特征是具备动态性,java语言并不要求常量一定只能在编译器产生明也就是并非预置入Class文件中常量池的内容才能进入方法区运行时常量池,运行期间也可能将新的常量放入池中,这种特性被开发人员利用得比较多的便是String类的intern()方法”。 在网上查找了有关inte

白夜行 728

intern 方法 java_浅谈java String类中的intern方法

对于java 字符串String的认识,相信大家都接触过也使用过,但是怎么使用它,如何去使用好它又是另外一回事了,好了,言归正传,今天听以前的同事说,字符串intern方法,我当时觉得这个是什么?没用过,后来百度一下这个,才知道它的作用是强制让JAVA虚拟机去常量池匹配这个值,常量池我们都知道是存在于方法区的,它是方法区的一部分,而方法区是线程共享的,所以常量池也就是线程共享的,但是它并不是线程不...

weixin_39775029的博客 120

Java中String类的intern()方法深入理解。

我们很少用到intern()这个方法,那么这个方法有什么用呢? 先看一段代码: String s1 = new String("RD");// 指向堆对象引用 String s2 = s1.intern(); // 向常量池添加s1 并且S2引用常量池 String s3 = "RD"; System.out.println(s1 == s2); System.out.pri

RD_Lee的博客 775

Java String 类 - intern() 方法了解

大叔今天好累 146
上一篇: java写excel文件及遇到的问题
下一篇: java对象数据转xml文件(加<![CDATA[]]>)[注解方式]
java_trainee
博客等级 码龄10年 12粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值