Java基础 韩顺平老师的 常用类 的部分笔记

java · 浏览次数 : 0

小编点评

```java public class Homework01 { public static void main(String[] args) { String name = "Jack"; String pwd = "123456"; String email = "jack@sohu.com"; try { userRegister(name, pwd, email); System.out.println("恭喜你注册成功!"); } catch (Exception e) { System.out.println(e.getMessage()); } // 测试方法 isDigital System.out.println(isDigital("123456")); // 返回 true // 测试字符串统计方法 countStr(str); } /** 方法 userRegister 进行参数检查和异常处理 */ public static void userRegister(String name, String pwd, String email) throws RuntimeException { // 校验参数 if (name == null || pwd == null || email == null) { throw new RuntimeException("参数不能为null"); } // 校验用户名长度 if (name.length() < 2 || name.length() > 4) { throw new RuntimeException("用户名长度为2或3或4"); } // 校验密码格式 if (!isDigital(pwd)) { throw new RuntimeException("密码的长度为6,要求全是数字"); } // 校验邮箱格式 int i = email.indexOf('@'); int j = email.indexOf('.'); if (i == 0 || j == 0) { throw new RuntimeException("邮箱中包含@和. 并且@在.的前面"); } } /** 方法 isDigital 用于判断字符串中每个字符是否是数字 */ 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; } /** 方法 countStr 用于统计字符串中各个字符的数量 */ public static void countStr(String str) { if (str == null) { System.out.println("输入不能为 null"); return; } int strLen = str.length(); int numCount = 0; int lowerCount = 0; int upperCount = 0; int otherCount = 0; for (int i = 0; i < strLen; 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); } } ``` **示例输出:** ``` 恭喜你注册成功! true 数字有 3 小写字母有 12 大写字母有 10 其他字符有 3 ```

正文

459,八大Wrapper类

包装类的分类

 1) 针对八种基本数据类型相应的引用类型—包装类

 2) 有了类的特点, 就可以调用类中的方法。

 

 460,装箱和拆箱

 

package com.hspedu.Wrapper;

