《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历史截图
Java学习笔记
本文总结了Java编程中的几个关键概念,包括Eclipse与JDK的关联、构造方法的使用及重载、字符串处理技巧、数组操作及排序方法等,并通过实例演示了常见问题的解决过程。
5446

被折叠的 条评论
为什么被折叠?



