String 的 intern() 方法
问题:
- String s1 = “a” + “b”; //创建了几个对象?
- String s2 = new String(“ab”); //创建了几个对象?
- String s3 = new String(“a”) + new String(“b”); //创建了几个对象?
- String s4= new String(“a”) + new String(“a”); s4.intern(); //创建了几个对象?
关于intern():
String.intern()方法是一种手动将字符串加入常量池中的方法,如果有则返回,没有则是JDK7以及JDK前的区别
(1)JDK7前:
String调用intern()方法时回去找常量池是否存在当前内容, 如果不存在会在常量池中创造对象并做引用 如果存在则直接返回
原理:JDK6中常量池位于PermGen(永久代)中,PermGen是一块主要用于存放已加载的类信息和字符串池的大小固定的区域,因此当无用的对象存储多后容易栈溢出。另外问题是堆区和PermGen隔离,容易创建多个相同值对象。
(2)JDK7:
Jdk7将常量池从PermGen区移到了Java堆区,执行intern操作时,如果常量池已经存在该字符串,则直接返回字符串引用,否则复制该字符串对象的引用到常量池中并返回。
回到开始的问题:
String s1 = “a” + “b”; //创建了几个对象?
- 最多一个。会被优化为"ab",然后寻找常量池是否存在"ab",不存在则创建对象
String s2 = new String(“ab”); //创建了几个对象?
- 一个或两个。new时在堆区创建一个对象,如果在常量池不存在"ab"则在常量池再创建一个
String s3 = new String(“a”) + new String(“b”);创建了几个对象?
- 至少4个,最多6个。
首先new两个对象,String的加法会new一个StringBuilder,然后toString()底层会new一个String 另外可能会在常量池创建"a","b"
String s4= new String(“a”) + new String(“b”);s3.intern();创建了几个对象?
- 至少4个,最多7个
同样两个new,一个StringBuilder,一个toString(),"a","b"可能在常量池创建 最后调用intern()方法时候,会去判断"ab"是否存在 JDK7之前:不存在会在常量池new一个对象 JDK7:只创建"ab"引用,并指向堆区"ab"的StringBuilder对象地址
String 的 intern() 方法的更多相关文章
- java String 中 intern方法的概念
1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. ne ...
- String 的intern() 方法说明
1.说明 Java中string.intern()方法调用会先去字符串常量池中查找相应的字符串,如果字符串不存在,就会在字符串常量池中创建该字符串然后再返回. 2.源码说明 public native ...
- String 的 intern() 方法解析
一.概述 JDK7 之前和之后的版本,String 的 intern() 方法在实现上存在差异,本文的说明环境是 JDK8,会在文末说明 intern() 方法的版本差异性. intern() 方法是 ...
- String中intern方法的作用
前言 读完这篇文章你可以了解,String对象在虚拟机内存中的存放,intern的作用,这么多String对象的创建到底有什么区别,String 创建的对象有几个!! 正题 先科普几个知识点1.常量池 ...
- String的intern方法的使用场景
在讲intern方法前,我们先简单回顾下Java中常量池的分类. 常量池的分类 Java中常量池可以分为Class常量池.运行时常量池和字符串常量池. 1. Class文件常量池 在Class文件中除 ...
- String的intern方法的用处
今天第一次翻看Effective java,在其第一个item中讲静态工厂方法的有点的时候说到“它们每次被调用 的时候,不要非得创建一个新的对象”并在结尾处提到---"String.inte ...
- String的Intern方法详解
引言 在 JAVA 语言中有8中基本类型和一种比较特殊的类型String.这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了一种常量池的概念.常量池就类似一个JAVA系统级别提供的缓存.8种 ...
- String的Intern方法
jdk6 和 jdk7 下 intern 的区别 相信很多 JAVA 程序员都做做类似 String s = new String("abc")这个语句创建了几个对象的题目. 这种 ...
- java String的intern()方法
intern()方法用于将字符串对象加入常量池中. public native String intern(); intern()方法返回的是一个常量池中的String对象(即常量池中某个String ...
- Java - 记录String中intern()方法的学习与理解
intern()方法:把堆中的引用丢入常量池中,然后返回这个引用.当常量池中已经存在这个引用,就直接返回这个引用.(jdk1.8) 由于jdk1.7中将字符串常量池改为存放在堆中,因此intern() ...
随机推荐
- [oeasy]python0133_[趣味拓展]颜文字_流石兄弟_表情文字_2ch_kaomoji
颜文字 回忆上次内容 上次我们了解unicode 里面有各种字体 甚至还有emoji emoji 本质上也是文字 按照unicode的方式编码 存储时按照utf-8的方式编码 显示时按照系统定义的 ...
- oeasy教您玩转vim - 31 - # 文字区块
文字区块 回忆上节课内容 上上次讲的翻页 上次先让屏幕位置固定,移动光标 H- Head 移动到屏幕的顶端 M- Middle 移动到屏幕的中间 L- Low 移动到屏幕的底部 然后让光标固定,移 ...
- Nuxt.js 中使用 useHydration 实现数据水合与同步
title: Nuxt.js 中使用 useHydration 实现数据水合与同步 date: 2024/7/18 updated: 2024/7/18 author: cmdragon excerp ...
- JavaScript小面试~节流
节流,当用户发出多次请求时,需要对事件进行限制,不要让事件过多触发.场景:在用户浏览页面的时候,用户拼命滚动屏幕时,控制页面滚动的事件会多次触发,会导致网络阻塞或者出现渲染差.此时需要对其进行约束.无 ...
- Django 处理http请求之中间件
Django处理http请求之中间件 by:授客 QQ:1033553122 欢迎加入全国软件测试交流QQ群:7156436 测试环境 Win7 Django 1.11 自定义中间件 中间件" ...
- 第十二节 JMeter基础-中级地址信息【IF控制器】
声明:本文所记录的仅本次操作学习到的知识点,其中商城IP错误,请自行更改. 背景:提交订单前,我们需要核对一些信息,比如商品信息,收货地址,支付方式等.现在核对一下收货地址信息. 思路: 1.前提条件 ...
- Scratch源码下载 | 3D钻石
程序说明: <3D钻石>是一个利用Scratch平台创作的独特艺术作品.此程序在屏幕上呈现一个精致的3D钻石模型,允许用户通过鼠标操作来旋转和查看钻石的不同角度.该程序还提供了修改钻石参数 ...
- BCLinux 8.2安装配置图解教程--龙蜥社区国产移动云系统
社区镜像下载地址:https://openanolis.cn/download 安装参考地址:https://www.osyunwei.com/archives/13017.html 1安装系统 界面 ...
- 【Mybatis】01 概述 & 快速入门Part1
什么是 MyBatis? MyBatis 是一款优秀的持久层框架,它支持自定义 SQL.存储过程以及高级映射. MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作. MyB ...
- 【Java】数组强转问题
问题产生 问题代码: List<String> strs = new LinkedList<String>(); // 中间有添加元素的操作,这里省略... // 这里toAr ...