public class WrapperType {
    public static void main(String[] args) {
        //演示int <--> Integer 的装箱和拆箱
        //jdk5前是手动装箱和拆箱
        //手动装箱 int->Integer
        int n1 = 100;
        Integer integer = Integer.valueOf(n1);

        //手动拆箱
        //Integer->int
        int i = integer.intValue();

        //jdk5后,就可以自动装箱和自动拆箱
        int n2 = 200;
        //自动装箱 int->Integer
        Integer integer1 = n2; //底层使用的是 Integer.valueOf(n2)
        //自动拆箱 Integer->int
        int n3 = integer1; //底层仍然使用的是 intValue()方法
    }

 

462,包装类方法

包装类型和String类型的相互转换

 

package com.hspedu.Wrapper;

public class WrapperType {
    public static void main(String[] args) {
        //包装类(Integer)->String
        Integer i = 100; //自动装箱 int->Integer
        //方式1
        String str1 = i + "";
        //方式2
        String str2 = i.toString();
        //方式3
        String str3 = String.valueOf(i);

        //String->包装类(Integer)
        String str4 = "12345";
        Integer i2 = Integer.parseInt(str4); //使用到自动装箱,parseInt() 返回int,int->Integer
    }
}

 

Integer类和Character类的常用方法

 

package com.hspedu.Wrapper;

import java.sql.SQLOutput;

public class WrapperType {
    public static void main(String[] args) {
        System.out.println(Integer.MAX_VALUE);//返回最大值
        System.out.println(Integer.MIN_VALUE);//返回最小值
        System.out.println("=============");
        System.out.println(Character.isDigit('a'));//判断是不是数字
        System.out.println(Character.isLetter('a'));//判断是不是字母
        System.out.println(Character.isUpperCase('a'));//判断是不是大写
        System.out.println(Character.isLowerCase('a'));//判断是不是小写
        System.out.println("=============");
        System.out.println(Character.isWhitespace('a'));//判断是不是空格
        System.out.println(Character.toUpperCase('a'));//转成大写
        System.out.println(Character.toLowerCase('A'));//转成小写
    }
}

 

 

464,Integer面试题(还有463节的一个题)

package com.hspedu.Wrapper;

import java.sql.SQLOutput;

public class WrapperType {
    public static void main(String[] args) {
        /*
        //老韩解读 源码
        //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 x = 128;//底层Integer.valueOf(1)
        Integer y = 128;//底层Integer.valueOf(1)
        System.out.println(x == y);//false

        //只有有基本数据类型,判断的是 值是否相同
        Integer i = 127;
        int i2 = 127;
        System.out.println(i == i2);
    }
}

 

465,String结构剖析

 

(5)String 类实现了接口 Serializable 【String 可以串行化:可以在网络传输】

                             接口 Comparable【String 对象可以比较大小】

(6)String 是final 类,不能被其他类继承

(7)String 有属性 private final char value[] ;用于存放字符串内容

(8)一定要注意:value 是一个final类型,不可以修改:即value不能指向新的地址,但是单个字符内容是可以变化

 

466,String创建剖析

 

 s2指向的地址是0x11

s指向的地址是0x99,上图画的线别弄混了

 

467,String测试题1

 上面题的图

 

469,String对象特性1(源码那里看老韩讲的)

第1题

 

第2题

 

470,String对象特性2

 

在上面图片中,栈中 x 的位置 在 执行完 ex.change(ex.str,ex.ch) 后,x的空间就会被释放掉,原来str指向堆中的value属性,value指向常量池也没变,所以是 "hsp",而不是 "java"

 

471,String常用方法1

 

package com.hspedu.string;

public class StringExercise {
    public static void main(String[] args) {
        //1,equals 前面已经讲过了,比较内容是否相同,区分大小写
        String str1 = "hello";
        String str2 = "Hello";
        System.out.println(str1.equals(str2)); //false

        //2,equalsIgnoreCase 忽略大小写的判断内容是否相等
        String username = "johN";
        if ("john".equalsIgnoreCase(username)) {
            System.out.println("Success!");
        } else {
            System.out.println("Failure!");
        }

        //3,length 获取字符的个数,字符串的长度
        System.out.println("韩顺平".length());//3

        //4,indexOf 获取字符在字符串对象中第一次出现的索引,索引从0开始,如果找不到,返回-1
        String s1 = "wer@terwe@g";
        int index = s1.indexOf('@');
        System.out.println(index);//3
        System.out.println(s1.indexOf("we"));//0

        //5,lastIndexOf 获取字符在字符串中最后一次出现的索引,索引从0开始,如果找不到,返回-1
        s1 = "wer@terwe@g";
        int index1 = s1.lastIndexOf('@');
        System.out.println(index1);//9

        //6,substring 截取指定范围的子串
        String name = "hello,张三";
        //下面 name.substring(6) 从索引6开始截取后面所有的内容
        System.out.println(name.substring(6));//张三
        //name.substring(0,5) 表示从索引0开始截取,截取到索引4(不包含索引5),5-1=4
        System.out.println(name.substring(0,5));//hello
    }
}

 

472,String常用方法2

 

package com.hspedu.string;

public class StringExercise {
    public static void main(String[] args) {
        //1,toUpperCase转换成大写
        String s = "hello";
        System.out.println(s.toUpperCase());//HELLO

        //2,toLowerCase转换成小写
        System.out.println(s.toLowerCase());//hello

        //3,concat拼接字符串
        String s1 = "宝玉";
        s1 = s1.concat("林黛玉").concat("薛宝钗").concat("together");
        System.out.println(s1);//宝玉林黛玉薛宝钗together

        //4,replace 替换字符串中的字符
        s1 = "宝玉 and 林黛玉 林黛玉 林黛玉";
        //在s1中,将所有的 林黛玉 替换成 薛宝钗
        //老韩解读:s1.replace() 方法执行后,返回的结果才是替换过的
        //注意对 s1 没有任何影响
        String s11 = s1.replace("林黛玉", "薛宝钗");
        System.out.println(s11);//宝玉 and 薛宝钗 薛宝钗 薛宝钗
        System.out.println(s1);//宝玉 and 林黛玉 林黛玉 林黛玉

        //5,split 分割字符串,对于某些分割字符,我们需要 转义 比如 | \\等
        String poem = "锄禾日当午,汗滴禾下土,谁知盘中餐,粒粒皆辛苦";
        //老韩解读:
        //1,以 , 为标准对 poem 进行分割,返回一个数组
        //2,在对字符串进行分割时,如果有特殊字符,需要加入 转义符 \
        String[] split = poem.split(",");
        System.out.println("==这首诗的内容是===");
        for (int i = 0; i < split.length; i++) {
            System.out.println(split[i]);
        }

        poem = "E:\\aaa\\bbb";
        split = poem.split("\\\\");
        System.out.println("==分割后内容是===");
        for (int i = 0; i < split.length; i++) {
            System.out.println(split[i]);
        }

        //6,toCharArray 转换成字符数组
        s = "happy";
        char[] chs = s.toCharArray();
        for (int i = 0; i < chs.length; i++) {
            System.out.println(chs[i]);
        }

        //7,compareTo 比较两个字符串的大小
        //老韩解读
        //(1)如果长度相同,并且每个字符也相同,就返回 0,比如 "jack" 和 "jack"
        //(2)如果长度相同或者不相同,但是在进行比较时,可以区分大小,比如 "jack" 和 "jahk",长度相同,但是'c' != 'h',所以就用'c'-'h'
        //    就返回 if (c1 != c2) {
        //               return c1 - c2;
        //               }
        //(3)如果前面的部分都相同,就返回 str1.len - str2.len
        String a = "jac";
        String b = "jack";
        System.out.println(a.compareTo(b));//返回值是3-4=-1

    }
}

 

473,String常用方法3

package com.hspedu.string;

public class StringExercise {
    public static void main(String[] args) {
       //8,format 格式字符串
        /* 占位符有:
        * %s 字符串 %c 字符 %d 整型 %.2f 浮点型
         */
        String name = "john";
        int age = 10;
        double score = 56.857;
        char gender = '男';
        //将所有信息都拼接在一个字符串
        String info =
                "我的姓名是" + name + "年龄是" + age + ",成绩是" + score + ",性别是" + gender + "。希望大家喜欢我!";
        System.out.println(info);

        //老韩解读
        //1,%s,%d,%.2f,%c 称为占位符
        //2,这些占位符由后面变量来替换
        //3,%s 表示后面由 字符串来替换
        //4,%d 是整数来替换
        //5,%.2f 表示使用小数来替换,替换后,只会保留小数点两位,并且进行四舍五入的处理
        //6,%c 使用char 类型来替换
        String formatStr = "我的姓名是%s 年龄是%d,成绩是%.2f 性别是%c。希望希望大家喜欢我!";
        String info2 = String.format(formatStr,name,age,score,gender);
        System.out.println("info2=" + info2);
    }
}

 

