猿猴:String类在内存中实现原理详解
(1)==和equals区别
==:在引用类型比较是,==比较地址值是否相同
equals:引用类型比较时,equals默认也是比较地址值是否相同,而String类重写了equals()方法,比较的是内容是否相同。
(2)
区分下面两种语句在内存中的实现:
String s1=new String("abcde");
String s2="abcde";
System.out.println(s==s2); //false
System.out.println(s.equals(s2)); //true
① String s1=new String("abcde"),首先在堆内存中new(新建)一个对象xx,在常量池中寻找是否已经含有“abcde”字符串,如果有,xx直接指向该字符串(实际是xx保存了该字符串在常量池中的地址);否则,新常量池中创建“abcde”字符串,然后xx指向。 在栈中新建String类引用变量s1,s1指向堆中对象xx(即保存xx的地址值)。
②String s2=“abcde”; 首先去常量池中寻找“abcde”的字符串,找到,则栈中引用变量s2直接指向它;否则,新建“abcde”字符串,s2指向其。
综上,s1指向的是堆内存中对象,s2指向的是常量池中的字符串“abcde”,故两者保存的地址不同
(3)
String s3=new String("abcdef");
String s4=new String("abcdef");
System.out.println(s3==s4); //false
System.out.println(s3.equals(s4)); //true</span>
分析可知:s3、s4分别指向堆内存中不同的(通过new 创建的)对象x1,x2,即使x1、x2指向常量池中同一个字符串“abcdef ”,故s3、s4保存的地址不同。
(4)
含有变量的字符串拼接,通过反编译可以知道,实际上是new了一个新对象,然后再拼接,在常量池中寻找、指向
通过new创建的对象,可以通过调用 intern()方法,返回对象指向常量池中的引用(地址)
String s="hello ";
String s1="world";
String s3="hello world";String s4=s+s1;
//s,s1是变量,变量相加在编译时,在堆中先new了一个空间,拼接s、s1,然后在常量池中寻找s+s1字符串,有则将
//new 的对象指向它,没有则创建字符串,再指向
//相当于 String s4=new String("hello world");System.out.println(s3==s4); //false
System.out.println(s4.intern()==s3); //true String s10=new String(s+s1);
System.out.println(s10.intern()==s3);//true
System.out.println(s10.intern()==s4.intern()); //trueString s5="hello "+"world"; //字符串常量相加,先拼接,再在常量池中寻找,如果有,就直接指向该字符串,否则,就创建
System.out.println(s5==s3); //true
String s6=s+"world";
System.out.println(s6==s3); //false
System.out.println(s6==s4); //false
System.out.println("------------------");String s7="abcd";
String s8=new String("abcd").intern();
//intern 方法可以返回该字符串在常量池中的对象的引用,即返回"abcd"在常量池中的引用String s9=new String("abcd");
System.out.println(s7==s8); //true
System.out.println(s7==s9); //false</span>
猿猴:String类在内存中实现原理详解相关推荐
- 【数据的存储】浮点数在内存中的存储详解【超详细的保姆级别教程,让面试官心服口服】手撕浮点数存储使用方式
[数据的存储]浮点数在内存中的存储详解[超详细的保姆级别教程,让面试官对你心服口服]手撕浮点数存储使用方式 作者: @小小Programmer 这是我的主页:@小小Programmer 在食用这篇博客 ...
- Android 中malloc_debug 原理详解
版本基于:Android R 关联博文: Android 中malloc_debug 使用详解 0. 前言 最近上项目中遇到一个native 可能内存泄漏的问题,曾考虑使用HWASAN,但这个工具是针 ...
- vue指令写在html中的原理,详解Vue中的MVVM原理和实现方法
对Vue中的MVVM原理解析和实现首先你对Vue需要有一定的了解,知道MVVM.这样才能更有助于你顺利的完成下面原理的阅读学习和编写下面由我阿巴阿巴的详细走一遍Vue中MVVM原理的实现,这篇文章大家 ...
- java 内存分布_java的各类型数据在内存中分配情况详解_
1. 有这样一种说法,如今争锋于IT战场的两大势力,MS一族偏重于底层实现,Java一族偏重于系统架构.说法根据无从考证,但从两大势力各自的社区力量和图书市场已有佳作不难看出,此说法不虚,但掌握Jav ...
- python中函数分为哪四类_Python函数参数分类原理详解
1.函数的参数在哪里定义 在python中定义函数的时候,函数名后面的括号里就是用来定义参数的,如果有多个参数的话,那么参数之间直接用逗号,隔开 案列: # 利用函数的参数,定义一个可以完成任意两个数 ...
- java中MVC原理详解,Spring MVC 原理总结
1. 什么是MVC? MVC是一种架构模式 --- 程序分层,分工合作,既相互独立,又协同工作 MVC是一种思考方式 --- 需要将什么信息展示给用户? 如何布局? 调用哪些业务逻辑? MVC流程图如 ...
- word2vec中数学原理详解以及原理思考
很久没有写博客了,也没有写过相关总结.最近,工作中又开始用到了word2vector,正好就做个相关总结.这方面相关的博客有很多,我看过的讲的最清楚的就是@peghoty的博客. 要理解wordvec ...
- java中MVC原理详解,SpringMVC运行原理,MVC的基本原理
SpringMVC运行原理,MVC的基本原理 按照上边的执行流程图,我们可以看出一个SpringMVC整体的一个执行轮廓,下面我们具体来分析下 首先服务器接收到一个请求,匹配并调用了我们的前端控制器( ...
- Android中okhttp原理详解
目录 1.okhttp工作的大致流程 2.okhttp中的连接 3.Dispatcher和线程池 4.OkHttp中的设计模式 5.OkHttp的优势 6.参考连接 1.okhttp工作的大致流程 1 ...
最新文章
- 数据结构及算法基础--优先队列(Priority Queue)
- centos yum update 报错 Delta RPMs disabled because /usr/bin/applydeltarpm not installed 解决方法
- 常用正则表达式(包括中文匹配)
- Provided path doesn't exist. pylama Please fix pylama path or install latest version(UBuntu版本下的情况)
- jfinal文件上传
- css 友情链接效果,友链样式与位置很重要!
- linux电脑管理员身份运行,在Ubuntu 20.04 LTS中添加“以管理员身份打开”
- kotlin教程(1)
- Putty文件夹蓝色太暗问题
- 2012二级java真题_2012年计算机二级JAVA模拟试题及答案详解汇总
- 如何写_如何写营销软文?
- ORA-22859 无效的列修改
- 《麦肯锡方法》读书笔记15
- zzulioj1138: C语言合法标识符
- 函数相乘和相除的导数及证明
- 目前Java开发人员需求大吗 Java就业方向是什么
- 如何让nextcloud支持avi文件在线播放
- 任务描述本关任务:利用所学知识,按要求自行绘制一个 K 线图。
- 毕业论文word排版技巧
- SQL中DATEADD用法
热门文章
- 淘宝特价版“转正”,传统电商“下沉三子”围剿拼多多
- 表驱动法(更优雅的写if-else、switch-case)
- PPASR中文语音识别(入门级)
- win10自动更新0x8024002E解决
- 手机锁屏忘记密码,可以通过adb进行解屏安全不丢失东西
- 暨南大学考研难度大吗 计算机,暨南大学|“广东211工程院校——暨南大学考研难度大吗?热度怎么样?”...
- vxe-grid尾行
- QQ被限制登录的解决方法
- GBase 8s支持的驱动连接
- golang中的正则表达式使用注意事项与技巧