Java第二次作业

时间:2021-08-02 21:55:14

一、学习总结

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

  • Eclipse关联jdk源代码方法:
    • 右键项目---构建路径---配置构建路径---Java构建路径---库---JRE系统库---rt.jar---源代码连接---编辑“源代码连接”---设置“外部文件”的路径为JDK安装路径下的src.zip。如图:
      Java第二次作业
  • String类的equals()源代码:
    Java第二次作业
  • String类的equals()区别:
    • ==方法是用来进行地址值比较的
    • equals方法则是判断两个字符串的内容是否相等,是String类专门提供的方法。
  • 具体例子如下:
package test;
public class Test {
public static void main(String args[]){
String a="hello";
String b=new String("hello");
if(a.equals(b))//比较内容
System.out.println("相等");
else
System.out.println("不想等");
if(a==b)//比较地址
System.out.println("相等");
else
System.out.println("不想等");
}
}
  • 输出结果为:
    相等
    不相等
  • 原因:执行String b=new String("hello");时,系统会在堆内存中给"hello"新建空间并存放,堆内存中有两个"hello"分别占不同的内存,内存地址由栈内存中的a、b分别指向。==比较的是地址,所以不相等。equals比较的内容,所以相等。

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

public class Test {
public static void main(String args[]) {
Foo obj = new Foo();
}
}
class Foo{
int value;
public Foo(int intValue){
value = intValue;
}
}
  • 题目中所给的程序不能通过编译。
  • 原因:在构造方法中有一个整型参数,而主函数调用构造方法时没有给参数。
  • 我理解的构造方法就是:先定义一个类,在这个类里面写一个和类名一样的方法,构造方法里面没有返回值,在构造方法里面有private public protected三种,其中public权限最大。
  • 我理解的重载构造方法就是:在一个类里,有方法名和类名相同,参数个数不同或参数类型不同的方法。
  • 具体例子如下:
class Foo{//定义Test类
String name;
public Foo(){//默认的构造方法
System.out.println("null");
}
public Foo(int age){//一个int参数的构造方法
int ages;
ages=age;
System.out.println(ages);
}
public Foo(String name){//一个String参数的重载构造方法
String names;
names=name;
System.out.println(names);
}
public Foo(String name,int age){//两个参数的重载构造方法
String names;
int ages;
names=name;
ages=age;
System.out.println(names+"年龄为:"+ages);
}
}
class Test{
public static void main(String args[]) {
Foo obj1 = new Foo();
Foo obj2 = new Foo(18);
Foo obj3 = new Foo("zhangsan");
Foo obj4 = new Foo("zhangsan",18);
}
}

3.运行下列程序,结果是什么?查阅资料,分析为什么。

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
  • 原因:double类型为浮点型的不能精确计算结果。计算机是二进制的,浮点数没有办法是用二进制进行精确表示,浮点在保存小数的过程中有很大的可能会损失精度。必须用BigDecimal类精确计算。
  • 修改后的程序:
import java.math.BigDecimal;
public class Test {
public static void main(String args[]) {
BigDecimal a1 = new BigDecimal("0.1");;
BigDecimal b1 = new BigDecimal("0.1");
BigDecimal c1 = new BigDecimal("0.1");
if(a1.add(b1).add(c1).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[3];
arr[1].value=100;
}
}
class MyClass{
public int value=1;
}
  • 运行结果:
    Java第二次作业
  • 原因:对象数组只声明了,此时对象数组为null,数组里的每个元素都是一个对象,使用前必须要先实例化。
  • 修改后程序:
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类比StringBuffer类的程序运行到终止稍微慢一点。):
package test;
public class Test {
public static void main(String args[]){
int i;
String str="hello";//String类
for(i=0;i<10000;i++){
str=str+"world";
}
System.out.println(str);
}
}
package test;
public class Test2 {
public static void main(String args[]){
int i;
StringBuffer buf=new StringBuffer();//StringBuffer类
buf.append("hello");
for(i=0;i<10000;i++){
buf.append("world");
}
System.out.println(buf);
}
}

