集团主站
欢迎来到成都达内官方网站!达内—美国上市公司 亿元级外企IT培训企业!
成都it培训哪家好
成都it培训哪家好
全国服务监督电话:400-111-8989  |   联系客服   |
当前位置:主页 > 培训课程 > Java >

成都java培训:搞懂这3个问题Java新手即可升级!

发布者: 成都达内     浏览次数:     发布时间:2021-03-12 09:35:19

任何一个java初学者如果认为自己已经能够脱离初学者的范畴,那么都可以用以下的几个问题对自己进行考量。如果你还不能够弄懂这些问题,那么请将自己重新归入初学者的队伍中。...

  任何一个java初学者如果认为自己已经能够脱离初学者的范畴,那么都可以用以下的几个问题对自己进行考量。如果你还不能够弄懂这些问题,那么请将自己重新归入初学者的队伍中。

  问题一:我声明什么!

  String s = "Hello world!";

  许多人都做过这样的事情,但是,我们到底声明了什么?回答通常是:一个String,内容是“Hello world!”。这样模糊的回答通常是概念不清的根源。如果要准确的回答,一半的人大概会回答错误。

  这个语句声明的是一个指向对象的引用,名为“s”,可以指向类型为String的任何对象,目前指向"Hello world!"这个String类型的对象。这就是真正发生的事情。我们并没有声明一个String对象,我们只是声明了一个只能指向String对象的引用变量。所以,如果在刚才那句语句后面,如果再运行一句:

  String string = s;

  我们是声明了另外一个只能指向String对象的引用,名为string,并没有第二个对象产生,string还是指向原来那个对象,也就是,和s指向同一个对象。

  问题二:"=="和equals方法究竟有什么区别?

  ==操作符专门用来比较变量的值是否相等。比较好理解的一点是:

  代码如下:

  1 int a=10;

  2 int b=10;

  则a==b将是true。

  但不好理解的地方是:

  代码如下:

  1 String a=new String("foo");

  2 String b=new String("foo");

  则a==b将返回false。

  根据前一帖说过,对象变量其实是一个引用,它们的值是指向对象所在的内存地址,而不是对象本身。a和b都使用了new操作符,意味着将在内存中产生两个内容为"foo"的字符串,既然是“两个”,它们自然位于不同的内存地址。a和b的值其实是两个不同的内存地址的值,所以使用"=="操作符,结果会是false。

  诚然,a和b所指的对象,它们的内容都是"foo",应该是“相等”,但是==操作符并不涉及到对象内容的比较。

  对象内容的比较,正是equals方法做的事。

  看一下Object对象的equals方法是如何实现的:

  复制代码代码如下:

  1 boolean equals(Object o){

  2 return this==o;

  3 }

  Object对象默认使用了= =操作符。所以如果你自创的类没有覆盖equals方法,那你的类使用equals和使用==会得到同样的结果。同样也可以看出,Object的 equals方法没有达到equals方法应该达到的目标:比较两个对象内容是否相等。因为答案应该由类的创建者决定,所以Object把这个任务留给了类的创建者。

  看一下一个极端的类:

  复制代码代码如下:

  1 Class Monster{

  2 private String content;

  3 ...

  4 boolean equals(Object another){ return true;}

  5 }

  我覆盖了equals方法。这个实现会导致无论Monster实例内容如何,它们之间的比较永远返回true。

  所以当你用equals方法判断对象的内容是否相等,请不要想当然。因为可能你认为相等,而这个类的作者不这样认为,而类的equals方法的实现是由他掌握的。如果你需要使用equals方法,或者使用任何基于散列码的集合 (HashSet,HashMap,HashTable),请查看一下java doc以确认这个类的equals逻辑是如何实现的。


