当前位置: 首页 > 后端技术 > Java

cs61bweek5--ObjectMethods

时间:2023-04-01 17:28:25 Java

(2020之后的版本,2018年写的ArrayMap改成了ArraySet,所以下面的案例都是基于ArraySet)所有的类都隐式继承了Object,包含了Object的如下方法:StringtoString()booleanequals(Objectobj)ClassgetClass()inthashCode()protectedObjectclone()protectedvoidfinalize()voidnotify()voidnotifyAll()voidwait()voidwait(longtimeout)voidwait(longtimeout,intnanos)这节课,我们将重点关注前两个方法1.toString()每当你调用System.out.println(x)时,不管x的原始类型是什么,一个隐式转换,System.out.println(Objectx)调用x.toString()(如果你好奇:println调用String.valueOf调用toString)Stringx=x.toString();System.out.println(x);Object默认的toString()方法转换后的格式为:类名@hex_memory类名@16进制内存地址。因此,如果我们打印自己写的ArraySet,结果是:$javaArraySetPrintDemoArraySet@75412c2f但是Java.util内置的List、Set、Map都覆盖了Object原有的toString()方法,所以如果我们使用内置列表:publicstaticvoidmain(String[]args){Lista=newArrayList<>();一个.add(1);a.添加(2);a.添加(3);m.out.println(a);}会打印出一个赏心悦目的结果:[1,2,3]我们的目标是让我们自己的ArraySet也打印出这个漂亮的结果,也就是我们需要Override原来的toString()首先回顾一下我们的ArraySet:publicclassArraySet实现Iterable{privateT[]项目;私有整数大小;//下一个要添加的项目将位于位置大小publicArraySet(){items=(T[])newObject[100];大小=0;}/*如果此映射包含指定键的映射,则返回true。*/publicbooleancontains(Tx){for(inti=0;iaset=newArraySet<>();aset.add(5);aset.add(23);aset.add(42);//toStringSystem.out.println(aset);}解决方法:@OverridepublicStringtoString(){StringreturnString="{";for(inti=0;io=(ArraySet)其他;如果(o.size()!=this.size()){返回false;}for(Titem:this){if(!o.contains(item)){returnfalse;}}返回真;}getClass()方法是返回当前Object的类类型,例如this.getClass()=ArraySet.class总结:.equals()的重写,请特别注意判断这几种情况:如果object为null,返回false检查比较对象的类类型是否相同(.getclass())如果和自己比较直接返回true,不要进入后面的if-else判断(性能优化)3.偶更好的toString()和ArraySet.of()String.join()还有一种方法可以实现字符串拼接,使用String.join()@OverridepublicStringtoString(){ListlisOfItems=newArrayList<>();for(Tx:this){lisOfItems.add(x.toString());}return"{"+String.join(",",lisOfItems)+"}";}.Of()回想一下之前做的lab,我们使用.Of()创建一个List,或者Set,例如:Set<整数>javaset=Set.of(5,23,42);可以创建一个内容为{5,23,42}的Set,非常方便。因此,我们要实现自己的.Of()方法,使得达到上面的效果成为可能<>();for(Glerpx:stuff){returnSet.add(x);}returnreturnSet;}语法要点:泛型方法,在方法返回类型前加,如前面笔记所述Varargs:...Variable-lengthparameters在Java5中提供了变长参数,允许变长参数在调用方法时传入。可变长度参数是Java的语法糖。它们本质上是基于数组的实现。Java的可变参数会转化为数组voidfoo(String...args);voidfoo(String[]args);查看此链接了解更多