《Java技术》第二次作业
《Java技术》第二次作业
(一)学习总结
1.学习使用Eclipse关联jdk源代码,查看String类的equals()方法,截图,并学习其实现方法。举例说明equals方法和==的区别。
==:比较的是两个字符串的地址。
equals()方法:比较两个字符串内容是否相等
例子:
public class Test1 {
public static void main(String[] args) {
String str1="hello";
String str2=new String("hello");
String str3 = str2;
String str4 = "hello";
System.out.println("==方法:");
System.out.println("str1 == str2 --> " + (str1 == str2));
System.out.println("str1 == str3 --> " + (str1 == str3));
System.out.println("str2 == str3 --> " + (str2 == str3));
System.out.println("str1 == str4 --> " + (str1 == str4));
System.out.println("equals方法:");
System.out.println("str1 equals str2 --> " + (str1.equals(str2)));
System.out.println("str1 equals str3 --> " + (str1.equals(str3)));
System.out.println("str2 equals str3 --> " + (str2.equals(str3)));
System.out.println("str1 equals str4 --> " + (str1.equals(str4)));
}
}
2.什么是构造方法?什么是构造方法的重载?下面的程序是否可以通过编译?为什么?
(1)构造方法:
构造方法用于在创建对象时对其进行初始化。
(2)构造方法的重载:
方法的重载就是方法名称相同,但参数的类型和参数的个数不同,通过传递参数的个数及类型不同以完成不同功能的方法调用。
(3)下面的程序不能通过编译,因为构造构函数Foo()未定义
public class Test {
public static void main(String args[]) {
Foo obj = new Foo();
}
}
class Foo{
int value;
public Foo(int intValue){
value = intValue;
}
}
3.运行下列程序,结果是什么?查阅资料,分析为什么。
结果是“不等于0.3”。
原因:精度缺失,计算机是二进制的,double是浮点型的,无法用二进制精确表示。
public class Test {
public static void main(String args[]) {
double a = 0.1;
double b = 0.1;
double c = 0.1;
if((a + b + c) == 0.3){
System.out.println("等于0.3");
}else {
System.out.println("不等于0.3");
}
}
}
修改后的程序:
import java.math.BigDecimal;
public class Test {
public static double add(double a,double b,double c){
BigDecimal a1 = new BigDecimal(a);
BigDecimal b1 = new BigDecimal(b);
BigDecimal c1 = new BigDecimal(c);
return a1.add(b1).add(c1).doubleValue();
}
public static double round(double d,int len){
BigDecimal a1 = new BigDecimal(d);
BigDecimal b1 = new BigDecimal(1);
return a1.divide(b1,len,BigDecimal.ROUND_HALF_UP).doubleValue();
}
public static void main(String[] args){
System.out.println("等于"+Test.round(Test.add(0.1,0.1,0.1),1));
}
}
4.运行下列程序,结果是什么?分析原因,应如何修改。
对象数组只是声明了,没有实例化
public class Test {
public static void main(String[] args) {
MyClass[] arr=new MyClass[3];
arr[1].value=100;
}
}
class MyClass{
public int value=1;
}
修改为:
public class Test {
public static void main(String[] args) {
MyClass[] arr=new MyClass[3];
for(int i=0;i<3;i++){
arr[i]=new MyClass();
}
arr[1].value=100;
}
}
class MyClass{
public int value=1;
}
5.在一个10000次的循环中,需要进行字符串的连接操作,那么,应该使用String类还是StringBuffer类,为什么?性能有差异吗?能否写出测试代码证明你的结论。
应该用StringBuffer类。
- String类表示的字符串是常量,创建之后内容和长度都不能改变。
- StringBuffer类表示字符容器,内容和长度可以随时修改。
- 在操作字符串时,如果该字符串仅用于表示数据类型,则使用String类型,如果需要对字符串进行增删操作,则使用StringBuffer类。
String类
public class Test1 {
public static void main(String args[]) {
String str="Hello";
for (int i=0;i<10000;i++) {
str=str+" world!";
}
System.out.println(str);
}
}
StringBuffer类
public class Test1 {
public static void main(String args[]) {
StringBuffer buf=new StringBuffer("Hello");
for (int i=0;i<10000;i++) {
buf.append(" World!");
}
System.out.println(buf);
}
}
(二)实验总结
1.评分系统
- 程序设计思路:用for循环输入每个选手的成绩,然后在for循环里再写一个for循环求出最大值和最小值,接着用循环求成绩总和,循环之后,在外循环内再让成绩总和减去最大值最小值,最后求平均值(将平均值强制转换成float型)并且输出,将求出来的五位选手的平均值放入一个新的数组里输出,最后让这些平均值用Java类库完成排序操作使其从大到小输出。
- 实验问题分析:
问题1:求平均值时,成绩的总和没有减去最大值和最小值。
原因: 将求最大值最小值的程序写在循环外(输入选手成绩之前)了,所以最大值最小值求不出来。
解决方案:将求最大值最小值的程序写在输入成绩的程序之后,这样最大值和最小值就可以求出来了。
问题2:将平均值放入一个新的数组时,只是将最后一个选手的平均值放进去了,前面四位选手的平均值并没有放入。
原因:将新数组的赋值写在了循环外,这样赋值给新数组的值就是最后一组循环完的数据,即第五位选手的平均值。
解决方案:将赋值的语句写在外循环内,即求平均值的程序后面,并将定义新数组的语句写在外循环之前。
问题3:提示有错误
原因:数组名写错了,写成了变量avg
解决方案:将变量名avg改为数组名newArr
2.Email验证
-
程序设计思路:输入一个email地址,然后查找“@”和“.”是否同时存在,在String中使用indexOf()方法,可以返回指定的字符串的位置,如果不存在返回-1。并且可以通过返回字符串的位置判断“@”的位置是否在“.”之前 ,如果“@”的位置下标小于“.”的位置下标,则证明“@”在“.”之前。在String中使用startsWith()方法可以判断字符串是否以指定的内容开头,使用endsWith()方法可以判断字符串是否以指定的内容结尾。
-
实验问题分析:
问题1:无法输入字符串
原因:输入语句有错误Scanner input=new Scanner(System.in); System.out.println("请输入email地址:"); String str=input.nextString();
解决方案:将
String str=input.nextString();
改为String str=input.next();
问题2:截取字符串的语句出现问题,“未对参数类型 String, boolean 定义运算符 &&”。
原因:str.substring(str.indexOf(".")+1
语句不能直接放在if里
解决方案:定义一个新的变量String str1,将截取的字符串赋值给str1,然后让str1同email地址的标准结尾作比较String str1=str.substring(str.indexOf(".")+1); if(str.indexOf("@")!=-1&& str.indexOf(".")!=-1&& str.indexOf("@")<str.indexOf(".")&& str.indexOf("@")!=0){ if(str1.equals("com")|| str1.equals("cn")|| str1.equals("net")|| str1.equals("gov")|| str1.equals("edu")|| str1.equals("org"))
(三)代码托管
- 码云commit历史截图