 474,StringBuffer结构剖析

 

package com.hspedu.string;

public class StringBuffer01 {
    public static void main(String[] args) {
        //老韩解读
        //1,StringBuffer 的直接父类 是 AbstractStringBuilder
        //2,StringBuffer 实现了 Serializable,即StringBuffer的对象可以串行化
        //3,在父类中 AbstractStringBuilder 有属性 char[] value,不是final
        //   该 value 数组存放 字符串内容,引出存放在堆中的
        //4,StringBuffer 是一个 final类,不能被继承
        //5,因为StringBuffer 字符内容是存在 char[] value,所有在变化(增加/删除),容量不够才更换容量大的地址
        //   不用每次都更换地址(即不是每次创建新对象),所以效率高于 String
        StringBuffer stringBuffer = new StringBuffer("hello");
    }
}

 

475,StringBuffer转换

StringBuffer的构造器

package com.hspedu.string;

public class StringBuffer01 {
    public static void main(String[] args) {
        //构造器的使用
        //老韩解读
        //1,创建一个 大小为16的 char[],用于存放字符内容
        StringBuffer stringBuffer = new StringBuffer();

        //2,通过构造器指定 char[] 大小
        StringBuffer stringBuffer1 = new StringBuffer(100);

        //3,通过 给一个String 创建 StringBuffer,char[] 大小就是 str.length() + 16
        StringBuffer hello = new StringBuffer("hello");
    }
}

 

String和StringBuffer的相互转换

package com.hspedu.string;

public class StringBuffer01 {
    public static void main(String[] args) {
        //看 String——>StringBuffer
        String str = "hello";
        //方式1 使用构造器
        //注意:返回的才是StringBuffer对象,对str 本身没有影响
        StringBuffer stringBuffer = new StringBuffer(str);
        //方式2 使用的是append方法
        StringBuffer stringBuffer1 = new StringBuffer();
        stringBuffer1 = stringBuffer1.append(str);
        
        //看 StringBuffer——>String
        StringBuffer stringBuffer2 = new StringBuffer("韩顺平教育");
        String s = stringBuffer2.toString();
        //方式2:使用构造器来搞定
        String s1 = new String(stringBuffer2);
    }
}

 

476,StringBuffer方法

 

package com.hspedu.string;

public class StringBuffer01 {
    public static void main(String[] args) {
        StringBuffer s = new StringBuffer("hello");
        //
        s.append(",");//hello,
        s.append("张三丰");//hello,张三丰
        s.append("赵敏").append(100).append(true).append(10.5);//hello,张三丰赵敏100true10.5
        System.out.println(s);//hello,张三丰赵敏100true10.5

        //
        /*
         * 删除索引为 >= start && < end 处的字符
         * 解读:删除 11~14的字符 [11,14)
         */
        s.delete(11,14);
        System.out.println(s);//hello,张三丰赵敏true10.5

        ////老韩解读,使用 周芷若 替换 索引9-11的字符 [9,11)
        s.replace(9,11,"周芷若");
        System.out.println(s);//hello,张三丰周芷若true10.5

        ////查找指定的子串在字符串第一次出现的索引,如果找不到返回-1
        int indexOf = s.indexOf("张三丰");
        System.out.println(indexOf);//6

        ////老韩解读,在索引为9的位置插入 "赵敏",原来索引为9的内容自动后移
        s.insert(9,"赵敏");
        System.out.println(s);//hello,张三丰赵敏周芷若true10.5

        //长度
        System.out.println(s.length());
        System.out.println(s);
    }
}

 

477,StringBuffer练习

 

package com.hspedu.string;

public class StringBuffer01 {
    public static void main(String[] args) {
        String price = "123564.59";
        StringBuffer sb = new StringBuffer(price);
        //先完成一个最简单的实现123,564.59
        //找到小数点的索引,然后在该位置的前3位,插入,即可
//        int i = sb.lastIndexOf(".");
//        sb = sb.insert(i - 3, ",");

        //上面的两步需要做一个循环处理,才是正确的
        for(int i = sb.lastIndexOf(".") - 3; i > 0; i-=3) {//先从小数点位置的前3位开始插入 ,
            sb = sb.insert(i,",");
        }
        System.out.println(sb);
    }
}

 

478,StringBuilder结构剖析

 

package com.hspedu.string;

public class StringBuilder01 {
    public static void main(String[] args) {
        //老韩解读
        //1,StringBuilder 继承 AbstractStringBuilder 类
        //2,实现了 Serializable,说明StringBuilder对象是可以串行化(对象可以网络传输,可以保存到文件)
        //3,StringBuilder 是 final类,不能被继承
        //4,StringBuilder 对象字符序列仍然是存放在其父类 AbstractStringBuilder的 char[] value;
        //   因此,字符序列在堆中
        //5,StringBuilder 的方法,没有做互斥的处理,即没有synchronized 关键字,因此在单线程的情况下使用 StringBuilder
        StringBuilder stringBuilder = new StringBuilder();
    }
}

 

479,StringBuilder应用(String,StringBuffer,StringBuilder区别)

 

480,Math方法

 

package com.hspedu.string;

import java.util.zip.DeflaterOutputStream;

public class Math01 {
    public static void main(String[] args) {
        //看看Math常用的方法(静态方法)
        //1,abs 绝对值
        int abs = Math.abs(-9);
        System.out.println(abs);//9

        //2,pow 求幂
        double pow = Math.pow(2,4); //2的4次方
        System.out.println(pow);//16

        //3,ceil 向上取整,返回 >= 该参数的最大整数(转成double)
        double ceil = Math.ceil(3.9);
        System.out.println(ceil);//4.0

        //4,floor 向下取整,返回 <= 该参数的最大整数(转成double)
        double floor = Math.floor(4.001);
        System.out.println(floor);//4.0

        //5,round 四舍五入
        long round = Math.round(5.51);
        System.out.println(round);//6

        //6,sqrt 求开方
        double sqrt = Math.sqrt(9.0);
        System.out.println(sqrt);//3.0
        System.out.println("=====");

        //7,random 求随机数
        //  random 返回的是 0 <= x < 1 之间的一个随机小数
        // 思考:请写出获取 a-b 之间的一个随机整数,a,b均为整数,比如 a = 2,b = 7
        // 即返回一个数 x  2 <= x <= 7

        //老韩解读 Math.random() * (b-a) 返回的就是 0 <= 数 <= b-a
        //(1) (int)(a) <= x <= (int)(a + Math.random() * (b-a +1))
        //(2) 使用具体的数解释 a = 2,b = 7
        //(int)(a + Math.random() * (b-a +1)) = (int)(2 + Math.random()*6)
        //Math.random()*6 返回的是 0 <= x < 6 小数
        //2 + Math.random()*6 返回的就是 2 <= x < 8 小数
        //(int)(2 + Math.random()*6)) 为 2 <= x <= 7
        //(3) 公式就是 (int)(a+ + Math.random() * (b-a +1))
        for(int i = 0; i < 5; i++) { //i表示运行次数
            System.out.println((int)(2 + Math.random() * (7 - 2 + 1)));
        }

        //max,min返回最大值和最小值
        int min = Math.min(1,9);
        int max = Math.max(45,90);
        System.out.println("min=" + min);
        System.out.println("max=" + max);
    }
}

 

481,Arrays排序源码解读(源码看老韩讲解)

 

package com.hspedu.string;

import java.util.Arrays;
import java.util.Comparator;
import java.util.zip.DeflaterOutputStream;

public class Arrays01 {
    public static void main(String[] args) {
        Integer[] integers = {1,20,90};
        //遍历数组
//        for (int i = 0; i < integers.length; i++){
//            System.out.println(integers[i]);
//        }
        //直接使用 Arrays.toString方法,显示数组
        System.out.println(Arrays.toString(integers));

        //演示 sort方法的使用
        Integer arr[] = {1, -1, 7, 0, 89};
        //进行排序
        //老韩解读
        //1,可以直接使用冒泡排序,也可以直接使用Arrays提供的sort方法排序
        //2,因为数组是引用类型,所以通过sort排序后,会直接影响到 实参 arr
        //Arrays.sort(arr);//默认排序方法

        //定制排序
        //3,sort重载的,也可以通过传入一个接口 Comparator 实现定制排序
        //4,调用 定制排序 时,传入两个参数
        //  (1) 排序的数组 arr
        //  (2) 实现了Comparator接口的匿名内部类,要求实现 compare方法
        //5,先演示效果,再解释
        //6,这里体现了接口编程的方式
        Arrays.sort(arr, new Comparator() {//从大到小排
            @Override
            public int compare(Object o1, Object o2) {
                Integer i1 = (Integer) o1;
                Integer i2 = (Integer) o2;
                return i2 - i1;
            }
        });
        System.out.println("===排序后===");
        System.out.println(Arrays.toString(arr));
    }
}

 

482,Arrays模拟排序

冒泡排序+定制排序

package com.hspedu.string;

import java.util.Arrays;
import java.util.Comparator;

public class Arrays01 {
    public static void main(String[] args) {
        int[] arr = {1,-1,8,0,20};
        //bubble01(arr);

        bubble02(arr, new Comparator() {
            @Override
            public int compare(Object o1, Object o2) { //函数定义那里会传参进来,
                int i1 = (Integer)o1;
                int i2 = (Integer)o2;
                return i1 - i2; //如果大于0就走函数定义的if语句那里,就从小到大排
                                //return i2 - i1,是从大到小排
            }
        });
        System.out.println("===排序后的情况===");
        System.out.println(Arrays.toString(arr));

    }
    //使用冒泡完成排序,从小到大
    public static void bubble01(int[] arr) {
        int temp = 0;
        for(int i = 0; i < arr.length - 1; i++)
        {
            for(int j = 0; j < arr.length - 1 - i; j++)
            {
                if(arr[j] > arr[j+1])
                {
                    temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
    }

    //结合冒泡 + 定制
    public static void bubble02(int[] arr, Comparator c) {
        int temp = 0;
        for(int i = 0; i < arr.length - 1; i++)
        {
            for(int j = 0; j < arr.length - 1 - i; j++)
            {
                //数组排序由 c.compare(arr[j], arr[j+1]) 返回的值决定
                //从小到大
                if(c.compare(arr[j], arr[j+1]) > 0)
                {
                    temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
    }
}

 

483,Arrays其他方法

 

package com.hspedu.string;

import java.util.Arrays;
import java.util.List;
import java.util.RandomAccess;

public class Arrays01 {
    public static void main(String[] args) {
        Integer[] arr = {1,2,90,123,567};
        //binarySearch 通过二分搜索法进行查找,要求必须排好
        //老韩解读
        //1,使用 binarySearch 二叉查找
        //2,要求该数组是有序的,如果该数组是无序的,不能使用 binarySearch
        int index = Arrays.binarySearch(arr,1);
        System.out.println("index=" + index);

        //3,如果数组中不存在该元素,就返回 return -(low + 1); low是该元素应该出现的位置那,
        // 比如92,它应该出现在arr数组90 的前面,即low=3,return -4;
        int index1 = Arrays.binarySearch(arr,92);
        System.out.println("index1=" + index1);

        //copyOf 数组元素的复制
        //老韩解读
        //1,从 arr 数组中,拷贝 arr.length 个元素到 newArr 数组中
        //2,如果拷贝的长度 > arr.length 就在新数组的后面增加 null
        //3,如果拷贝的长度 < 0,就抛出异常 NegativeArraySizeException
        //4,该方法的底层使用的是 System.arraycopy()
        Integer[] newArr = Arrays.copyOf(arr, arr.length);
        System.out.println("==拷贝执行完毕后==");
        System.out.println(Arrays.toString(newArr));

        //fill 数组元素的填充
        Integer[] num = new Integer[]{9,3,2};
        //老韩解读
        //1,使用 99 去填充 num 数组,可以理解成是替换原来的元素
        Arrays.fill(num, 99);
        System.out.println("==数组填充后==");
        System.out.println(Arrays.toString(num));

        //equals 比较两个数组元素内容是否完全一致
        Integer[] arr2 = {1,2,90,123};
        //老韩解读
        //1,如果 arr 和 arr2 数组的元素一样,则方法true
        //2,如果不是完全一样,就返回 false
        boolean equals = Arrays.equals(arr,arr2);
        System.out.println("equals=" + equals);

        //asLish 将一组值,转换成list
        //老韩解读
        //1,asList方法,会将 (2,3,4,5,6,1) 数据转成一个List集合
        //2,返回的 asList 编译类型 List是接口
        //3,asList 运行类型 java.util.Arrays$ArrayList,是Arrays类的
        //   静态内部类 private static class ArrayList<E> extends AbstractList<E>
        //               implements RandomAccess, java.io.Serializable
        List asList = Arrays.asList(2,3,4,5,6,1);
        System.out.println("asList=" + asList);
        System.out.println("asList的运行类型" + asList.getClass());

    }
}

 

484,Arrays课堂练习

 

package com.hspedu.string;

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.RandomAccess;


public class Arrays01 {
    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)price从大到小
        Arrays.sort(books, new Comparator() {
            //这里是对Book数组排序,因此 o1 和 o2 就是Book对象
            @Override
            public int compare(Object o1, Object o2) { //注意返回值是 int
                Book book1 = (Book) o1;
                Book book2 = (Book) o2;
                double priceVal = book2.getPrice() - book1.getPrice(); //从大到小
                //这里老师进行了一个转换,只要compare结果 >0,<0就行
                //如果发现返回结果和我们输出的不一致,就修改一下返回的 1 和 -1
                if(priceVal > 0) {
                    return 1;
                } else if(priceVal <0) {
                    return -1;
                } else {
                    return 0;
                }
            }
        });
        System.out.println("==从大到小排序后==");
        System.out.println(Arrays.toString(books));

        //(2)price从小到大
        Arrays.sort(books, new Comparator() {
            //这里是对Book数组排序,因此 o1 和 o2 就是Book对象
            @Override
            public int compare(Object o1, Object o2) { //注意返回值是 int
                Book book1 = (Book) o1;
                Book book2 = (Book) o2;
                double priceVal = book2.getPrice() - book1.getPrice(); //从大到小
                //这里老师进行了一个转换,只要compare结果 >0,<0就行
                //如果发现返回结果和我们输出的不一致,就修改一下返回的 1 和 -1
                if(priceVal > 0) {
                    return -1;
                } else if(priceVal <0) {
                    return 1;
                } else {
                    return 0;
                }
            }
        });
        System.out.println("==从小到大排序后==");
        System.out.println(Arrays.toString(books));

        //(3)按照书名长度从大到小
        Arrays.sort(books, new Comparator() {
            //这里是对Book数组排序,因此 o1 和 o2 就是Book对象
            @Override
            public int compare(Object o1, Object o2) { //注意返回值是 int
                Book book1 = (Book) o1;
                Book book2 = (Book) o2;
                //要求按照书名的长度来进行排序
                return book2.getName().length() - book1.getName().length();
            }
        });
        System.out.println("==按书名长度从大到小排序后==");
        System.out.println(Arrays.toString(books));
    }
}
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 +
                '}';
    }
}

 

485和486,看老韩的课和笔记

 

 

488,Data应用实例

 

package com.hspedu.string;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Data01 {
    public static void main(String[] args) throws ParseException {
        //老韩解读
        //1,获取当前系统时间
        //2,这里的Date 类是在java.util包
        //3,默认输出的日期格式是国外的方式,因此通常需要对格式进行转换
        Date d1 = new Date();
        System.out.println("当前日期=" + d1);

        Date d2 = new Date(9234567);//通过指定毫秒数得到时间
        System.out.println("d2=" + d2);//获取某个时间对应的毫秒数

        //老韩解读
        //1,创建 SimpleDateFormat对象,可以指定相应的格式
        //2,这里的格式使用的字母是规定好,不能乱写
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss E");
        String format = sdf.format(d1); //format:将日期转换成指定格式的字符串
        System.out.println("当前日期=" + format);

        //老韩解读
        //1,可以把一个格式化的String 转成对应的 Date
        //2,得到Date 仍然在输出时,还是按照国外的形式,如果希望指定格式输出,需要转换
        //3,在把String->Date,使用的 str 格式需要和你给的String的格式一样,否则会抛出转换异常
        String s = "1996年01月01日 10:20:30 星期一";
        Date parse = sdf.parse(s);
        System.out.println("parse=" + sdf.format(parse));
    }
}

 

490,Calendar应用实例

 

package com.hspedu.string;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class Data01 {
    public static void main(String[] args) throws ParseException {
        //老韩解读
        //1,Calendar是一个抽象类,并且构造器是private
        //2,可以通过 getInstance() 来获取实例
        //3,提供大量的方法和字段提供给程序员
        Calendar c = Calendar.getInstance();
        System.out.println("c=" + c);

        //4,获取日历对象的某个日历字段
        System.out.println("年:" + c.get(Calendar.YEAR));

        //这里 + 1,是因为Calendar 返回月的时候,是按照0开始编号的
        System.out.println("月:" + c.get(Calendar.MONTH) + 1);

        System.out.println("日:" + c.get(Calendar.DAY_OF_MONTH));

        //5,如果我们需要按照 24小时进制来获取时间,Calendar.HOUR 改成 Calendar.HOUR_OF_DAY
        System.out.println("小时:" + c.get(Calendar.HOUR));
        System.out.println("小时:" + c.get(Calendar.HOUR_OF_DAY));

        System.out.println("分钟:" + c.get(Calendar.MINUTE));
        System.out.println("秒:" + c.get(Calendar.SECOND));

        //Calendar 没有专门的格式化方法,所以需要程序员自己来组合显示
        System.out.println(c.get(Calendar.YEAR) + "-" + (c.get(Calendar.MONTH) + 1) + "-" +
                c.get(Calendar.DAY_OF_MONTH) + "  " + c.get(Calendar.HOUR_OF_DAY) + ":" +
                c.get(Calendar.MINUTE) + ":" + c.get(Calendar.SECOND));
    }
}

 

491,第三代日期使用

 

package com.hspedu.string;

import java.text.ParseException;;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class LocalDate01 {
    public static void main(String[] args) throws ParseException {
        //第三代日期
        //老韩解读
        //1,使用now() 返回表示当前日期时间的 对象
        LocalDateTime ldt = LocalDateTime.now(); //LocalDate.now();  //LocalTime.now()
        System.out.println(ldt);

        //2,使用DateTimeFormatter 对象来进行格式化
        //   创建 DateTimeFormatter对象
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String format = dateTimeFormatter.format(ldt);
        System.out.println("格式化的日期=" + format);

        System.out.println("年=" + ldt.getYear());
        System.out.println("月=" + ldt.getMonth());
        System.out.println("月=" + ldt.getMonthValue());
        System.out.println("时=" + ldt.getHour());
        System.out.println("分=" + ldt.getHour());
        System.out.println("秒=" + ldt.getSecond());
    }
}

 

492,第三代日期方法

 

package com.hspedu.string;

import java.text.ParseException;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;;

public class LocalDate01 {
    public static void main(String[] args) throws ParseException {
        //1,通过 静态方法 now() 获取表示当前时间戳的对象
        Instant now = Instant.now();
        System.out.println(now);

        //2,通过 from 可以把 Instant 转成 Date
        Date date = Date.from(now);

        //3,通过 date 的 toInstant() 可以把 date 转成 Instant 对象
        Instant instant = date.toInstant();

        //1,使用now() 返回表示当前日期时间的 对象
        LocalDateTime ldt = LocalDateTime.now();
        //   创建 DateTimeFormatter对象
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

        //提供 plus 和 minus 方法可以对当前时间进行加或者减
        //看看11天后,是什么时候,把 年月日-时分秒输出
        LocalDateTime localDateTime = ldt.plusDays(11);
        System.out.println("11天后=" + dateTimeFormatter.format(localDateTime));

        //看看10分钟前是什么时候,把 年月日-时分秒输出
        LocalDateTime localDateTime1 = ldt.minusMinutes(10);
        System.out.println("10分钟前日期=" + dateTimeFormatter.format(localDateTime1));
    }
}

 

493,String翻转

 (1)

 

package com.hspedu.string;

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);
    }
    /**
     * 思路分析
     * (1)先把方法定义确定
     * (2)把 String 转成 char[],因为 char[] 的元素是可以交换的
     * (3)画出分析示意图
     * (4)代码实现
     */
    public static String reverse(String str, int start, int end) {
        //对输入的参数做一个验证
        //老韩重要的编程技巧分享!!!
        //(1) 写出正确的情况
        //(2) 然后取反即可
        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);
    }
}

 

