【JVM】JDK7后intern方法总结

JDK6及之前字符串常量池是放在永久代的,这里不讨论,JDK7之后将字符串常量池迁移到了JVM的堆中,注意删除永久代更换为元空间是JDK8哈。

测试代码1如下:

    @Test
    public void test01() {

        String str2 = new StringBuilder("12").append("34").toString();
        String intern = str2.intern();
        String str1 = "1234";
        System.out.println(str2 == intern);
        System.out.println(str1 == intern);
        
    }

输出结果:

true

true

测试代码2如下:

    @Test
    public void test02() {
        String str1 = "1234";
        String str2 = new StringBuilder("12").append("34").toString();
        String intern = str2.intern();
        System.out.println(str2 == intern);
        System.out.println(str1 == intern);
    }

输出结果:

flase

true

结论:

String调用intern()方法时,会先去字符串常量池中查找,如果有,返回字符串常量池中的常量对象引用地址;如果没有,将当前字符串放入字符串常量池后,返回常量池中的常量对象引用地址,即当前String对象引用地址。

用法:

用于大量重复字符串的创建,速度会略慢于直接创建,因为会执行一次intern方法,但是会节省大量内存,因为创建时只需要保存一份常量池的引用即可,同时因为常量池被放到堆中,相当于间接降低了gc频率,所以最终并不一定会降低程序性能

本文转载于网络 如有侵权请联系删除

