java初学者必须理解这几个问题
作者:mdxy-dxy 发布时间:2023-04-07 14:22:36
关于这个系列里的问题,每个学Java的人都应该搞懂。当然,若是仅仅学Java玩玩就无所谓了。若是你以为本人现已逾越初学者了,却不很懂这些问题,请将你本人重归初学者队伍。
问题一:我声明晰什么!
String s = "Hello world!";
许多人都做过这样的事情,但是,我们到底声明了什么?回答通常是:一个String,内容是“Hello world!”。这样模糊的回答通常是概念不清的根源。如果要准确的回答,一半的人大概会回答错误。
这个语句声明的是一个指向对象的引用,名为“s”,可以指向类型为String的任何对象,目前指向"Hello world!"这个String类型的对象。这就是真正发生的事情。我们并没有声明一个String对象,我们只是声明了一个只能指向String对象的引用变量。所以,如果在刚才那句语句后面,如果再运行一句:
String string = s;
我们是声明了另外一个只能指向String对象的引用,名为string,并没有第二个对象产生,string还是指向原来那个对象,也就是,和s指向同一个对象。
问题二:"=="和equals方法究竟有什么区别?
==操作符专门用来比较变量的值是否相等。比较好理解的一点是:
int a=10;
int b=10;
则a==b将是true。
但不好理解的地方是:
String a=new String("foo");
String b=new String("foo");
则a==b将返回false。
根据前一帖说过,对象变量其实是一个引用,它们的值是指向对象所在的内存地址,而不是对象本身。a和b都使用了new操作符,意味着将在内存中产生两个内容为"foo"的字符串,既然是“两个”,它们自然位于不同的内存地址。a和b的值其实是两个不同的内存地址的值,所以使用"=="操作符,结果会是false。诚然,a和b所指的对象,它们的内容都是"foo",应该是“相等”,但是==操作符并不涉及到对象内容的比较。
对象内容的比较,正是equals方法做的事。
看一下Object对象的equals方法是如何实现的:
boolean equals(Object o){
return this==o;
}
Object对象默认使用了= =操作符。所以如果你自创的类没有覆盖equals方法,那你的类使用equals和使用==会得到同样的结果。同样也可以看出,Object的 equals方法没有达到equals方法应该达到的目标:比较两个对象内容是否相等。因为答案应该由类的创建者决定,所以Object把这个任务留给了类的创建者。
看一下一个极端的类:
Class Monster{
private String content;
...
boolean equals(Object another){ return true;}
}
我覆盖了equals方法。这个实现会导致无论Monster实例内容如何,它们之间的比较永远返回true。
所以当你是用equals方法判断对象的内容是否相等,请不要想当然。因为可能你认为相等,而这个类的作者不这样认为,而类的equals方法的实现是由他掌握的。如果你需要使用equals方法,或者使用任何基于散列码的集合 (HashSet,HashMap,HashTable),请察看一下java doc以确认这个类的equals逻辑是如何实现的。
问题三:String到底变了没有?
没有。因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。请看下列代码:
String s = "Hello";
s = s + " world!";
s所指向的方针能否改动了呢? 从本系列第一篇的定论很简单导出这个定论。咱们来看看发作了什么工作。在这段代码中,s原先指向一个String方针,内容是"Hello",然后咱们对 s进行了+操作,那么s所指向的那个方针能否发作了改动呢?答案是没有。这时,s不指向本来那个方针了,而指向了另一个String方针,内容为 "Hello world!",本来那个方针还存在于内存之中,仅仅s这个引证变量不再指向它了。
经过上面的阐明,咱们很简单导出另一个定论,若是常常对字符串进行各式各样的修正,或许说,不行预见的修正,那么运用String来代表字符串的话会引起很大的内存开支。由于String方针树立之后不能再改动,所以关于每一个不一样的字符串,都需求一个String方针来表明。这时,应该思考运用StringBuffer类,它答应修正,而不是每个不一样的字符串都要生成一个新的方针。而且,这两种类的方针变换非常简单。
一起,咱们还能够晓得,若是要运用内容一样的字符串,不用每次都new一个String。例如咱们要在结构器中对一个名叫s的String引证变量进行初始化,把它设置为初始值,应当这样做:
public class Demo {
private String s;
…
public Demo {
s = "Initial Value";
}
…
}
而非
s = new String("Initial Value");
后者每次都会调用结构器,生成新方针,功能低下且内存开支大,而且没有意义,由于String方针不行改动,所以关于内容一样的字符串,只需一个String方针来表明就能够了。也就说,屡次调用上面的结构器创立多个方针,他们的String类型特点s都指向同一个方针。
上面的定论还根据这样一个现实:关于字符串常量,若是内容一样,广州Java培训以为它们代表同一个String方针。而用关键词new调用结构器,总是会创立一个新的方针,无论内容能否一样。
至于为什么要把String类描绘成不行变类,是它的用处决议的。其实不只 String,许多Java规范类库中的类都是不行变的。在开发一个体系的时分,咱们有时分也需求描绘不行变类,来传递一组关联的值,这也是面向方针思维的表现。不行变类有一些长处,比方由于它的方针是只读的,所以多线程并发拜访也不会有任何问题。当然也有一些缺陷,比方每个不一样的状况都要一个方针来代表,能够会形成功能上的问题。所以Java规范类库还供给了一个可变版别,即StringBuffer。
猜你喜欢
- 迭代器模式,一直没用过,也不会用。恰巧MyBatis框架中也使用到了迭代器模式,而且看起来还比较简单,在以后的工作中,若有需要咱们可模仿它的
- 前段时间学习JDBC,要连接mysql获取数据。按照老师的样例数据,要存一些名字之类的信息,用的都是英文名,我当时就不太想用英文,就把我室友
- Spring AOP预处理Controller的参数实际编程中,可能会有这样一种情况,前台传过来的参数,我们需要一定的处理才能使用比如有这样
- 分页实现的基本过程是这样的:1. 设置自己的分页器的基本参数(可以从配置文件中读取)■每页显示的记录条数■每次最多显示多少页2. 编写设置分
- 返回json格式数据时间格式配置数据库里面查出来的时间是时间错格式,前段需要处理才能展示相应的格式,自己一个个转的话太麻烦,所以可以在apl
- 1.冒泡排序简介冒泡排序(Bubble Sorting)即:通过对待排序的序列从前往后,依次比较相邻元素的值,若发现逆序则交换位置,使较大的
- Java8Stream流操作List去重根据属性去重整体去重使用distinctArrayList<LabelInfoDTO>
- 什么是WebSocket WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket使得客户端和服务器之间
- Zuul作为网关服务,是其他各服务对外中转站,通过Zuul进行请求转发。这就涉及到部分数据是不能原封返回的,比如服务之间通信的凭证,用户的加
- 中断线程线程的thread.interrupt()方法是中断线程,将会设置该线程的中断状态位,即设置为true,中断的结果线程是死亡、还是等
- java使用stream实现list中对象属性的合并:根据两个List中的某个相同字段合并成一条List,包含两个List中的字段一、前言为
- 太多的if-else不太直观,难以维护。 以下面代码为例,展示几种替代if else的方法。String input = &quo
- 一次正常的请求最近别人需要调用我们系统的某一个功能,对方希望提供一个api让其能够更新数据。由于该同学是客户端开发,于是有了类似以下代码。@
- 使用第三方json转换工具,阿里巴巴json转换工具Fastjson1.2.7。https://www.jb51.net/softs/530
- 因为在准备讲Maven用Maven Helper插件的时候,在网上学习,发现资料很少,我就把自己研究的配置分享给大家!!IDEA(本人用的2
- 本文实例为大家分享了Unity实现俄罗斯方块游戏的具体代码,供大家参考,具体内容如下一、演示二、实现思路创建每一个方块可移动到的位置点,可以
- Maven 组件界面介绍 如上图标注 1 所示,为常用的 Maven 工具栏,其中最常用的有:第一个按钮:Reimport All
- Bean:在Spring技术中是基于组件的最基本了是最常用的单元其实实例保存在Spring的容器当中Bean通常被定义在配置文件当中,Bea
- 上一次接触到编码的知识,还是上大学的时候,那时候学的是通信工程专业,有关编码的内容,不记得是在通信原理还是信息论与编码里面学到的了。却依然记
- 本文实例为大家分享了Unity键盘WASD实现物体移动的具体代码,供大家参考,具体内容如下1首先在场景中建立一个Capsule,将主摄像机拖