java中几个重要的知识细节!

FL7D9V

FL7D9V

2016-02-19 15:58

人生本是一个不断学习的过程,在这个过程中,图老师就是你们的好帮手,下面分享的java中几个重要的知识细节!懂设计的网友们快点来了解吧!

问题一:我声明了什么!

String s = "Hello world!";

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

这个语句声明的是一个指向对象的引用,名为“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这个引用变量不再指向它了。

展开更多 50%)
分享

猜你喜欢

java中几个重要的知识细节!

编程语言 网络编程
java中几个重要的知识细节!

JAVA中最为关键的几个知识点

编程语言 网络编程
JAVA中最为关键的几个知识点

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

Java的网络知识

编程语言 网络编程
Java的网络知识

Java基础知识 Java中抽象类和接口的区别

编程语言 网络编程
Java基础知识 Java中抽象类和接口的区别

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

几个不错的java网站

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
几个不错的java网站

日常生活中的几个乳房保健知识

生活小常识
日常生活中的几个乳房保健知识

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

高效J2ME应用程序秘诀二十招

高效J2ME应用程序秘诀二十招

jquery 上下滚动广告

jquery 上下滚动广告
下拉加载更多内容 ↓