java第二次作业
---张鹏 计科1501班
1.学习使用Eclipse关联jdk源代码,查看String类的equals()方法,截图,并学习其实现方法。举例说明equals方法和==的区别。
equals()方法如下
public boolean equals(String str)
使用==进行比较,其比较的是地址,如果地址相同,则返回ture,否则返回false。具体截图如下,具体程序如下。
然而使用equals()方法,比较的却是内容,如果内容相同,则返回ture,否则返回false,具体程序如下图。
*****
2.2.什么是构造方法?什么是构造方法的重载?下面的程序是否可以通过编译?为什么?
构造方法就是指在一个程序中可以重复调用的一段代码段。
所谓的方法重载就是方法名称相同,但参数的类型和参数的个数不同,通过传递参数的个数及类型的不同可以完成不同功能方法调用。
此程序无法完成编译,具体如以下截图。
显示构造方法foo()未定义。修改后如下截图
定义的方法里边有参数,则调用的时候必须写上参数,否则无法进行编译。
****
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”
Java中的简单浮点数类型float和double不能够进行运算,但是使用BigDecimal并且用String来够造,方可解决此遇到的计算精度问题。
import java.math.BigDecimal;
public class Demo {
public static void main(String args[]) {
double a = 0.1;
double b = 0.1;
double c = 0.1;
if(add(add(a,b),c) == 0.3){
System.out.println("等于0.3");
}else {
System.out.println("不等于0.3");
}
}
public static double add(double d1,double d2){
BigDecimal b1=new BigDecimal(Double.toString(d1));
BigDecimal b2=new BigDecimal(Double.toString(d2));
return b1.add(b2).doubleValue();
}
}
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 Demo {
public static void main(String[] args) {
MyClass[] arr=new MyClass[3];
for(int i=0;i<arr.length;i++){
arr[i]=new MyClass();
}
arr[1].value=100;
}
}
class MyClass{
public int value=1;
}
5.在一个10000次的循环中,需要进行字符串的连接操作,那么,应该使用String类还是StringBuffer类,为什么?性能有差异吗?
String类表示的字符串是常量,一旦创建则内容和长度都不能改变。StringBuffer类表示字符容器,内容和长度可以随时修改。在操作字符串时,如果该字符串仅用于表示数据类型,则使用String类型,如果需要对字符串进行增删操作,则使用StringBuffer类。
有差异,如果要进行字符串的连接操作,则StringBuffer类要比String类效率更高。
(二)实验总结
1.评分系统:一共10个评委,满分10分,假设有5个选手,分别由评委打分,去掉一个最高分和一个最低分后的平均分为该选手得分,将选手的得分从高到低进行输出。定义适当的方法。
程序设计思路:建立几个方法,例如求最大值、最小值、总分、平均分等几个方法,以下通过对其的调用,按从高到低循环输出其选手得分。
问题1:
double a[]={0},b[]=new double{0};
原因:因为上边显示要对数组进行初始化,所以开始的时候直接把数组初始化为0,也么有考虑到数组越界问题,得对数组长度进行定义。
解决方案:
double a[]=new double[10],b[]=new double[5];
问题2:
for(int i=0;i<4;i++){
for(int j=0;j<=4-i;j++){
if(b[j]<b[j+1]){
d=b[j];
b[j]=b[j+1];
b[j+1]=d;
}
}
原因:j<=4-i,开始的时候多让其循环了一次,导致错误的产生。
解决方案:
for(int i=0;i<4;i++){
for(int j=0;j<=4-i-1;j++){
if(b[j]<b[j+1]){
d=b[j];
b[j]=b[j+1];
b[j+1]=d;
}
}
2.Email验证:在各种应用中,需要对用户输入的email地址进行验证,编写一个方法,判断一个email地址是否有效。(判断条件:A:@和.同时存在 B: @在.之前 C: 不能@开头 D: 以com|cn|net|gov|edu|org结尾 )
程序设计思:运用endsWith()、indexOf()方法检测是否满足email要求,然后如果满足需求给变量赋值为1,否则为0,最后通过判断来验证email是否正确。
问题1:
if(a.endsWith(s)||a.endsWith(f)||a.endsWith(l)||a.endsWith(n)||a.endsWith(y)||a.endsWith(t)
原因:没有想到运用endsWith()方法进行对字符串末尾进行判断,开始首先想到的是运用一个循环,检查字符串末尾是否为email末尾符合要求的那样。
解决方案:运用endsWith()方法进行判断,方便又省时。
****
3.统计文件:输入一个字符串,包含各种文件类型的文件名。文件名之间用“,”分隔,要求将各个文件名的首字母大写后分别输出,并统计各种类型文件的文件个数。
程序设计思路:使用String类的spilt方法按照特定符号","进行拆分,然后再按特定字符"."拆分,把按","拆分好的字符串首字母进行判断,然后使用ascll码把小写变大写。把拆分好的文件拓展名存到一个数组里边,然后再按照循环把文件拓展名以及个数输出即可。
问题1:无法将文件拓展名存到数组里边。
原因:建立数组之后显示不正确,在按"."将各个文件名拆分之后,不会将“.”之后的存入数组。
解决方案:
for(i=0;i<s.length;i++){
String h[]=s[i].split("\\.");
b1[i]=h[(h.length-1)];
}
使用h.length很快将文件拓展名存入数组。
问题2:无法将统计好的文件拓展名与文件个数输出。
原因:代码判断那写的不好,经改进之后可以输出。
解决方案:
for(i=0;i<k;i++){
if(b1[i]!=null){
for(j=i+1;j<k;j++){
if(b1[i].equals(b1[j])){
b1[j]=null;
g[i]+=1;
g[j]=0;
}
}
System.out.println("\\."+b1[i]+"文件个数为:"+g[i]);
}
else{
continue;
}
}
利用循环,判断如果数组里边不是为空,则往下进行查找、赋值、输出等,相反,如果为空则继续从开始进行,此时则i需要加1.