相关文章

  • 数据库四大特性及数据库隔离级别

    大家好,又见面了,我是你们的朋友全栈君。MySql本篇文章主要介绍数据库的四大特性ACID,以及说明一下数据库的隔离级别。如果想要说明一个数据库或者一个框架支持事务性操作,则必须要满足下面的四大特性1.原子性(Atomicity)原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚。失败回滚的操作事务,将不能对事物有任何影响。2.一致性(Consistency)一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。 数据库状态如何变化?每一次数据变更就会导致数据库的状态迁移。如果数据库的初始状态是C0,第一次事务T1的提交就会导致系统生成一个SYSTEMCHANGENUMBER(SCN),这是数据库状态从C0转变成C1。执行第二个事务T2的时候数据库状态从T1变成T2,以此类推,执行第Tn次事务的时候数据库状态由C(n-1)变成Cn。 一致性可以从一致读和一致写两个方面来理解。一致读事务读取数据只能从一个状态中读取,不能从2个或者2个以上状态读取。也就是T(n)只能从C(n-1),C(n-2)…C(1)中的一个状

  • 6 个提效开发的 JavaScript “杀手”函数

    JavaScript是Web开发中最关键的一环,提速JS开发就是提速下班[狗头]。文章包含的代码片段,没有任何副作用,可以放心拷贝使用。1.校验一个元素是否在可视区域内网页开发时,常常需要了解某个元素是否进入了"视口"(viewport),即用户能不能看到它。可以使用IntersectionObserver这个API。参考:IntersectionObserverAPI使用教程-阮一峰的网络日志[1]constcallback=(entries)=>{ entries.forEach((entry)=>{ if(entry.isIntersecting){ //`entry.target`是dom元素 console.log(`${entry.target.id}isvisible`); } }); }; constoptions={ threshold:1.0, }; constobserver=newIntersectionObserver(callback,options); constbtn=document.getElementById(

  • dumi文档工具运行时core-util-is报错的解决方法

    【推荐】SMSMAN:相当不错的接码平台,联系QQ:2179975030dumi文档工具项目,执行 yarnstart 命令报错:'core-util-is' MODULE_NOT_FOUND ,具体报错信息如下:Command failed: D:\Pansoft\analysis-lib\node_modules\.bin\lerna ls --json --all internal/modules/cjs/loader.js:328       throw err;       ^ Error: Cannot find module 'D:\Pansoft\analysis-lib\node_modules\core-util-is\lib\util.js'. Please verify that the package.json has a valid "main" entry     at tryPackage (internal/modules/cjs/loader.js:320:19)     at Funct

  • BBC NEWS | AI设计的新药分子首次进入临床试验

    人工智能设计的新药分子将首次进入人体临床试验ByJaneWakefield(技术记者)BBCNews2020年1月30日由人工智能(AI)“发明”的一种新药物分子将在世界范围内首次用于人体试验,这标志着机器学习在医学中起到的作用是里程碑式的。该药物分子是由英国初创公司Exscientia和日本制药公司SumitomoDainipponPharma共同创造,将用于治疗强迫症(OCD)患者。一般情况下,药物开发大约需要五年时间才能进入试验阶段,而借助AI开发的新药物仅需12个月。Exscienta首席执行官AndrewHopkins教授将其描述为“药物发现中的关键里程碑”。他告诉BBC:“我们看到了AI已经用于诊断患者以及分析患者数据和扫描结果,但这次是AI在新药开发中的直接应用。”该分子称为DSP-1181,使用筛选潜在化合物的算法创建而成,并根据大型数据库中的参数对其进行检查。Hopkins教授说:“找到合适的分子需要经过数十亿次决策,而精确设计一种药物更是一个巨大的决定。”他补充说:“但是该算法的优点在于它们是不可知的,因此可以应用于任何疾病。”第一种药物将在日本进入第一阶段试验,如

  • 一文理清JVM和GC 【第二弹】

    一、OOM的认识StackOverflowErrorpublicstaticvoidmain(String[]args){ stackOverflowError();//Exceptioninthread"main"java.lang.StackOverflowError } privatestaticvoidstackOverflowError(){ stackOverflowError(); } 复制OutOfMemeoryError:javaheapspacepublicstaticvoidmain(String[]args){ Stringstr="cbuc"; for(;;){ str+=str+UUID.randomUUID().toString().substring(0,5);//+=不断创建对象 } } 复制OutOfMemeoryError:GCoverheadlimitexceeded程序在垃圾回收上花费了98%的时间,却收集不会2%的空间。 假如不抛出GCoverheadlimit,会造成:GC清理的一点点内存很快会再次填

  • fscanf

    读取文本文件中的数据全页折叠语法A=fscanf(fileID,formatSpec)A=fscanf(fileID,formatSpec,sizeA)[A,count]=fscanf(___)说明示例A=fscanf(fileID,formatSpec)将打开的文本文件中的数据读取到列向量A中,并根据formatSpec指定的格式解释文件中的值。fscanf函数在整个文件中重新应用该格式,并将文件指针定位在文件结尾标记处。如果fscanf无法将formatSpec与数据相匹配,将只读取匹配的部分并停止处理。该文本文件由文件标识符fileID指示。使用fopen打开文件,指定字符编码,以及获取fileID值。读取文件后,请调用fclose(fileID)来关闭文件。示例A=fscanf(fileID,formatSpec,sizeA)将文件数据读取到维度为sizeA的数组A中,并将文件指针定位到最后读取的值之后。fscanf按列顺序填充A。sizeA必须为正整数或采用[mn]的形式,其中m和n为正整数。示例[A,count]=fscanf(___)还将返回fscanf读取到A中的字段数

  • Linux 离线安装docker的过程

    前言有时候会遇到服务器不能联网的情况,这样就没法用yum安装软件,docker也是如此,针对这种情况,总结了一下离线安装docker的步骤1.准备docker离线包docker官方离线包下载地址下载需要安装的docker版本,这里已docker-17.03.2-ce.tgz版本为例子。准备docker.service系统配置文件[Unit] Description=DockerApplicationContainerEngine Documentation=https://docs.docker.com After=network-online.targetfirewalld.service Wants=network-online.target [Service] Type=notify #thedefaultisnottousesystemdforcgroupsbecausethedelegateissuesstill #existsandsystemdcurrentlydoesnotsupportthecgroupfeaturesetrequired #forcontainer

  • String没那么简单!

    String类相信大家都不陌生,我们写工程使用String的频率,就像写作文时使用汉字“的”的频率一样高。那么你经常使用它,是否真的“了解”它?请带着问题,一步一步的揭开它神秘的面纱,看看它到底是何许“人”也!一、先简单了解jvm大家都知道jvm也就是Java虚拟机,这里我们只说下JVM的内存区,运行时内存区主要可以划分为:栈(JavaVirtualMachineStacks)、堆内存(HeapMemory)、方法区(MethodArea)、本地方法栈(NativeMethodStacks)、和程序计数器(ProgramCounter(PC)Register)。1.栈栈是线程私有,自动分配的连续的空间,后进先出。栈用来存放栈帧。栈帧用于存储局部变量表、操作数栈、动态链接、方法返回等信息。每个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。栈内存中的数据没有初始化默认值,需要手动设置,且数据执行完毕,变量会立即释放。这样可以节约内存空间。 2.堆内存 堆内存是线程共享,且是不连续的空间。堆用来存放new创建的对象和数组,与栈不同,堆内存中的实体是用来封装数据的

  • 你的线性代数魔法书,极度易吸收:想让图像怎么动,它就怎么动 | 免费

    入门深度学习之前,你需要优雅地学习线性代数。 这样孤独又深沉的科目,如果教材能陪你玩耍就好了。于是,世界上有了“第一本能交互的线代书”,叫做《沉浸式线性代数》(ImmersiveLinearAlgebra)。里面的图像都是活的,能按照你喜欢的姿势动,可以全方位观察,有助消化艰难的理论。 这免费书在HackerNews获得了1209的高热,并引起了一阵“好人一生平安”的感激之情:打开你的魔法书图像能怎么玩?来看第三章向量点乘(DotProduct)里的一个栗子。如果你不记得什么是点乘:你看,有一束光打在三角形上。然后,三角形背后的“桌面”,留下了它的影子。点击Forward,就可以分步观察,从光线发射到生成影子的全过程了。 图像变化的时候,下面的文字解释也会变,每一步要注意什么,都写在里面。如果你感觉3D图像更生动,只要点左上角的旋转按钮,图像就会转起来了。转起来还是不够立体? 三角形的每个顶点都可以拖拽。看上图,把一个顶点往上抬了抬,是不是漂亮了一些?除此之外,光源的位置也可以调。如果,你需要某个特殊的角度观察,比如由“桌面”出发的水平视角:按住右键拖动,就可以调角度了。 调平了,再按

  • Raft协议学习笔记

    1. 前言 常见的一致性协议主要有:PaxOS、Raft、ZAB、PacificA等。同PaxOS,Raft也不考虑拜占庭将军问题(Byzantine failures,注:比特币采用工作量证明PoW和股权证明PoS解决了拜占庭将军问题)。2. 名词Distributed Consensus分布式一致性Distributed Consensus Algorithms分布式一致性算法,PaxOS是分布式一致性算法的鼻祖,绝大多数的实现要么基于PaxOS,要么受PaxOS影响(如Zookeeper)。PaxOS就分布式系统中的某个值(在PaxOS中叫决议,即Proposer)达成一致的算法。PaxOS是分布式一致性协议的鼻祖,在Google的三大件未推出之前少为人知,1989年莱斯利·兰伯特提出。Leslie Lamport是大神的英文名,出生于1941年2月7日纽约。兰伯特目前就职于微软研究院,他也是排版系统LaTeX的作者,2008年获得冯诺依曼奖,2013年获得图灵奖,麻省理工学院学士和布兰戴斯大学博士。最早的实现为Google内部使用的Chubby。R

  • tensorflow mnist神经网络示例

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haluoluo211/article/details/79704120 本文讲述使用tensorflow解决mnist分类问题:使用一个隐藏层神经网络784*10分类mnist使用两个隐藏层神经网络784*300*10分类mnist其中单层784*4隐藏层的网络构架如下图:具体代码如下:#coding:utf-8 importtensorflowastf fromtensorflow.examples.tutorials.mnistimportinput_data #Readdata mnist=input_data.read_data_sets("MNIST_data/",one_hot=True) image_size=28 labels_size=10 learning_rate=0.05 steps_number=1000 batch_size=100 #Defineplaceholders training_data=tf.p

  • 基于双流编码-解码深度网络的视频对象分割算法简介

    背景介绍视频对象分割(VideoObjectSegmentation),目的是将视频段中的物体连续地“抠”出来以得到视频每一帧的前景、背景分割结果。分割得到的结果可被用于更高级的识别、理解等计算机视觉任务,是目前基于内容的视频检索、视频编辑、视频自动标注的基础和关键环节。传统的视频对象分割算法有很多,根据在测试视频上执行是否需要人工标注可将其分为半监督算法和无监督算法两类。这里半监督算法在执行时需要人工对某些帧进行精确或非精确标注并根据标注结果得到其他帧的分割结果;而无监督算法在执行时完全自动地对所有帧进行分割,不需要人工干预。现有的无监督算法多是基于超像素点或objectproposal的帧间匹配,占用存储空间大,只能局限于部分场景下的对象分割,当存在光照突变、非刚性形变等复杂情形时分割精度则较差。现有的半监督算法大部分都是基于图论的算法,该类算法分割精度较高,但由于构建和求解图的计算量过大,使其需要较长的执行时间才能得到好的分割结果。随着深度学习的发展,将深度学习引入视频对象分割是目前CV界的的主要趋势之一。深度学习应用于视频对象分割的挑战深度学习在图像分割领域已经取得了巨大成功,

  • 用户为王(一)

    作为一个热爱为移动应用工作的产品设计师,为了寻找新鲜的交互和精彩的视觉体验来刺激我的灵感,我每周都会下载大量的手机应用。这么做有时候会捡拾到一些非常酷的概念,可是大多数时候我都会感到失望,因为大多数应用根本就不懂得尊重他们的用户。为了让你的用户用起来舒心,作为一个长者,我觉得有必要跟大家分享一些基(ren)本(sheng)准(jing)则(yan)来让你的应用变的更好。在这一部分我将谈到-如何请求权限-注册的囧况-良好的加载效果如何请求权限再也没有比第一次打开应用就duang地跟你要权限好给你发通知更讨人厌的了。你还没来得及看完应用引导界面就弹出一个对话框:“么么哒,我可以每天都给你发邮件吗?”“滚!” 大多数时候我是拒绝的,我会立马删除这个应用,因为这种行为给我的印象是这样的:“做这个应用的根本就不知道什么是用户体验,那当然这个应用也不会有什么有趣的玩意儿了”你可以想象这样一个场景:哥们前脚刚踏进一家饭馆,服务员就贴上来问你:“邮箱、微信、QQ统统交出来,我会每天给你发消息”。这粗鲁,如你所愿。正如现实生活一样,向用户请求权限,我们需要掌握好时机和分寸。不管你是要给用户发送通知,给用

  • 记一次使用windbg排查内存泄漏的过程

    一、背景   近期有一个项目在运行当中出现一些问题,程序顺利启动,但是观察一阵子后发现内存使用总量在很缓慢地升高, 虽然偶尔还会往下降一些,但是总体还是不断上升;内存运行6个小时候从33M上升到80M;   程序存在内存泄漏是确定无疑的了,大概出问题的方向也知道,就是程序新加入一个采集协议(BACnet协议,MSTP_DLL), 但是怎么把具体泄漏位置找出来却非常麻烦,因为这个协议是封装在一个C语言写的动态库中,想要单步调试好像不太可能, 况且源码也不再我这里;   如果到此为止,推脱给其他同事找问题,那联合调试费时不说。其他同事也身兼数职,不大可能有时间调试, 那项目推进肯定停滞;那没办法了,只能硬着头皮上;网上了解一番,对于这种内存泄漏问题,比较好的处理方式就是 抓取内存快照,然后分析数据提交记录,使用查看使用堆栈等信息;所以基于以上原因,选择了windbg内核调试工具; 先分析一下看看,说不定可以发现问题;   二、windbg注意事项 1、首先要安装对版本,即你的程序是32位还是64位,对于的windbg版本也要一致,否则会报错;详情了解:点击这里 2、需要用64位的

  • python 模块 hashlib(提供多个不同的加密算法)

      hashlib是涉及安全散列和消息摘要,提供多个不同的加密算法借口,如SHA1、SHA224、SHA256、SHA384、SHA512、MD5等。 importhashlib m=hashlib.md5()#创建hash对象,md5:(message-DigestAlgorithm5)消息摘要算法,得出一个128位的密文 printm#<md5HASHobject@000000000254ADF0> m.update('BeginMan')#更新哈希对象以字符串参数 printm.digest()#返回摘要,作为二进制数据字符串值 printm.hexdigest()#返回十六进制数字字符串0b28251e684dfbd9102f8b6f0281c0c5 printm.digest_size#16 printm.block_size#64复制   h=hashlib.new('md5') printh#<md5HASHobject@000000000260BDB0> h2=hashlib.new('ripemd160','what'

  • JavaScript_对象_Global与DOM简单学习

    JavaScript_对象_Global       Global:全局对象         1.特点:全局对象,这个Global中封装的方法不需要对象就可以直接调用。方法名();        2.方法:encodeURI():url编码decodeURI():url解码encodeURIComponent():url编码decodeURIComponent():url解码parseInt():将字符串转为数字逐一判断每一个字符串是否是数字,直到不是数字为止,将前边数字部分转为numberisNaN():判断一个值是否是NaNNaN六亲不认,连自己都不认,NaN参与的==比较全部为falseeval():将JavaScript字符串并把它作为脚本代码执行。3.URL编码传智博客=%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2复制 <!DOCTYPEhtml> <htmllang="en"> <head> <metacharset="UTF-8"> <title>Global对象</title

  • cf1559 D2. Mocha and Diana (Hard Version)

    传送门 相较于D1的\(n^2\)暴力。这次肯定不行了。这时我们就要想如何快速合并2片森林中所有的树呢。 首先可以加完边后两片森林依旧为森林,因此最多可以加的边数为边数多的那片森林确定。这样我们不妨令边数多的森林为第一片森林,可以加的最多的边即把第一片森林搞得只剩下一棵树。 在第一片森林中两棵树合并时,两颗树需要分别提供一个连接点,并且这两个连接点在第二篇森林中不属于同一棵树。那么这两颗树可以通过这两个连接点来连接。 这个连接点是必然存在的,这里简略证明一下(口胡开始):对于第一片森林中的两棵树,假设不存在这一连接点,那么即这两棵树上的点在第二片森林中属于同一棵树,此时有一条边的差异这是关键,后面口胡,那么在第一片森林中必然有额外的一点属于这两棵树中的一个,而又不属于第二片森林中的那棵树,假设不成立,因此必然存在这个连接点。(口胡结束) 之后我们该如何找这两个点呢?这是不妨逆向一下,我们来看在第一片森林的第\(i\)棵树如果要提供连接点位于第二片森林的第\(j\)棵树时,可以提供的点是谁,这里可以用二维map来储存。即\(mp[u][v]=i\)表示点\(i\)同时位于第一片森林的\(

  • MySQL 索引、事务与存储引擎

    目录 一、MySQL索引 1.1索引的概念 1.2索引的作用及缺点    1.2.1优点    1.2.2缺点 1.3创建索引的原则依据 1.4索引的分类和创建    1.4.1普通索引    1.4.2唯—索引    1.4.3主键索引    1.4.4组合索引(单列索引与多列索引)    1.4.5全文索引(FULLTEXT) 1.5查看索引 1.6删除索引 二、MySQL事务 2.1事务的概念 2.2事务的ACID特点    2.2.1原子性    2.2.2一致性    2.2.3隔离性    2.2.4持久性    小结 2.3事务控制语句    2.3.1测试begin和commit(开始事

  • MP教程-CRUD

    CRUD 一、查询 @Test publicvoidUserMapperTest(){ List<User>userList=userMapper.selectList(null); for(valuser:userList){ System.out.println(user.toString()); } } @Test publicvoidUserSelectByIdTest(){ List<Integer>ids=newArrayList(); ids.add(1); ids.add(2); List<User>users=userMapper.selectBatchIds(ids); for(valuser:users){ System.out.println(user.toString()); } }复制     二、插入 复制 @Test publicvoidUserInsertTest(){ Useruser=User.builder().name("曹操").password("123fdkfjk").age

  • vue中组件间的通信,父传子,子传父

    参考文章:https://www.cnblogs.com/yszblog/p/10135969.html 1父传子    子组件Vue 父组件   注册子组件   子组件在props中创建一个属性,用以接收父组件传过来的值 父组件中注册子组件 在子组件标签中添加子组件props中创建的属性 把需要传给子组件的值赋给该属性 2通过$emit 子组件向父组件传值  2.1子组件Vue    2.2父组件   2.3父组件监听子组件发射的事件名 子组件中需要以某种方式例如点击事件的方法来触发一个自定义事件 将需要传的值作为$emit的第二个参数,该值将作为实参传给响应自定义事件的方法 在父组件中注册子组件并在子组件标签上绑定对自定义事件的监听 在通信中,无论是子组件向父组件传值还是父组件向子组件传值,他们都有一个共同点就是有中间介质,子向父的介质是自定义事件,父向子的介质是props中的属性。抓准这两点对于父子通信就好理解了 3兄弟,父子,同级间传值 利用总线

  • tr

    tr-c-d-s ["string1_to_translate_from"]["string2_to_translate_to"]  -c或--complerment  取代所有不属于第一字符集的字符。    -d或--delete  删除所有属于第一字符集的字符。    -s或--squeeze-repeats  把连续重复的字符以单独一个字符表示。 替换文件test中所有冒号,代之以逗号:  $tr-s"[:]""[,]"<test  或$tr-s":"","<test  显示$PATH变量将":"变成回车:  echo$PATH|tr":""\n"  替换第一个参数字符集之外的字符为指定字符:  tr-c[boy]"k"<trTest       

相关推荐

推荐阅读