学习Java,容易被你忽略的小细节(2)
昨天心情真的太糟糕了,写完《学习Java,值得注意你注意的问题(1)》之后,迎来些许的支持以后就是一片片的谴责。我的主页上涌现出许许多多Java方面的牛人,谴责我水平太低,写的问题太初级。搞得我非常抑郁,直接导致我和我的女神聊天到后半夜2点多,就是想一吐心中不快。不过这里我还真应该谢谢他们,没有他们我真找不到借口和我的女神聊天呢。谢谢你们啊。
我知道自己水平不够,但是我真的有用心在写博客。每次博客上写出的问题都是事前询问过同学的,都是同学们比较迷茫的区域,都是一些只知其然不知其所以然的部分。因为《学习Java,值得你注意的问题》吸引了太多Java牛人的关注,我不得不被迫将文章的名字更改为《学习Java,容易被你忽略的小细节》。这里请大家注意了我说的是容易被你忽略的小细节,这些细节可能对于Java牛人来说真的就像南极冰川上一座不起眼的冰山,微不足道。所以我有必要在这里表明态度,请各位Java牛人绕路,不要抨击小弟了。我只想向和我一样初学Java的同学提供一些我个人觉得有价值的建议。
吐槽完毕,我们闲话少说。下面就来介绍一下,学习Java,容易被你忽略的小细节(2)
在学习String类的时候,在书上看到这样一段代码:
if(string1 == string2)
System.out.println("string1 and string2 are the same object");
else
System.out.println("string1 and string2 are different object");
下面附带文字,运算符“==”只能检查string1和string2是否指向同一个对象,它不能辨别两个不同的对象是否包含相同内容。因此,不能用“==”检测两个字符串变量是否具有相同内容,而equals()方法可以用于对象内容相等的比较。
遇到这种问题显然我会自己动手调试一下才会甘心。但是调试结果领我很郁闷。
代码:
public class TestDemo2{
public static void main(String[] args){
String string1 = "testDemo";
String string2 = "testDemo";
if(string1 == string2)
System.out.println("string1 and string2 are the same object");
else
System.out.println("string1 and string2 are different object");
}
}
调试结果:

"string1 and string2 are the same object"???这是要闹哪样啊,难道书上写错了?难道运算符“==”也可以用于对象内容相等的比较?
看到调试结果以后我又在图书馆的书架上找了几本《Java程序设计》相关的书籍仔细地阅读,最后找打了问题的原因。
在一本书籍的一个角落里有这样一段话:
注:程序设计中频繁使用字符串。为了提高效率,节省内存,Java虚拟机尽力确认相同的串并把它们存放在同一内存空间,但这不能保证所有相同的串都具有相同的内存地址。因此还需要使用equal()方法判断两个串内容是否相同,使用“==”判断两个串的引用是否相同(即,指向相同的内存地址)。
虽然Java虚拟机是为了提高效率,节省内存。但是显然差点误导我嘛,坏人!!!
在Java程序设计中遇到判断字符串内容是否相等的问题时,建议代码:
if(string1.equals(string2))
System.out.println("string1 and string2 have the same contents");
else
System.out.println("string1 and string2 are not equal");
虽然上面问题很基础,但是我相信一定有很多同学在学习到相同知识点的时候也会和我一样有迷惑。请大家不要单单记住判断字符串相等的时候应该用equals()方法,不能用“==”。最好做到知其然,也知其所以然。都是Java虚拟机惹的祸。
(ps:经过博友kongkongyzt的指点,我重新测试了一下)
代码:
public class TestDemo2{
public static void main(String[] args){
//string1 和string2 内容相同,地址不同。
String string1 = new String("testDemo");
String string2 = new String("testDemo");
if(string1 == string2)
System.out.println("string1 and string2 are the same object");
else
System.out.println("string1 and string2 are different object");
if(string1.equals(string2))
System.out.println("string1 and string2 have the same contents");
else
System.out.println("string1 and string2 are not equal");
}
}
测试结果:

