1.在effective java 中,equals和hashcode 必须同时更新。 问:什么时候可以不用同时更新?
2.重写toString方法必须要重写equals吗,为什吗?
3.SQL查询模式有哪些?
4,Object类中==和equals有区别吗,为什吗?
1,equals是可以暴露出来你重构的,你想怎么改怎么改,判断的逻辑是你自己的代码。只是说一般判断这个对象是否相等是与hashcode相关的。
2,重写toString不一定需要重写equals。原因:不太相关。
3,[quote]SQL查询模式有哪些?[/quote]这句话不太理解。
4,没有区别,证据如下,object的equals方法源码是
[code="java"] public boolean equals(Object obj) {
return (this == obj);
}[/code]
只是string类型的去重写了equals方法。
[code="java"]•public String toString() 返回该对象的字符串表示。通常,toString方法会返回一个“以文本方式表示”此对象的字符串。 结果应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法。 默认的情况是:getClass().getName() + '@' + Integer.toHexString(hashCode()) 如: System.out.println(obj); 将打印出 obj的全路径名@hashCode
•public boolean equals(Object obj) 指示其他某个obj对象是否与此对象“相等”。 注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。 view plaincopy to clipboardprint?01. 02.@Override 03. public boolean equals(Object obj){ 04.if (obj instanceof Name){//首先判断是否属于这个Name类的实例 05.Name name = (Name) obj; //强制转换成Name,相当于过滤其他不必要的属性 06.return (fname.equals(name.fname)&&lname.equals(name.lname));//自定义比较成员域 07. } 08.return super.equals(obj);//调用父类的equals方法 09. }
@Override
public boolean equals(Object obj){
if (obj instanceof Name){//首先判断是否属于这个Name类的实例
Name name = (Name) obj; //强制转换成Name,相当于过滤其他不必要的属性
return (fname.equals(name.fname)&&lname.equals(name.lname));//自定义比较成员域
}
return super.equals(obj);//调用父类的equals方法
}
•public int hashCode() 返回该对象的哈希码值。支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能。 首先,想要明白hashCode的作用,你必须要先知道Java中的集合。 总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set。 这里就有一个问题了:要想保证Set元素不重复,可两个元素是否重复应该依据什么来判断呢? 这就是Object.equals方法了。但是,如果每增加一个元素就检查一次,那么当元素很多时,后添加到集合中的元素比较的次数就非常多了。 也就是说,如果集合中现在已经有n个元素,那么第n+1个元素加入集合时,它就要调用n次equals方法。这显然会大大降低效率。 于是,Java采用了哈希表的原理。哈希算法也称为散列算法,是将数据依特定算法直接指定到一个地址上。如果详细讲解哈希算法, 那需要更多的文章篇幅,我在这里就不介绍了。初学者可以这样理解,hashCode方法实际上返回的就是对象存储的物理地址(实际可能并不是)。 这样一来,当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。 如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了, 就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。 所以这里存在一个冲突解决的问题。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。
•public int compareTo(Object obj) 比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数.
例:
view plaincopy to clipboardprint?
01.import java.util.ArrayList;
02.import java.util.Collections;
03.import java.util.List;
04.
05.
06.public class Test{
07. public static void main(String[] args){
08. List list = new ArrayList();
09. list.add(new Name("f2","l2"));
10. list.add(new Name("f5","l5"));
11. list.add(new Name("f1","l1"));
12. list.add(new Name("f3","l3"));
13.
14. Collections.sort(list);
15. System.out.println(list);
16. }
17.
18.class Name implements Comparable{
19. private String fname,lname;
20. Name(String fname,String lname){
21. this.fname = fname;
22. this.lname = lname;
23. }
24. public String getFname(){
25. return fname;
26. }
27.
28. public String getLname(){
29. return lname;
30. }
31.// getClass().getName() + '@' + Integer.toHexString(hashCode())
32. @Override
33. public String toString(){
34. return fname+" "+lname;
35. }
36.// @Override
37. public boolean equals(Object obj){
38. if (obj instanceof Name){
39. Name name = (Name) obj;
40. return (fname.equals(name.fname)&&lname.equals(name.lname));
41. }
42. return super.equals(obj);
43. }
44.// Returns a hash code value for the object
45. @Override
46. public int hashCode(){
47. return fname.hashCode();
48. }
49.// this method is service for object compareTo each other collection sort()
50. public int compareTo(Object obj){
51.
52. Name n = (Name) obj;
53. int lastCmp = lname.compareTo(n.lname);
54. int firstCmp = fname.compareTo(n.fname);
55. return (lastCmp != 0 ? lastCmp : firstCmp) ;
56.
57. }
58.
59.
60.
61.}
[/code]
[code="java"]SQL查询模式有哪些?
sql hql 一般常用2种
[/code]
[code="java"]Object类中==和equals有区别吗,为什吗?
一般情况下equal表示的是内容相同,==表示的是引用相同。
比如 String s1 = new String("string"); String s2 = new String("string"); 则 s1.equals(s2)为true,s1==s2为false。
如果 String s3 = s1; 则s1.equals(s3)和s1==s3均为true。
object类的equal好像是直接比较==的,所以如果自定义类的话,一般是要求重写equal方法的。object类只是提供这个统一的方法而已,内容要自己定义。
[/code]
[quote]恩,谢谢,我说的查询模式就是SQL如何优化的问题,除了建立索引还有什么方法优化SQL语句?[/quote]
客气了
优化sql不是一下说得了的,而且也分数据库服务器的状况。比如mysql,还分不同的引擎,每种引擎针对事务有不同的方案。大体上sql优化主要是 减少查询字段 ,比如select 字段 比select *好;建立索引,索引最好是建立相关性更少的,比如性别就只有男女,每次索引可以去掉一半,效果很好,一半索引建立的字段是where后面的条件字段;用group by的时候,并且不用排序的时候,尽量 order by null,因为group by默认会给你排序,排序也是需要性能的,所以你手动关掉排序。还有很多,这个是需要自己慢慢优化的。
java的视频资料可以来看看这里,感觉对于java面试题中的问题都有详细的介绍到[url]http://javaee.3g-edu.org/shipin/?lbjeye[/url]