【韩顺平零基础学java】第13章课堂练习及课后作业

文章详细介绍了Java中的基本概念,如三元运算符、Integer对象的创建机制、常量池与equals方法的区别、字符串处理(包括equals与==的用法)、字符数组操作、字符串格式化、字符分类统计以及FastFourierTransform(FFT)的应用。
摘要由CSDN通过智能技术生成

练习题 1

在这里插入图片描述
1:正确
2:三元运算符是一个整体,精度优先。会输出1.0
第二题会将语句分别执行,会执行if里的语句输出1.
所以两个题目的输出结果不同。

练习题2

Interger的创建机制
在这里插入图片描述

package com.hspedu.wrapper;

/**
 * @author 韩顺平
 * @version 1.0
 */
public class WrapperExercise02 {
    public static void main(String[] args) {
        Integer i = new Integer(1);
        Integer j = new Integer(1);
        System.out.println(i == j);  //False
        //所以,这里主要是看范围 -128 ~ 127 就是直接返回
        /*
        老韩解读
        //1. 如果i 在 IntegerCache.low(-128)~IntegerCache.high(127),就直接从数组返回
        //2. 如果不在 -128~127,就直接 new Integer(i)
         public static Integer valueOf(int i) {
            if (i >= IntegerCache.low && i <= IntegerCache.high)
                return IntegerCache.cache[i + (-IntegerCache.low)];
            return new Integer(i);
        }
         */
        Integer m = 1; //底层 Integer.valueOf(1); -> 阅读源码
        Integer n = 1;//底层 Integer.valueOf(1);
        System.out.println(m == n); //T
        //所以,这里主要是看范围 -128 ~ 127 就是直接返回
        //,否则,就new Integer(xx);
        Integer x = 128;//底层Integer.valueOf(1);
        Integer y = 128;//底层Integer.valueOf(1);
        System.out.println(x == y);//False

    }
}

练习题3

在这里插入图片描述
// 实例一:
只要是new 就是一个新的对象
两个new说明是两个新的对象
所以说明 i1 和 i2 不相等
所以 i1 == i2 答案为 False

//实例二:
和实例一 相同,也是创建了两个新的对象。
所以i1 == i2 答案为False
因为i1 i2是两个对象

//实例三
i5 在 Interger数组范围内
i6 也在Interger数组范围里
i5 == i6
答案为True

//实例四
i7 是 128
i8 是 128
128不在 -127 - 128 范围里
所以需要new。
因此 i7 和 i8 不相等
所以答案为 False

//实例5
interger是在-128~127数组里
所以 i9 是 在数组里的
而i10 是新建了一个类。
所以i9 和 i10并不相等。
答案为False

//实例6
只要有基本数据类型,是判断值是否相同
包装类和基本数据类型比较的时候会自动拆包
所以 i11 =127 , i12 = 127
i11 = i12. 答案为True

//实例7
参照实例6
答案 True

练习题4

在这里插入图片描述

        //题目1
        String a = "abc";
        String b = "abc";
        System.out.println(a.equals(b)); //true
        System.out.println(a == b);  //true

        //分析:a是在常量池中定义了一个常量。b也是在常量池中定义了一个常量
        //常量池中只能存在一个相同的常量。所以a和b值相等,而且自身也相等。

练习题5

在这里插入图片描述

        System.out.println("------------------------");
        String a1 = new String("abc");
        String b1 = new String("abc");
        System.out.println(a1.equals(b1)); //true
        System.out.println(a1==b1); //false
        //说明
        //1. a1是在堆中新建了一个对象。b1是在堆中新建了一个对象。
        //2。虽然内容相等,但确实是两个对象。
        //所以值相等,对象不相等

练习题 6