二、实验总结

1.评分系统

  • 程序设计思路:
    • 在主方法中,先让是个评委分别给五个选手评分;再调用求平均分的方法和分数排序方法;最后输出每个选手的平均分,并且从高到低输出每个选手的分数。
    • 在求平均分中方法中调用了求最大值和最小值的方法来实现。
    • 排序方法中,运用冒泡排序法实现。
  • 问题1:求出平均分都为负值。
  • 原因:每个选手多次减去了最大分和最小分。
  • 解决方案:应该放在算总分的循环外。
for(i=0;i<grade.length;i++){
max[i]=max(grade,i);
min[i]=min(grade,i);
for(j=0;j<grade[i].length;j++){
avg[i]=avg[i]+grade[i][j];
}
avg[i]=avg[i]-max[i]-min[i];
avg[i]=avg[i]/(grade[i].length-2);
}

2.Email验证

  • 程序设计思路:
    • 在主方法中,先输入一个字符串;再调用判断地址是否有效的方法;最后判断是否有效并在屏幕输出。
    • 在判断是否有效方法中,返回值为整型1:有效,0:无效;判断中用String类中常用方法。
if(email.indexOf("@")<email.indexOf(".")){
}

3.统计文件

  • 程序设计思路:
    • 在主方法中,先输入一个字符串;再调用拆分首字母变大写的方法;然后调用统计各种文件个数的方法;最后分别输出各以大写字母开头的文件名和各种文件个数。
    • 在拆分首字母变大写的方法中,将字符串以","拆分放在一个字符串数组中,再将其首字母变大写。
    • 在统计各种文件个数的方法中,先截取扩展名放在数组中,再用两层循环从第一个扩展名开始一趟一趟的比较看是否有相同的,统计个数,并把后面的文件名与待比较的文件名相同的内容赋值为空,并在每趟比较时判断是否为null。
  • 问题1:运行程序文件名只输出了首字母。
  • 原因:只是取出了每个文件首字母,并改为了大写赋给一个字符串数组
  • 解决方案:将除首字母之外的字符串取出,连接到变大写的首字母后面,赋给一个字符串数组。部分代码如下:
for(i=0;i<file.length;i++){//把每个文件名第一个 字母变大写
file[i]=file[i].substring(0, 1).toUpperCase()+file[i].substring(1);
}
  • 问题2:程序不能正常运行,错误指向了:!file_ex[i].equals(null)行。
  • 原因:因为file_ex[i]存放的是一个字符串,而null是一个对象,而equals语句是字符串之间的比较。
  • 解决方案:问了一下老师,将此语句改为file_ex[i]!=null直接比较。

4.身份证识别

  • 程序设计思路:
    • 在主方法中,先声明一个存放地区的二维数组并赋初值;再输入一个身份证号,调用求生日方法,判断性别函数和判断地区方法;最后输出生日、性别和地址。
    • 在求生日的方法中,运用了用截取指定位置字符串String类常用方法,并把字符串相加实现。
    • 在判断性别的方法中,运用截取指定位置的字符串String类常用方法,并把String类转换为int类后运算判断实现。
    • 在求地区的方法中,也运用了运用截取指定位置的字符串String类常用方法,并把String类转换为int类后运算判断,还将已赋值好的二维数组传参来实现。
  • 问题1:遇到将String型转换为int型不会转换。
  • 原因:自己没接触过这种方法。
  • 解决方案:搜索相关资料并且学会了String转换为int型的型转换方法。方法如下:
String temp1="23";
int i=Integer.parseInt(temp1);

三、代码托管(务必链接到你的项目)

  • 码云commit历史截图
    上传实验项目代码到码云,在码云项目中选择“统计-commits”,设置搜索时间段,搜索本周提交历史,并截图

https://git.oschina.net/hebau_cs15/Java-CS01LXC.git

Java第二次作业