java String类实验作业随笔
1.利用jdk帮助文档
equals和的区别
== 操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用操作符。如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = new Object();
变量obj是一个内存,new Object()是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。
equals()方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。
例如,对于下面的代码: String a=new String("foo"); String b=new String("foo"); 两条new语句创建了两个对象,然后用a,b这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即a和b中存储的数值是不相同的,所以,表达式ab将返回false,而这两个对象中的内容是相同的,所以,表达式a.equals(b)将返回true。在实际开发中,我们经常要比较传递进行来的字符串内容是否等,例如,String input = …;input.equals(“quit”),许多人稍不注意就使用进行比较了,这是错误的,随便从网上找几个项目实战的教学视频看看,里面就有大量这样的错误。记住,字符串的比较基本上都是使用equals()方法。如果一个类没有自己定义equals()方法,那么它将继承Object类的equals()方法,Object类的equals()方法的实现代码如下: boolean equals(Object o){ return thiso; } 这说明,如果一个类没有自己定义equals()方法,它默认的equals()方法(从Object 类继承的)就是使用操作符,也是在比较两个变量指向的对象是否是同一对象,这时候使用equals()和使用==会得到同样的结果,如果比较的是两个独立的对象则总返回false。如果你编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖equals()方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。
对于Person类的2个实体化对象P1与P2来说,他们被new出来后,占用的是不同的存储单元的,所以他们的地址并不相同,因此p1.equals(p2)为false 。
如果需要返回的结果为true,你必须重写equals方法。
例如在Person类里面重写equals方法(假设Person里面成员变量i的值相等就可以认为两个对象相等):
public boolean equals(Person p) {
if(this.i == p.i) {
return true;
} else {
return false;
}
}
}
2。程序分析
1.构造方法
在Java程序中,我们可以使用系统默认的构造方法,即我们不自己创建构造方法时。此时,我们只需要定义类中其他的方法及属性,而不必定义构造方法。构造方法在创建对象时会自动调用,执行构造方法内的内容。
2.如果我们要使用自己的构造方法。此时,我们要显式地创建构造方法。构造方法有以下两个要点:
(1)构造方法的名称是与类名相同的;
(2)构造方法没有返回值,即方法名前没有void,int等数据类型,方法体内没有return语句;
3.构造方法的格式如下: class 类名称A{ 数据类型 变量名;//定义其他的变量及其方法 访问权限 类名称A(参数1,参数2,参数3){ 程序语句; ... //构造方法没有返回值 } }
提示:
(1)参数格式为:数据类型 数据名称 其定义的变量可以在方法内使用,常用来传递数据。而在本方法体外是没有办法访问的,亦可理解为局部变量。
(2)访问权限:private public protected 表示的权限,在以后的经验中我们会讲到。这里我们使用时,可以先使用public即(公有的),访问权限最大
4,重载
所谓方法的重载就是方法名相同,但参数的名称和参数的个数不同而已,通过传递的参数类型和个数不同起到不同的 效果。
第一个程序不可以运行,是因为它的构造方法在类的外部定义的,应该在类的内部定义,内部实现,而且他的构造方法没有属性,应该 public Foo(int intValue){value = intValue;}放在类里面,把类名称改成Foo,或者更改方法名称也可以,就可以传递与调用了。
3.程序分析##
结果不等于0。3,是因为它是double类型的利用BigDecimail类应该这样修改
4.程序分析##
我认修改的程序应该是这样
把test2类内定义一个私有成员 value,之后再利用引用把一维数组arr类内引用了,就行了。
5.分析##
非可变对象一旦创建之后就不能再被改变,可变对象则可以在创建之后被改变。
String对象是非可变对象,StringBuffer对象则是可变对象。
为获得更佳的性能你需要根据实际情况小心谨慎地选择到底使用这两者中的某一个
而题目中第七行text = text.append (“C”),append方法会改变text中的值
而这个text与main中的textBuffer是指向同一个对象,所以对应的输出是javac。
string的值永远不会改变!
String a = "a";//假设a指向地址0x0001,
a = "b";//重新负值后a指向地址0x0002,但0x0001地址中保存的"a"依旧存在,但已经不再是a所指向的。
从表面上看String类型的对象改变了值,但事实是他不能改变值,只能改变指向的地址
StringBuffer则不同,直接改变指向的地址中保留的值
StringBuffer s1 = new StringBuffer("a");
StringBuffer s2 = new StringBuffer("a");
s1.equals(s2)//为什么是false
String s1 = new String("a");
String s2 = new String("a");
s1.equals(s2)//为什么是true
就是因为StringBuffer类中没有重新定义equals这个方法,因此这个方法就来自Object类,
而Object类中的equals方法是用来比较地址的,所以等于false.
String类中重新定义了equals这个方法,而且比较的是值,而不是地址。所以会是
true。
6.学习心得##
1.程序设计思路:就是第一个投票的利用Random类产生5名嘉宾的投票分数,再分别类似c语言,分别写求最大值,最小值,平均值和排序方法即可。
遇到的问题:就是不知道如何去掉最大值最小值的问题就是
解决的方法:就是总结果的时候减去即可
2.程序设计思路:就是开始利用各种方法endwith,starewith方法判断开头和结尾,用indexof判断位置
遇到的问题:不知如何比较"@"和"."的先后位置
解决的方法:可以利用判断位置的大小或者是利用码值