java第二次作业计科2班马浩加

(一)
1.学习使用Eclipse关联jdk源代码,查看String类的equals()方法,截图,并学习其实现方法。举例说明equals方法和==的区别。
用==的程序截图如下:
1081361-20170325222259111-786555215.png
1081361-20170325223146518-399935161.png
用equals的程序截图如下:
1081361-20170326084010549-101756679.png

总结:出现上面不同的原因是,每个String对象的内容实际上都是保存在堆内存之中的,而且堆中的内容是相等的。 用“==”str1和str2栈内存虽然都一样,但是因为内容一样所以指向了同一个堆内存,而str3指向了一个新开辟的堆内存。而equals方法是对String的内容进行比较,虽然堆内存不是同一个,但是内容相同,因此返回真。

2.什么是构造方法?什么是构造方法的重载?下面的程序是否可以通过编译?为什么?
构造方法就是一段可重复调用的代码段,如果一个很多行的代码程序的某一部分在多个地方重复使用,如果在各个地方重复编写,肯定会特别麻烦,所以可以将此部分代码定义成一个方法,以供程序反复调用。方法的基本形式如下:
public static 返回值类型 方法类型 (类型 参数1 类型 参数2,等等){
程序语句
[return 表达式];
}
构造方法的重载就是方法名称相同,但参数的类型和参数个数不同。通过传递参数的个数以及类型的不同可以完成不同的功能的方法的调用。
下面的程序是否可以通过编译?为什么?

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

下面的程序不能通过编译,因为构造函数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,原因是因为没有考虑到double,float精度问题,十进制数的二进制表示形式可能不精确。

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{new MyClass(),new MyClass(),new MyClass()};
    arr[1].value=100;
}
}
class MyClass{
    public int value=1;
}

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

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

使用StringBuffter类代码如下:

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

在上面的程序中用string类虽然最后字符串的结果改变了,但实际上是通过不断修改对象的引用来实现的,所以性能很差,也就是说想要解决此类问题就必须靠StringBuffer,因为StringBuffer的内容是可以修改的,同样的程序如果使用了StringBuffer,所以代码的性能有了很大的提高,也就是说对于频繁修改字符串的地方,最好使用StringBuffer类完成。

(二)
1.评分系统:一共10个评委,满分10分,假设有5个选手,分别由评委打分,去掉一个最高分和一个最低分后的平均分为该选手得分,将选手的得分从高到低进行输出。定义适当的方法。
程序设计思路:通过数组循环来完成10个评委给5个选手打分,然后分别调用最高分,最低分,平均分的方法,最后用升序方法降序输出。
问题一:10个评委为5个选手打分怎么用数组实现?
解决方案:

Scanner in =new Scanner(System.in);
        for(int i=0;i<5;i++){
            int score[]=new int[10];
            System.out.printf("请10位评委输入%d号选手得分\n",i+1);
            for(int j=0;j<10;j++){
            score[j]=in.nextInt();
            }

问题二:怎样逆序输出?
解决方案:调用升序方法,然后m减减降序输出!

Arrays.sort(team);
        System.out.println("分数由高到低输出");
        for(int m=4;m>=0;m--){
        System.out.printf("%.2f\n",team[m]);
        }

2.Email验证:在各种应用中,需要对用户输入的email地址进行验证,编写一个方法,判断一个email地址是否有效。(判断条件:A:@和.同时存在 B: @在.之前 C: 不能@开头 D: 以com|cn|net|gov|edu|org结尾 )
问题:判断条件怎么实现?
解决方案:使用indexOf()方法查找一个指定的字符串是否存在,使用endsWith()方法判断是否以指定的字符串结尾。程序代码如下:

public static int panduan(String str){
         if(str.indexOf("@")>0&&str.indexOf(".")>1&&(str.indexOf(".")-str.indexOf("@"))>0&&str.endsWith("com")||str.endsWith("cn")||str.endsWith("net")||str.endsWith("gov")||str.endsWith("edu")||str.endsWith("org")){
        return 1;    
         }
         else{
        return 0;
     }

3.统计文件:输入一个字符串,包含各种文件类型的文件名。文件名之间用“,”分隔,要求将各个文件名的首字母大写后分别输出,并统计各种类型文件的文件个数。
问题:怎么样将各个文件名的首字母大写输出?

public static void change(String b){
        String m[]=b.split(",");
        for(int i=0;i<m.length;i++){
            char a[]=m[i].toCharArray();
            for(int j=0;j<a.length;j++){
                  if(a[0]>='a'){
                    a[0]-=32;/*如果首字母为小写,则ASCLL值减32*/
                }
            System.out.print(a[j]); 
            }   
            System.out.printf("\n");
        }
        
    }

4.身份证识别:公民身份证号码由十八位数字组成。从左至右依次为:六位地址码,八位出生日期码,三位顺序码和一位校验码。顺序码的奇数分配给男性,偶数分配给女性。编写一个识别身份证基本信息的小工具,输入一个居民身份证号,则输出居民所属省份(直辖市、自治区),生日(格式:xxxx-xx-xx)和性别信息。
问题:不用一个一个的条件怎么实现更简单的查找籍贯省份?
解决方案:利用java在空间中的占内存特点,可以调用一个方法用一个二维数组来实现,然后用integer转换成数组的成员,具体代码如下:

public static void area(String b){
        String a[][]= {{"北京市","天津市","河北省","山西省","内蒙古"},
                      {"辽宁省","吉林省","黑龙江省"},
                      {"上海市","江苏省","浙江省","安徽省","福建省","江西省","山东省"},
                      {"河南省","湖北省","湖南省","广东省","广西","海南省"},
                      {"重庆市","四川省","贵州省","云南省","西藏"},
                      {"陕西省","甘肃省","青海省","宁夏","新疆"}};
        String  getprovince1=b.substring(0,1);
        String  getprovince2=b.substring(1,2);
        Integer g=Integer.valueOf(getprovince1);
        Integer h=Integer.valueOf(getprovince2);
        System.out.println("籍贯是 "+a[g-1][h-1]);
    }

三 代码托管
1081361-20170328085142983-1555241359.png

链接:https://git.oschina.net/hebau_cs15/mhj.git

转载于:https://www.cnblogs.com/mahaojia/p/6618818.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值