Java第二次作业

(一)学习总结#

1.学习使用Eclipse关联jdk源代码,查看String类的equals()方法,截图,并学习其实现方法。举例说明equals方法和==的区别。

  • 按着ctrl,点equals()就会出现一个小手,就可以查看实现方法
  • 比较的是地址。equals方法比较两个对象的内容。当equals为true时,不一定为true。
  • 例子(因为s1 ,s2分别引用了两个"Monday"String对象,所以s1 != s2 s1 equals s2)

2.什么是构造方法?什么是构造方法的重载?下面的程序是否可以通过编译?为什么?

public class Test {
    public static void main(String args[]) { 
       Foo obj = new Foo();       
    }     
}
class Foo{
    int value;
    public Foo(int intValue){
        value = intValue;
    }
}
  • 构造方法是一种特殊的方法,它是一个与类同名且没有返回值类型的方法。对象的创建就是通过构造方法来完成,其功能主要是完成对象的初始化。当类实例化一个对象时会自动调用构造方法。而且不管你写不写构造方法,系统都会自动写一个无参数的构造方法
  • 由于构造方法的参数的不同,我们可以重载构造方法,以适应对不同参数的初始化。构造方法的重载可以通过两个方面来重载:参数的不同,以及参数数据类型的不同。
  • 不能通过编译。因为构造函数 Foo()未定义。改成 Foo obj = new Foo(0);

3.运行下列程序,结果是什么?查阅资料,分析为什么。为了处理精度损失的问题,可以使用java.math.BigDecimal类,查阅JDK帮助文档或教材p378,对上述程序进行修改。

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");
        }
    }     
}
  • 结果是不等于0.3
  • 原因是精度损失
  • 需要使用java.math.BigDecimal计算准确结果,所以改为如下:
import java.math.BigDecimal;
public class Test {
    public static void main(String args[]) { 
        BigDecimal a = new BigDecimal("0.1");
        BigDecimal b = new BigDecimal("0.1");
        BigDecimal c = new BigDecimal("0.1");
        if(a.add(b).add(c).doubleValue()==0.3){
            System.out.println("等于0.3");
        }
        else {
             System.out.println("不等于0.3");
        }
    }
}

4.运行下列程序,结果是什么?分析原因,应如何修改.

  • 程序无法运行
  • 应改为如下
public class test {
public static void main(String[] args) {
    MyClass arr=new MyClass();
    arr.value=100;
}
}
class MyClass{
    public int value=1;
}

5.在一个10000次的循环中,需要进行字符串的连接操作,那么,应该使用String类还是StringBuffer类,为什么?性能有差异吗?能否写出测试代码证明你的结论。

  • 应该使用StringBuffer类
  • string是常量,stringBuffer是变量

6.其他需要总结的内容。

  • 学习了string类的很多方法subString,equalsIgnoreCase,了解了什么是下标越界

(二)实验总结#

实验内容:
1.评分系统:一共10个评委,满分10分,假设有5个选手,分别由评委打分,去掉一个最高分和一个最低分后的平均分为该选手得分,将选手的得分从高到低进行输出。定义适当的方法。

  • 程序设计思路:用一个二维数组存放行号和列号,行号代表是哪个选手,列号代表是哪个评委;用双层循环控制输出10个评委给五个选手的成绩,外层循环控制是第几个选手,内层循环控制是第几个评委,求平均分的函数,先假设第一个评委给第一个选手的得分是最高分,然后依次跟它比较,比他大,就用新的行列标号代替原来的最高分的行列号,求最低分与求最高分类似;最后把每行的成绩相加,再减去求得的每行的最高分和最低分,即为每个人的最后得分;调用排序方法对成绩再进行排序,不过这是从低到高排序,最后要用一个for循环倒着输出结果,就是从高到低的结果啦
  • 问题1:总是先输出第1,2,3....10位评委给第一个选手的成绩,不是想要的输入方式
  • 原因:外层循环和内层循环的内容搞混啦
  • 解决方案:让外层循环控制行号,控制选手的序号;内层循环控制列号,控制评委的序号
  • 问题2:程序显示无错误,但运行之后平均分都是零分
  • 原因:下标越界,返回值没搞清楚,方法调用的不对
  • 解决方案:把下标从一开始改为从零开始,求最大值的方法,返回的时候不止返回最大值的存放行列标号的二维数组,也返回行号i,这样可以知道是哪个选手的最高分和最低分
  • 问题1:总是先输出第1,2,3....10位评委给第一个选手的成绩,不是想要的输入方式
  • 原因:外层循环和内层循环的内容搞混啦
  • 解决方案:让外层循环控制行号,控制选手的序号;内层循环控制列号,控制评委的序号

2.Email验证:在各种应用中,需要对用户输入的email地址进行验证,编写一个方法,判断一个email地址是否有效。(判断条件:A:@和.同时存在 B: @在.之前 C: 不能@开头 D: 以com|cn|net|gov|edu|org结尾 )

  • 程序设计思路:调用方法indexOf寻找字符串@和.找不到,就返回-1,看@的下标是否比.的下标小;调用方法boolean endsWith判断是否以要求的字符串结尾,如果这些都符合,返回True,有一项不符合,就返回False
  • 问题1:有些不正确的email地址,也输出结果True
  • 原因:少了一个else
  • 解决方案:添加一个else
  • 问题2:不知道用什么方法判断是否以指定的字符串结尾,怎样找到要求的字符串
  • 原因:string类的方法还是使用的不熟练
  • 解决方案:调用String类方法boolean endsWith和indexOf
  • 问题1:程序没错误,但是不判断结果
  • 原因:调用判断方法的时候不正确
  • 解决方案:正确调用方法,写方法的时候加上参数str

(三)代码托管#

posted @ 2017-03-26 17:38  长长长长的街道  阅读(183)  评论(0编辑  收藏  举报