图片


  问题三:String到底变了没有?

  没有。因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。请看下列代码:

  复制代码代码如下:

  1 String s = "Hello";

  2 s = s + " world!";

  s所指向的方针能否改动了呢? 从本系列第一篇的定论很简单得出这个定论。咱们来看看发作了什么工作。在这段代码中,s原先指向一个String方针,内容是"Hello",然后咱们对 s进行了+操作,那么s所指向的那个方针能否发作了改动呢?答案是没有。

  这时,s不指向本来那个方针了,而指向了另一个String方针,内容为 "Hello world!",本来那个方针还存在于内存之中,仅仅s这个引证变量不再指向它了。

  经过上面的阐明,咱们很简单导出另一个定论,若是常常对字符串进行各式各样的修正,或许说,不行预见的修正,那么运用String来代表字符串的话会引起很大的内存开支。

  由于String方针树立之后不能再改动,所以关于每一个不一样的字符串,都需求一个String方针来表明。这时,应该思考运用StringBuffer类,它答应修正,而不是每个不一样的字符串都要生成一个新的方针。而且,这两种类的方针变换非常简单。

  一起,咱们还能够晓得,若是要运用内容一样的字符串,不用每次都new一个String。例如咱们要在结构器中对一个名叫s的String引证变量进行初始化,把它设置为初始值,应当这样做:

  复制代码代码如下:

  1 public class Demo {

  2 private String s;

  3 …

  4 public Demo {

  5 s = "Initial Value";

  6 }

  7 …

  8 }

  而非

  1 s = new String("Initial Value");

  后者每次都会调用结构器,生成新方针,功能低下且内存开支大,而且没有意义,由于String方针不行改动,所以关于内容一样的字符串,只需一个String方针来表明就能够了。也就说,屡次调用上面的结构器创立多个方针,他们的String类型特点s都指向同一个方针。

  上面的定论还根据这样一个现实:关于字符串常量,若是内容一样,广州Java培训以为它们代表同一个String方针。而用关键词new调用结构器,总是会创立一个新的方针,无论内容能否一样。

  至于为什么要把String类描绘成不变类,是它的用处决议的。其实不只 String,许多Java规范类库中的类都是不变的。在开发一个体系的时分,咱们有时分也需求描绘不行变类,来传递一组关联的值,这也是面向方针思维的表现。

  不行变类有一些长处,比方由于它的方针是只读的,所以多线程并发拜访也不会有任何问题。

  当然也有一些缺陷,比方每个不一样的状况都要一个方针来代表,能够会形成功能上的问题。所以Java规范类库还供给了一个可变版别,即StringBuffer。

  因此,学互联网技术不能犹豫,否则你就和高薪擦肩而过了。不论你是0基础还是转行,都有大牛老师手把手教你学习最新热门技术,找一份自己满意的高薪工作。

(责任编辑:范老师)
最新开班
  • 成都Java培训班
    免费试听名额发放中...
  • 成都C++培训班
    免费试听名额发放中...
  • 成都PHP培训班
    免费试听名额发放中...
  • 成都网络工程培训班
    免费试听名额发放中...
  • 成都Unity3D培训班
    免费试听名额发放中...
  • 成都大数据培训班
    免费试听名额发放中...
  • 成都uid培训班
    免费试听名额发放中...
  • 成都会计培训班
    免费试听名额发放中...
  • 成都Python培训班
    免费试听名额发放中...
  • 成都嵌入式培训班
    免费试听名额发放中...
  • 成都web培训班
    免费试听名额发放中...
  • 成都软件测试培训班
    免费试听名额发放中...
在线留言
提交

校区地址:成都市锦江区东大街紫东楼端35号明宇金融广场19楼1906室

联系电话:400-111-8989

公交路线:芷泉街(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:东门大桥站(地铁2号线)

校区地址:成都市高新区奥克斯广场蜀锦路209号一楼商铺

联系电话:400-111-8989

公交路线:益州大道锦城大道口(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:孵化园(地铁1号线)

校区地址:成都锦江区东大街芷泉街229号东方广场C座3楼303

联系电话:400-111-8989

公交路线:芷泉街(188路;115路;515路;236路;505路;501路;84路 ) 地铁路线:东门大桥站(地铁2号线)

校区地址:成都市武侯区佳灵路3号红牌楼广场2号写字楼11楼1115号

联系电话:400-111-8989

公交路线:红牌楼东(11路;92路;100路;111路;139路;g28路;快速公交K1/K2) 地铁路线:红牌楼站(地铁3号线)

校区地址:成都市锦江区红星路二段70号四川日报大厦502-2

联系电话:400-111-8989

公交路线:市二医院站(6路;49路;102路;5路;37路;g92路;) 地铁路线:地铁市二医院(地铁3号线)

校区地址:成都市锦江区东大街芷泉段229号东方广场C座16层

联系电话:400-111-8989

公交路线:芷泉街(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:东门大桥站(地铁2号线)

校区地址:四川省成都市武侯区高新科技孵化园9号园区E座7楼

联系电话:400-111-8989

公交路线:益州大道锦城大道口(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:孵化园(地铁1号线)

了解达内动态
关注成都达内教育公众号

首页 | 关于达内 | 课程中心 | 专家师资 | 视频教程 | 学员空间 | 校企合作 | 新闻资讯 | 就业指导 | 网站地图

2016-2025 达内时代科技集团有限公司 版权所有 京ICP证8000853号-56 蜀ICP备18021046号-3