从上面测试结果可以很清楚的看出对于String类,equals()方法和运算符“==”在使用上的区别。在这里非常感谢博友kongkongyzt的指点。
上面就是学习Java,容易被你忽略的小细节(2)。
欢迎继续关注本博更多新鲜动向,博主QQ:2584451009,有什么建议和忠告欢迎评论或留言。
学习Java,容易被你忽略的小细节(2)的更多相关文章
- 学习Java,容易被你忽略的小细节(3)
在<学习Java,容易被你忽略的小细节(2)>中我们已经深入讨论过String类中equals()方法的使用,在本文中我们将进一步讨论equals()方法在其他境况下的使用方法. 首先,我 ...
- 学习Java,值得你留意的问题(1)更名为《学习Java,容易被你忽略的小细节(1)》
记得大二快要结束的时候,有个女孩子突然问我“你会Java吗,帮我做大作业好吗?” 实话说,那个女孩真的很漂亮,我当时也非常想帮她.但是我从来没有接触过Java,让我在短短的几天内完成Java程序设计课 ...
- java 性能优化:35 个小细节,让你提升 java 代码的运行效率
前言 代码 优化 ,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没 ...
- JAVA性能优化:35个小细节让你提升java代码的运行效率
代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是, ...
- java中的@Override标签,小细节大作用
转载:http://www.cnblogs.com/octobershiner/archive/2012/03/09/2388370.html 一般用途 ...
- Java生鲜电商平台-关于学习生鲜电商平台的思考(小程序/APP)
Java生鲜电商平台-关于学习生鲜电商平台的思考(小程序/APP) 说明:最近群里面的一个网友问的一个问题,让我陷入了深思,他问的问题很基础也很真实,"大佬,你们是怎么学习的呢?" ...
- 系统学习 Java IO (一)----输入流和输出流 InputStream/OutputStream
目录:系统学习 Java IO ---- 目录,概览 InputStream 是Java IO API中所有输入流的父类. 表示有序的字节流,换句话说,可以将 InputStream 中的数据作为有序 ...
- 从零开始学习JAVA(入门基础)
目录 博主从零开始学习JAVA(入门基础) 1.搭建JAVA开发环境 卸载JDK(未安装的请忽略) 安装JDK 2.编程语言中,何为编译型与解释型 编译型 解释型 3.第一个JAVA应用程序 4.JA ...
- 论新手该如何学习java?
由于我国高等教育制度教材陈旧,加上java自身发展不过十年左右的时间,还有一个很重要的原因就是java这门语言更适合商业应用,所以高校里大部分博士老师们对此语言的了解甚至不比本科生多. 在这种环境下, ...
随机推荐
- WPF 使用不安全代码快速从数组转 WriteableBitmap
原文:WPF 使用不安全代码快速从数组转 WriteableBitmap 本文告诉大家一个快速的方法,直接把数组转 WriteableBitmap 先来说下以前的方法,以前使用的是 BitmapSou ...
- wpf控件开发基础(3) -属性系统(2)
原文:wpf控件开发基础(3) -属性系统(2) 上篇说明了属性存在的一系列问题. 属性默认值,可以保证属性的有效性. 属性验证有效性,可以对输入的属性进行校验 属性强制回调, 即不管属性有无发生变化 ...
- POJ 1988 Cube Stacking (种类并查集)
题目地址:POJ 1988 这道题的查找合并的方法都能想的到,就是一点没想到,我一直天真的以为查询的时候,输入后能立即输出,这种话在合并的时候就要所有的结点值都要算出来,可是经过路径压缩之后,没办法所 ...
- 机器学习: t-Stochastic Neighbor Embedding 降维算法 (一)
Introduction 在计算机视觉及机器学习领域,数据的可视化是非常重要的一个应用,一般我们处理的数据都是成百上千维的,但是我们知道,目前我们可以感知的数据维度最多只有三维,超出三维的数据是没有办 ...
- seajs构建web申请书
随着开发项目的不断扩大,查找代码依赖关系复杂化,维护比较沉闷.记seajs有这种效果方面.果断尝鲜.解决两个问题:1)命名冲突 2)文件相关性 因为所在BG使用TAF服务,基于C++开发一套WSP w ...
- LaTex 加粗(加黑)的方式
1. 基本 LaTeX技巧458:关于LaTeX数学字体加粗 $\mathbf $,会变为粗体,但也导致数学字母斜体形式的丢失: 使用 amsmath package 的 \boldmath 命令: ...
- 4 DDD里面的界限上下文
1 界限上下文概念的出现 当开发一个电子商务系统的时候,会给系统划分很多子域,销售子域是核心子域,此外还有物流子域,商品子域等支撑子域.在这些子域里面,一个商品product在销售子域和商品子域里面外 ...
- WPF:拖动父窗口行为
原文 WPF:拖动父窗口行为 这次只是一个快速的帖子:当我点击并拖动特定的UIElement时,我需要能够重新定位WPF窗口.目的是重新创建在标准Windows标题栏上单击和拖动的行为(在我的情况下, ...
- 图像金字塔(pyramid)与 SIFT 图像特征提取(feature extractor)
David Lowe(SIFT 的提出者) 0. 图像金字塔变换(matlab) matlab 对图像金字塔变换接口的支持(impyramid),十分简单好用. 其支持在reduce和expand两种 ...
- (记录)mysql分页查询,参数化过程的坑
在最近的工作中,由于历史遗留,一个分页查询没有参数化,被查出来有sql注入危险,所以对这个查询进行了参数化修改. 一看不知道,看了吓一跳,可能由于种种原因,分页查询sql是在存储过程中拼接出来的,wh ...