《Java技术》第二次作业

《Java技术》第二次作业

(一)学习总结

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

  • Eclipse关联jdk源代码截图

  • equals方法和==的区别

equals比较两个字符串是否含有相同的字符,相同返回真,反之为假。

String str1="hello";
String str2=new string("hello");
String str3="str2";
String str4="hello";
System.out.println(str1.equals(str2));     
System.out.println(str2.equals(str3));
System.out.println(str1.equals(str4));
System.out.println(str1.equals(str3));	

结果全为true

==比较两个字符串的地址,相同为真,反之为假。

String str1="hello";
String str2=new string("hello");
String str3="str2";
String str4="hello";
System.out.println(str1==str2);     
System.out.println(str2==str3);
System.out.println(str1==str4);
System.out.println(str1==str3);	

结果为:false true true false

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

构造方法用于在创建对象时对其进行初始化。构造方法需要方法名和类名一致,不能用return返回一个值,用户调用时通过new自动调用。

class Person{
	public Person(){      //构造方法
		System.out.println(".");
	}
}
public class Test{
	public static void main(String args[]){
		Person per=new Person();//创建对象时对其进行初始化
	}
}

构造方法的重载:方法名称相同,参数类型和参数个数不同。

class Person{
	String name;
	int age;
	public Person(String n,int a){  //构造方法
		name=n;
		age=a;
	}
	public void tell(){
		System.out.println("姓名:"+name+",年龄:"+age);
		}
	}
	public class Test{
		public static void main(String args[]){
			Person per=new Person("张三",20);
			per.tell();
		}
	}

下面的程序是否可以通过编译?为什么?

public class Test {
public static void main(String args[]) { 
   Foo obj = new Foo();       
}     
}
class Foo{
int value;
public Foo(int intValue){
	value = intValue;
	}
}

不可以通过编译,因为构造方法有参数intValue,而主方法中Foo obj = new Foo()应该调用一个参数的构造,却没有参数。

修改:

public class Test {
public static void main(String args[]) { 
   Foo obj = new Foo(1);       
}     
}
class Foo{
int value;
public Foo(int intValue){
	value = intValue;
	}
}

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。

因为我们的数据在计算内部存储的是2进制的,当double类型在进行处理时会涉及到精度丢失问题,所以需要精确计算的结果,则必须用BigDecimal类, 其中的round()方法可以指定小数点之后的位数。

import java.math.BigDecimal;
class Add{
public static double add(double d1,double d2,double d3){
	BigDecimal b1=new BigDecimal(d1);
	BigDecimal b2=new BigDecimal(d2);
	BigDecimal b3=new BigDecimal(d3);
	return b1.add(b2).add(b3).doubleValue();
}

public static double round(double d,int len){
	BigDecimal b1=new BigDecimal(d);
	BigDecimal b2=new BigDecimal(1);
	return b1.divide(b2,len,BigDecimal.ROUND_HALF_UP).doubleValue();
	}
}
public class Test {
	public static void main(String args[]) { 
	    System.out.println("0.1+0.1+0.1=:"+Add.round(Add.add(0.1,0.1,0.1),1));
	}	  
}    

结果是:0.1+0.1+0.1=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;
}

修改

public class Test {
public static void main(String[] args) {
    MyClass[] arr=new MyClass[3];
    arr[1].value=100;
 }
}
class MyClass{
public static int value=1;
}

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

应该用StringBuffer类。String类一旦创建,内容和长度都不能改变。StringBuffer类,内容和长度都可以随时修改。在操作字符串时,如果字符串仅仅用于表示数据类型,用String类型,如果需要对字符串进行增删操作,需要使用StringBuffer类型。

String类型

public class Test{
public static void main(String[] args){	
	String str="world";
	for(int i=0;i<10000;i++){
		str=str+"world";
		}
		System.out.println(str);
		}
	}

StringBuffer类型

public class Test{
public static void main(String[] args){	
	StringBuffer buf=new StringBuffer();
	for(int i=0;i<10000;i++){
		buf.append("World");
		}
		System.out.println(buf);
		}
	}

6.总结

1.以后完成JAVA中的排序操作,只需要用"java.util.Arrays.sort(数组名称)"对数组排序。