494,注册处理题

 

可以自己加Scanner 

 

package com.hspedu.string;

import java.util.Scanner;

public class Homework01 {
    public static void main(String[] args) {
        String name = "jack";
        String pwd = "123456";
        String email = "jack@sohu.com";

        try {
            userRegister(name,pwd,email);
            System.out.println("恭喜你注册成功!");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
    /**
     * 思路分析
     * (1)先把方法定义确定 userRegister(String name, String pwd, String email)
     * (2)针对 输入的内容进行核验,如果发现有问题,就抛出异常,给出提示
     * (3)单独的写一个方法,判断 密码是否全部是数字字符 boolean
     * (4)代码实现
     */
    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('@'); //获取@ 在 email的位置
        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;
    }
}

 

另外一种结果是 写成 if 里的条件。比如, String name = null;

 

495,字符串统计(第2个题)

 

package com.hspedu.string;

import java.util.Scanner;

public class Homework01 {
    public static void main(String[] args) {
        String name = "Han Shun Ping";
        printName(name);
    }
    /**
     * 思路分析
     * (1)对输入的字符串进行分割 split(" ")
     * (2)对得到的String[] 进行格式化 String.format()
     * (3)对输入的字符串进行校验即可
     */
    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);
    }

}

 

字符串统计

 