在这里插入图片描述

  //题目3
        String a3 = "hsp";
        String b3 = new String("hsp");
        System.out.println(a3.equals(b3)); //true
        System.out.println(a3==b3); //false
        System.out.println(a3==b3.intern()); // true
        System.out.println(b3==b3.intern()); //false

        //说明
        //1.a3是在常量池里的一个常量。b3是在堆中的一个对象。
        //所以值相等,但是互相不相等
        //b3.intern() 是 hsp ,a3是hsp 。a3在常量池中,包含一个等于b3.intern()对象字符串的引用,所以相等
        //b3.intern()是hsp。b3是hsp. b3在堆中,不在常量池中,不包含一个等于b3.intern()对象字符串的引用。所以不相等,
        //intern方法:字符常量池中已经包含一个等于此String对象的字符串,
        //           则返回常量池中字符串的引用,否则,将新的字符串放入常量池,并返回新字符串的引用’

练习题 7

在这里插入图片描述

        System.out.println("------------------------------");
        //题目4
        String s1 = "hspedu";
        String s2 = "java";
        String s4 = "java";
        String s3 = new String("java");
        System.out.println(s2 == s3); //false
        System.out.println(s2 == s4); //true
        System.out.println(s2.equals(s3)); //true
        System.out.println(s1 == s2); //false

        //说明
        // s1,s2,s4在常量池里,s3在堆里。
        //s2 和 s3空间所占不同。为false
        //s2和s4都在常量池里,并且内容相等。为true
        //equals是比较值的,s2 s3值相等,为true
        //s1,s2虽然都在常量池里,但是内容不同,为false

练习题 8

在这里插入图片描述

        //题目5
        System.out.println("------------------------------");
        Person person1 = new Person();
        person1.name = "hspedu";
        Person person2 = new Person();
        person2.name = "hspedu";

        System.out.println(person1.name.equals(person2.name)); //t
        System.out.println(person1.name== person2.name); // t
        System.out.println(person1.name=="hspedu"); //t

        String ss1 = new String("bcde");
        String ss2 = new String("bcde");
        System.out.println(ss1==ss2); //f
        
        //说明
        //在堆中创建了两个对象,分别是p1 p2
        // equals比较的是内容。p1 和 p2 的内容相同
        //p1.name 是创建了一个堆,在堆中指向了常量池中的一个常量。p2.name同理。常量池中只允许存在一个name.两者所以相同
        // == 后面没有new,表示不是创建一个对象而是比较值。p1.name的值就是hspedu。等于hspedu
        //ss1 和 ss2是两个对象。不相同

练习9

在这里插入图片描述
创建了两个对象,只是改变了s1的指向

package string;

//String 是一个final类,是一个不可变的字符序列
//字符串是不可变的,一个字符串对象一旦被分配,其内容是不可变的
public class String03 {
    //以下语句创建了几个对象?
    public static void main(String[] args) {

        String s1 = "hello";
        s1 = "haha";

        //s1指向了一个常量池。常量池里面有一个创建出来的常量hello
        //因为字符串对象内容不可变。所以并不是"haha"替换掉了"hello"
        //**而是先创建了一个"haha"在内存池里,然后将s1的指向从"hello"替换为"haha"**
    }
}

练习10

在这里插入图片描述
在编译器里,会将“hello”+"abc“合并为一个对象,即“helloabc”,所以只创建了一个对象。

练习11

在这里插入图片描述

    //题目3
    String a3 = "hello";
    String b3 = "abc";
    String c3 = a3 + b3 ;

a在常量池中创建了一个“hello”
b在常量池中创建了一个"abc’
然后c在堆中创建了一个空间,指向常量池中a 和 b 合并后的"helloabc"。
所以一共有3个常量。

练习 12

在这里插入图片描述

s1是在常量池里面新建了一个常量hspedu
s2是在常量池里面新建了一个常量java
s5是在常量池里面新建了一个常量hspedu
s6是指向常量池里的hspedujava.(如果没有则创建一个hspedujava)

s5 和s6在常量池里面。且内容相等。常量池中只允许存在一个。所以两者相等。
equals比价内容,两者相等。是True

练习 13

在这里插入图片描述

