java小点滴

来源:互联网 发布:我的世界枪械js设置 编辑:程序博客网 时间:2024/06/05 02:11

1.= = 和 equals()方法

= = 比较是否指向同一个引用,而equals()比较值

equals()原形

boolean equals(object obj)

{

return this == obj;

}

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逻辑是如何实现的。

2.string是否已经改变

string s = "hello";

s = s + " world!";

s所指向的对象是否改变了呢?

答案是没有,因为string被设计成不可变(immutable)类,所以它的所有对象都是不可变对象.

过程:s是一个string的引用变量,它指向的内容为 "hello",然后我们对 s (不是"hello")进行了 + 操作,此时,s所指向的仍是一个string的变量,内容为"hello world",而原来那个 "hello"仍存在于内存中,只不过s不指向它了.

3.声明变量时,初始化尽量放到构造函数中,这样可以减少不必要的开支.

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。

3.关于tostring()

每个非primitive对象都有一个tostring()方法,当编译器需要一个string而它却是一个对象的时候,编译器就会自动的调用这个方法,而不需要对象类的对象.tostring()调用。

可以在自己的类中重写tostring()来达到此功能。

class source

{

private string s;

public source()

{

s = new string("returnsource");

}

public string tostring()

{

return s;

}

}

public class tostringtest

{

source se = new source();

private string str = "aaaa";

private string str2 = "bbb";

public string tostring()

{

return str + str2 + se;

}

public static void main(string[] str)

{

tostringtest tt = new tostringtest();

system.out.println(tt);

/////////////result is "aaaabbbreturnsource"

}

}

4.public static void mian(string str[]){}//方法

每个类都可以有一个main()方法作为测试,类可以不是public,只要main()是public的就行。

当 java 类(运行此类)时 ,编绎器会自动调用类.main()方法。


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
原创粉丝点击