Java基础知识陷阱(一)
本文发表于本人博客。
事隔好多年了,重新拿起来Java这门语言,看似熟悉其实还很陌生,想想应该梳理下顺便提高下自己。这次先来看看Java里面的String这个对象。
经典的先看下面一段代码,请问最终创建几个对象,分别在哪里?
String s0 = new String("luoliang.me");
String s1 = "luoliang.me";
String s2 = new String("luoliang.me");
想要回答这个问题,先得搞清楚new String()以及String pool的,下面我慢慢来说下。
在java中所有的字符串都会保存在一个叫String pool字符串池里面,这里面的字符串都是有String类独立维护,过程是先判断存在这个字符串不,如果存在就不用创建,否则就在里面创建一个。
那new String("luoliang.me")这个呢,看到new关键字说明会创建对象,先回去字符串池找是否存在,不存在创建,完毕后会在堆中创建这个对象,记住这个对象也是字符串“luoliang.me”的,到这里大家差不多都知道了,那看下面:
String s0 = new String("luoliang.me");执行这句后,系统中会存在2个对象,一个是字符串池的"luoliang.me",另外一个是堆中的new String("luoliang.me"),最后把s0指向这个对象。
String s1 = "luoliang.me"; 执行这句话之后系统中不会增加对象,不变,原因是s1直接指向了字符串池的"luoliang.me"。
String s2 = new String("luoliang.me");执行这句之后,系统中增加一个对象,原因是在字符串池中已经存在"luoliang.me"这个不用创建,直接在堆里创建一个对象,并把s2指向这个对象。
最后总结执行3句之后:系统中存在3个对象,一个是在字符串池中,另外2个是在堆中。
下面接着来看看
System.out.println(s0 == s1);
System.out.println(s0 == s2);
System.out.println(s1 == s2);
这个应该是比较简单了,在基本类型里面==直接比较的是其值,但是对象的话比较的是引用,就是地址的意思。下面我画一张图表示之前的代码在内存的情况:

看到这个图片,相信就知道那3个输出是什么了!都是false
这样说可能还有人不信,那么我们可以使用String的intern()方法(表示其字符串池中字符串的地址)来比较,看下面:
System.out.println(s0 == s0.intern());
System.out.println(s0.intern() == s1);
System.out.println(s0.intern() == s2.intern());
System.out.println(s1 == s2.intern());
输出是:
false
true
true
true
下面我们来看看更有趣的,可能很多人想不到会是这样的结果。
String luoliang = "luoliang";
String liang = "liang";
System.out.println(luoliang == "luo" + "liang");
System.out.println(luoliang == "luo" + liang);
问下输出的结果是什么,答案是:
true
false
至于为什么吗,字面值常量相加等于直接相加然后在字符串池存储,而字面值跟变量相加堆在堆生成一个对象,这样可想而知地址是怎么样的了!
这次先到这里。坚持记录点点滴滴!
Java基础知识陷阱(一)的更多相关文章
- Java基础知识陷阱系列
Java基础知识陷阱系列 今天抽空把Java基础知识陷阱有关的文章汇总于此,便于大家查看. Java基础知识陷阱(一) Java基础知识陷阱(二) Java基础知识陷阱(三) Java基础知识陷阱(四 ...
- Java基础知识陷阱(九)
本文发表于本人博客. 今天我来说说关于JAVA多线程知识,有错误请指出.大家都知道JAVA在服务端上处理也有很大优势,很多公司也有在服务器跑JAVA进程,这说明JAVA在处理这个多线程以及并发下也有一 ...
- Java基础知识陷阱(十)
本文发表于本人博客. 上个星期由于时间比较紧所以未能继续写下去,今天再接再厉,专心 + 坚持这样离目标就越来越近了!废话少说说正题,今天我们还是来说说java中比较基础的知识,大家知道编写java程序 ...
- Java基础知识陷阱(二)
本文发表于本人博客. 上次说了一些关于字符串的知识,都是比较基础的,那这次也说下关于对象地址问题,比如传参.先看下面代码: public void changeInt(int a){ a = ; } ...
- Java基础知识陷阱(七)
本文发表于本人博客. 上次说了下HashSet和HashMap之间的关系,其中HashMap这个内部有这么一句: static final float DEFAULT_LOAD_FACTOR = 0. ...
- Java基础知识陷阱(六)
本文发表于本人博客. 上次说了下equals跟==的问题,今天再来认识一下这个equals()跟hasCode().上次的代码如下: class Person{ public String name; ...
- Java基础知识陷阱(四)
本文发表于本人博客. 今天我们来说说关于java继承以及反射有关的问题,大家先看下下面代码,试问可以编译通过不,为什么具体说说原因? public class Test{ public static ...
- Java基础知识陷阱(三)
本文发表于本人博客. 之前都讲了有关字符串的陷阱,那今天来说下关于静态这个东西,这分为静态变量.静态方法,先看下面的代码请问结果输出是什么?: class Person01{ private stat ...
- Java基础知识陷阱(八)
本文发表于本人博客. 这次我来说说关于&跟&&的区别,大家都知道&是位运算符,而&&是逻辑运算符,看下面代码: public static void m ...
随机推荐
- Android开发 获取当前activity的屏幕截图(转载)
首先通过下面的函数获取Bitmap格式的屏幕截图: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 pu ...
- yum 安装出错--"Couldn't resolve host 'mirrors.aliyun.com'"
1.yum 安装出错 [root@iz25m0z7ik3z ~]#yum install mysql [root@iZ25m0z7ik3Z ~]#yum install mysql Loaded pl ...
- vue使用axios请求本地json文件出现404
之前的路径是这么写的,一直出现404,后来发现必须是http的才可以,这样是无法请求的 把路径改为以下 位置根据json文件决定,但是必须是http://localhost:断口号
- Papers of Word Embeddings
首先解释一下什么叫做embedding.举个例子:地图就是对于现实地理的embedding,现实的地理地形的信息其实远远超过三维 但是地图通过颜色和等高线等来最大化表现现实的地理信息. embeddi ...
- 第二百二十八节,jQuery EasyUI,TreeGrid(树形表格)组件
jQuery EasyUI,TreeGrid(树形表格)组件 学习要点: 1.加载方式 2.属性列表 3.事件列表 4.方法列表 本节课重点了解 EasyUI 中 TreeGrid(树形表格)组件的使 ...
- 要创建一个EJB,必须要至少编写哪些Java类和接口?
要创建一个EJB,必须要至少编写哪些Java类和接口? A. 定义远程(或业务)接口 B. 定义本地接口 C. 定义Bean接口 D. 编写Bean的实现 解答:ABC
- 图像处理之优化---任意半径局部直方图类算法在PC中快速实现的框架
在图像处理中,局部算法一般来说,在很大程度上会获得比全局算法更为好的效果,因为他考虑到了图像领域像素的信息,而很多局部算法可以借助于直方图获得加速.同时,一些常规的算法,比如中值滤波.最大值滤波.最小 ...
- mfc小工具开发之定时闹钟之---多线程急线程同步
一.MFC对多线程编程的支持 MFC中有两类线程,分别称之为工作者线程和用户界面线程.二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环. 工作者线程没有消息机制,通常 ...
- 【vijos】1746 小D的旅行(dijkstra)
https://vijos.org/p/1746 这题就是水题.裸的跑完每个点的最短路后直接可以暴力出解.. 这题贴出来是因为我改了下我的dijkstra的模板...(其实是原来一直写错了233 注意 ...
- VC++Debug查看堆对象内容,即使符号已经超出作用范围
Sometimes you'd like to watch the value of an object (on the heap) even after the symbol goes of sco ...