《Java技术》第二次作业
(一)学习总结
1-1.学习使用Eclipse关联jdk源代码,查看String类的equals()方法,截图,并学习其实现方法:
在Eclipse上的菜单栏选择项目-----属性-----左侧菜单栏Java构建路径-----库-----JRE系统库-----rt.jar-----源代码连接-----外部文件-----设置外部文件的路径为JDK安装路径下的src.zip。在程序的equals处按住ctrl单击equals。
1-2.举例说明equals方法和的区别:
equals是用于字符串的比较,之前我们一直通过“”判断是否相等,但“”只适用于数值的比较,因此String中提供了equals的比较方法;使用equals比较,若是相等返回ture,不相等返回false。
如下的例子:
定义了str1=hello,str2=hello,str3=world,str4=new String(“hello”)。判断str1=str2,返回ture,判断str1=str3,返回false。判断str4=str1,返回true。
若是用“”比较str1不等于str4,str4是新开辟的空间存储的hello,str1和str4的地址不同,所以结果不相等,“==”比较的是地址而不是字符串本身。
2-1.什么是构造方法
构造方法的方法名要和类名相同,作用是对类的初始化。
在类中定义的person构造方法,当调用关键字new实例化对象时才会低啊用构造方法。使用构造方法要注意以下几点:
- 构造方法名要和类名相同
- 构造方法的声明出不能有任何的返回值类型声明
- 不能再构造方法中是用return返回一个值
2-2.什么是构造方法的重载
方法的重载就是方法名相同,但是参数的个数参数的类型不同,通过传递参数的个数和参数的类型的不同可以完成不同功能的方法;构造方法和其他一样也可以是用重载。
在程序中定义了两个person的构造方法,一个参数是String类的name;另一个是String类的name和int类的age;这就是一个构造方法的重载。
2-3下面的程序是否可以通过编译?为什么?
public class Test {
public static void main(String args[]) {
Foo obj = new Foo();
}
}
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");
}
}
}
运行结果:
double是浮点型数据是无法在计算机中准确表示,存在精度丢失问题。
使用java.math.BigDecimal类修改:
public class Test {
public static void main(String args[])
{
System.out.println("a+b+c="+MyMath.Round(MyMath.add(0.1,0.1,0.1),1));
}
}
class MyMath
{
public static double add(double d1,double d2,double d3)
{
BigDecimal a1 = new BigDecimal(d1) ;
BigDecimal b1 = new BigDecimal(d2) ;
BigDecimal c1 = new BigDecimal(d3) ;
return a1.add (b1).add(c1). doubleValue();
}
public static double Round(double d, int i) {
BigDecimal a1 = new BigDecimal(d) ;
BigDecimal b1 = new BigDecimal(1) ;
return a1.divide(b1,i,BigDecimal.ROUND_HALF_UP).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;
}
程序只是对arr数组进行了声明,并没有初始化。
可以改为:
public class Test {
public static void main(String[] args)
{
MyClass[] arr=new MyClass[3];
arr[1]= new MyClass(100);
}
}
class MyClass
{
int value=1;
public MyClass(int i)
{
value = i;
}
5.在一个10000次的循环中,需要进行字符串的连接操作,那么,应该使用String类还是StringBuffer类,为什么?性能有差异吗?能否写出测试代码证明你的结论。
使用StringBuffer:因为使用String中+运算需要创建对象开辟空间,而创建对象通常会降低效率,在循环中循环次数越多效率越慢;所以是用StringBuffer更好。
使用StringBuffer所用时间:
public class Test {
public static void main(String[] args)
{
int times = 10000;
StringBuffer buf = new StringBuffer();
buf.append("hello");
long time1 = System.currentTimeMillis();
for(int i = 0;i <times;i++)
{
buf.append(i);
}
long time2 = System.currentTimeMillis();
long time = (time2-time1);
System.out.println(time);
}
}
使用String所用时间:
public class Test {
public static void main(String[] args)
{
int times = 10000;
String str = new String();
long time1 = System.currentTimeMillis();
for(int i = 0;i <times;i++)
{
str="hello";
str+=str;
}
long time2 = System.currentTimeMillis();
long time = (time2-time1);
System.out.println(time);
}
}
使用String的时间比StringBuffer的时间长。
6.其他需要总结的:
写程序最好用方法写 练习了方法的调用。
(二)实验总结
- 选手评分的程序设计思路:有5个参赛选手10个评委,评委给选手打分,求出平均分并且按顺序输出;定义一个二维数组,分别存选手和评委打分,计算平均分是需要去掉一个最高分和一个最低分,分别写两个带返回值方法,方法传递数组和i=5,两个参数,方法里设置10个评为评分的循环,找出最高分和最低分,返回值返回。计算平均分,写一个方法,把10的评为的评分相加求和,在减去最高分和最低分除8求得平均。因为成绩可能有小数,所以数组定义为double类型。
问题1:求出的最大值和最小值是所有成绩的最大值和最小值。
原因:两层循环,外循环导致把所有的成绩比较。
解决方案:去掉选手的循环,直接把选手的参数传递过来。
- 检验邮箱的程序设计思路:输入一串字符串,用if else语句判断,当满足一个条件时在判断下一个条件。
问题2:当邮箱的格式满足 @ 不开头,其他条件也满足时,地址仍然无效。
原因:所有的检验条件都是和循环输入在一起,也就是输入一个检验一个所结果不对。
解决方案:输入的字符串不用数组存放,避免了输入一个检查一个。 - 身份证号的程序思想:写一个方法把省市放在一个二维数组中,截取身份证号的前两位存放到数组中,输出数组中对应的省份;在写一个方法,截取出生日期按要求输出;第三个方法取第17位和2求余,结果余0为女生,余1为男生。主方法调用。
问题3:输入前两位的书为11,应该是北京市。
原因:输入的11应该是数组的下标,可以改为:
(三)代码托管
https://git.oschina.net/hebau_cs15/Java-CS01yxr.git
(四)学习进度条
代码行数(新增/累积) | 学习时间(新增/累积) | 本周学习内容 | |
---|---|---|---|
目标 | 5000行 | 300小时 | |
第2-4周 | 150/300 | 30/30 | 学习了.... |
第5周 | 220/300 | 30/50 | 学习了关于double类型存在精度问题,取指定位置和截取字符串;数组的应用 |
第6周 |