package com.hspedu.string;

import java.util.Scanner;

public class Homework01 {
    public static void main(String[] args) {
       String str = "abcHsp U 1234";
       countStr(str);
    }
    /**
     * 思路分析
     * (1)遍历字符串,如果 char 在 '0'~'9' 就是一个数字
     * (2)如果 char 在 'a'~'z' 就是一个小写字母
     * (3)如果 char 在 'A'~'Z' 就是一个大写字母
     * (4)使用三个变量来记录 统计结果
     */
    public static void countStr(String str) {
        if (str == null) {
            System.out.println("输入不能为 null");
            return;
        }
        int strLen = str.length();
        int numCount = 0;
        int lowerCount = 0;
        int upperCount = 0;
        int otherCount = 0;
        for (int i = 0; i < strLen; 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);
    }
}

 

与Java基础 韩顺平老师的 常用类 的部分笔记相似的内容:

Java基础 韩顺平老师的 常用类 的部分笔记

459,八大Wrapper类 包装类的分类 1) 针对八种基本数据类型相应的引用类型—包装类 2) 有了类的特点, 就可以调用类中的方法。 460,装箱和拆箱 package com.hspedu.Wrapper; public class WrapperType { public static v

java基础 韩顺平老师的 异常 自己记的部分笔记

443,异常处理入门 package com.hspedu.exception_; public class Exception { public static void main(String[] args) { int num1 = 10; int num2 = 0; //老韩解读 //1,nu

我在前端写Java SpringBoot项目

本篇文章主要是使用 NestJs + Sequelize + MySQL 完成基础运行, 带大家了解 Node 服务端的基础搭建,也可以顺便看看 Java SpringBoot 项目的基础结构,它俩真的非常相似,不信你去问服务端开发同学。

[转帖]【JVM】类文件结构

Class文件的定义 一组以8字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑排列在class文件中,中间没有任何分隔符,这使得class文件中存储的内容几乎是全部程序运行的程序。 注:Java虚拟机规范规定,Class文件格式采用类似C语言结构体的伪结构来存储数据,这种结构只有两种数据类型:

Java基础:线程的三种创建方式

一、继承Thread类 定义一个类继承线程类Thread 重写run()方法 创建线程对象 调用线程对象的start()方法创建线程 Thread类的常用API setName(String name):给线程取名字 getName():获取线程的名字 public static Thread cu

Java基础:throw和throws的详解

总结来说,throw是用来抛出一个具体的异常实例,而throws是用来声明方法可能会抛出哪些类型的异常,是对调用者的一种通知和要求。 1. throw 作用: throw关键字用于在方法体内实际抛出一个异常实例。当程序运行到throw语句时,指定的异常会被创建并抛出,立即终止当前方法的执行,并将控制

浅拷贝、深拷贝与序列化【初级Java必需理解的概念】

浅拷贝 首先创建两个类,方便理解浅拷贝 @Data class Student implements Cloneable{ //年龄和名字是基本属性 private int age; private String name; //书包是引用属性 private Bag bag; public Stu

Fastjson基础环境配置与Java基础概念

Preface 此篇系列文章将会从 Java 的基础语法开始,以 Fastjson 的各个反序列化漏洞分析为结尾,详细记录如何从一个具有基础面向对象编程但毫无 Java 基础的小白成长为了解 Fastjson 的各个漏洞并能够熟练利用的网络安全人员。 环境配置 我们使用 IDEA 作为开发的 IDE

不只有 Spring,这四款 Java 基础开发框架同样值得关注! 审核中

Java 开发不只有 Spring ,今天给大家推荐几个同样优秀的 Java 基础开发框架,为日常项目开发提供更多的选择。答应我,请不要再叫我 Spring 小子了,​好吗? 项目概览: Guice:轻量级依赖注入框架 Javalin:轻量级 Java 和 Kotlin Web 框架 Quarkus

从源码入手详解ReentrantLock,一个比synchronized更强大的可重入锁

写在开头 随手一翻,发现对于Java中并发多线程的学习已经发布了十几篇博客了,多线程 是Java基础中的重中之重!因此,可能还需要十几篇博客才能大致的讲完这部分的知识点,初学者对于这部分内容一定要多花心思,不可马虎!今天我们继续来学习一个重要知识点:ReentrantLock ReentrantLo