//说明
//在new一个新的Test之前,先要完成类Test的初始化工作。
/*
* 在堆里新创建了一个类,类里面的内容是hsp
* 然后在堆中又创建了一个数组。数组里的内容是 j a v a
* */
// 创建完成后,此时在main里调用Test类(新创建一个text类的数据类型叫ex)
/*
* 调用change方法。ex.str,ex.ch是形参。String str,char ch[]是实参。
* 因为String是final不可变的,所以在实参向形参传递数据的过程中是传不到的。
* 即str的值java没有被传到,不会影响原来的值hsp
* 然后ex.ch指向原数组,将j 替换为 h,变成hava
* */

练习 13

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
发现在append()方法中,直接将null转化为一个’n’ ‘u’ l’l’数组。 没有错误,正常输出。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在Stringbuffer中,会使用数组长度。null为空,会报错。

练习 14

在这里插入图片描述

package StringBuffer;

import java.util.Scanner;

public class SBE02 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.println("请输入商品价格");

        String price = scanner.nextLine();

        StringBuffer stringBuffer = new StringBuffer(price);


       for(int i = stringBuffer.indexOf(".") -3; i>0; i-=3){
           stringBuffer = stringBuffer.insert(i, ",");
       }
        System.out.println(stringBuffer);
    }
}

练习15

在这里插入图片描述

package Arrays;

import java.awt.print.Book;
import java.util.Arrays;
import java.util.Comparator;

public class ArraysExercise {
    /*自定义Book类,里面有name和price 要求按照要求进行排序
    * */

    public static void main(String[] args) {
        Book[] books = new Book[4];
        books[0] = new Book("红楼梦",100 );
        books[1] = new Book("金瓶梅新",90 );
        books[2] = new Book("青年文摘20年",5 );
        books[3] = new Book("java从入门到放弃",300 );

        //1.按照价格从低到高
//        Arrays.sort(books, new Comparator() {
//
//            public int compare(Object o1, Object o2) {
//                Book book1 = (Book) o1;
//                Book book2 = (Book) o2;
//               double price =  book2.getPrice() - book1.getPrice();
//               if (price>0){
//                   return 1;
//               }else if(price<0)
//                {
//                   return -1;
//                }else {
//                   return 0;
//               }
//            }
//        });
//

        //2.按照书名长度排序
        Arrays.sort(books, new Comparator() {

            public int compare(Object o1, Object o2) {
                Book book1 = (Book) o1;
                Book book2 = (Book) o2;
                double price =  book1.getName().length() - book2.getName().length();
                if (price>0){
                    return 1;
                }else if(price<0)
                {
                    return -1;
                }else {
                    return 0;
                }
            }
        });

        System.out.println(Arrays.toString(books));
    }




 static class Book{
        private String name;
        private double price;

        public Book(String name, double price) {
            this.name = name;
            this.price = price;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public double getPrice() {
            return price;
        }

        public void setPrice(double price) {
            this.price = price;
        }

     @Override
     public String toString() {
         return "Book{" +
                 "name='" + name + '\'' +
                 ", price=" + price +
                 '}';
     }
 }


}

练习16

在这里插入图片描述

package Homework;

public class Homework01 {
    public static void main(String[] args) {
        //测试
        String str = "abcdef";
        System.out.println("交换前");
        System.out.println(str);
        try {
            str = reverse(str,1,4);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            return;
        }
        System.out.println("交换后");
        System.out.println(str);

    }