如:

public class Test{
	public static void main(String[] args){
		int score[]={1,2,3,4};
		java.util.Arrays.sort(score);
		print(score);     
		System.out.println("\t");
		java.util.Arrays.sort(score);
		println(score);
	}
	public static void print(int temp[]){
		for(int i=0;i<temp.length;i++){
			System.out.print(temp[i]+"\t");}
	}  //从小到大
	public static void println(int t[]){
		for(int i=t.length-1;i>=0;i--){
			System.out.print(t[i]+"\t");}
	}  //从到到小
}

2.一维数组的输入

import java.util.Scanner;
public class Test{
	public static void main(String[] args){
		Scanner in=new Scanner(System.in);
		int w[]=null;
		w=new int[2];
		for(int i=0;i<w.length;i++){
			w[i]=in.nextInt();
			System.out.print(w[i]+"\t");
		}
	}
}

(二)实验总结

1.评分系统

  • 程序设计思路:利用双层循环,外层循环是选手的人数,内层循环是评委给选手打的分数,将分数存入一维数组中,在外层循环里求得每个选手的总分,通过for循环求得每个选手的最高分和最低分,去掉最高分和最低分求得的平均值放入一维数组里,从高到低排序输出。

  • 实验问题分析:

    问题1:用Java提供的排序操作java.util.Arrays.sort(grad),此操作只能从小到大排序输出,题目要求从大到小,我需要逆序输出,

    原因:一维数组的下标是从0开始,在逆序输出时,不能让数组的长度到1.

     java.util.Arrays.sort(grad);
     System.out.print("选手的成绩从高到低");
     for(int j=grad.length-1;j>0;j--){	
     	System.out.print(grad[j]+"\t");
     }		
    

    解决方案:

     java.util.Arrays.sort(grad);
     System.out.print("选手的成绩从高到低");
     for(int j=grad.length-1;j>=0;j--){	
     	System.out.print(grad[j]+"\t");
     }	
    

    问题2:输出每个选手的总分数时,我把sum=sum+score[x]放入了外层循环中并输出,出现错误。

    原因:这样显示需要重新创建局部变量,我利用index指向输入的分数,sum=sum+score[index],此时需要注意循环外对index和sum初始化,因为当进行下一个选手的分数时,会出现加上第一个选手总分的情况;当index未初始化时,index不能指向下一个评委打的分数,选手的总分等于0。

    解决方案:

     for(int x=0;x<score.length;x++){
     		score[x]=in.nextInt();
     		}
     sum=0;
     index=0;
     while(score.length!=index){
     	sum=sum+score[index];
     	index++;    
     	}
     System.out.println(sum);
    

    问题3:在将算出的平均分放入一维数组中,将grad[j]=grade放在了循环之外。

    原因:应该在输出选手得分的时候,将分数放入数组中。

    解决方案:

     ....
     System.out.println("选手的得分为:"+grade);
     		grad[j]=grade;	
     } 							//在外循环中
     for(i=0;i<grad.length;i++){
     	System.out.println(grad[i]);
     	}
    

2.Email验证

  • 程序设计思路:输入email地址,用str.indexOf()获得"@"和"."的位置,若不在字符串中,返回-1;"@"的位置在"."前面,只需要"@"返回的值小于"."的值即可;用str.startsWith()判断email是否以指定的内容开头,题目中不能以"@"开头,只需要用!str.startsWith()表示否定;用str.endsWith()判断email是否以指定的内容结尾。

  • 实验问题分析:

    问题:"@"不能开头,如何操作?

     原因:用!str.startsWith("@") 表示否定的结果;
    
     解决方案:
    
          if(a!=-1 && b!=-1 && a<b && !str.startsWith("@") && str.endsWith("com")||str.endsWith("net")||str.endsWith("cn")||str.endsWith("gov")||str.endsWith("edu")||str.endsWith("org")){
      	System.out.println(str+"有效");
      }
      else{
      	System.out.println(str+"无效");	
      }
    

3.代码托管
码云commit历史截图

posted @ 2017-03-27 11:24  lymm  阅读(205)  评论(0)    收藏  举报