    public static  String reverse(String str,int start ,int end){
        /*
         * 将字符串中指定部分进行翻转。比如将"abcdef"转换为"aedcbf"
         *编写方法public static String reverse(String str , ubt start ,int end)
         *思路
         * 把String转成char[],因为char的元素是可以交换的
         * */

        //对输入的参数要做一个验证
        //(1)先写出正确的情况,然后取反

        if(!(str!=null &&start>=0&&end>start && end<str.length())){
            throw new RuntimeException("参数不正确");
        }
        char[] chars = str.toCharArray();
        char temp = ' ';
        for(int i = start,j=end;i<j;i++,j--){
            temp = chars[i];
            chars[i] = chars[j];
            chars[j] = temp;
        }
        //使用chars重新构建一个String返回
        return new String(chars);
    }
}


练习17

在这里插入图片描述


package Homework;

/*
* 要求 输入用户名、密码、邮箱,如果录入信息正确,则提示注册成功,否则生成异常对象
* 1.用户名长度为2或3或4
* 2.密码长度为6,并且要求全是数字
* 3. 邮箱中包含@和. 并且@在.前面
*
* 思路分析
* 1.先编写方法userRegister(String name,String pwd,String email)
* 2.针对输入的内容进行校验。如果发现有问题,就抛出异常,给出提示
* 3.单独的编写一个方法。判断密码是否全是数字字符boolean
* */
public class HomeWork02 {
    public static void main(String[] args) {
        String name = "abc";
        String pwd = "123456";
        String email = "abc@123.com";
        try {
            userRegister(name,pwd,email);
            System.out.println("恭喜你,注册成功~");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
    public static void userRegister(String name,String pwd,String email){
        //校验
        if(!(name!=null && pwd != null && email !=null)){
            throw new RuntimeException("参数不能为null");
        }


        //第一关
        int userLength = name.length();
        if (!(userLength>=2 && userLength<=4)){
            throw new RuntimeException("用户名长度为2或3或4");
        }

        //第二关
        if(!(pwd.length()==6 && isDigital(pwd))){
            throw new RuntimeException("密码长度为6,要求全是数字");
        }

        //第三关
        int i = email.indexOf('@');
        int j =email.indexOf('.');
        if(!(i>0&&j>i)){
            throw new RuntimeException("邮箱中包含@和. ,并且@在.前面");
        }
        }

        //单独写一个方法,判断密码是否全是数字字符boolean
    public static boolean isDigital(String str){
        char[] chars = str.toCharArray();
        for(int i = 0;i<chars.length;i++){
            if(chars[i]<'0'||chars[i]>'9'){
                return false;
            }
        }
        return true;
    }
    }

练习18

在这里插入图片描述

package Homework;

public class homework03 {
    public static void main(String[] args) {
        //编写方法: 完成输出格式要求的字符串
        // 编写java程序,输入形式为: Han shun Ping的人名,以Ping,Han .S的形式打印
        //。其中.S是中间单词的首字母
        String name = "Willian Jefferson Clinton";
        printName(name);
        }

        //思路
        //1.输入一个字符串,然后把他转换成数组
        //2.把数组用空格分隔开
        //3.然后格式化输出,把第3部分放到第1部分,把第二部分放到第三部分。把第三部分放到第一部分
        public static void printName(String str){
            if(str == null){
                System.out.println("str不能为空");
                return;
            }
            String[] names = str.split(" ");
            if(names.length != 3){
                System.out.println("输入字符串的格式不对");
                return;
            }
            String format = String.format("%s,%s,.%c",names[2],names[0],names[1].toUpperCase().charAt(0));
            System.out.println(format);

        }

}

练习19

在这里插入图片描述

package Homework;

//输入字符串,判断有多少个大写字母,小写字母,数字
public class HomeWork04 {
    public static void main(String[] args) {
        String str = "1234 ABC dfsd";
        countStr(str);
    }
    public static void countStr(String str){
        if (str == null){
            System.out.println("输入不能为null");
            return;
        }
        int serLen = str.length();
        int numCount = 0;
        int lowerCount = 0;
        int upperCount = 0;
        int otherCount = 0;

        for(int i = 0;i<serLen;i++){
            if (str.charAt(i)>='0'&&str.charAt(i)<='9'){
                numCount++;
            }else if(str.charAt(i)>='a'&&str.charAt(i)<='z'){
                lowerCount++;
            }else if(str.charAt(i)>='A'&&str.charAt(i)<='Z'){
                upperCount++;
            }else {
                otherCount++;
            }

        }

        System.out.println("数字有" + numCount);
        System.out.println("小写字母有"+lowerCount);
        System.out.println("大写字母有"+upperCount);
        System.out.println("其他字符有"+otherCount);
    }

}

练习19

在这里插入图片描述
FFTFFT

  • 23
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值