《Java基础入门 极速版》

ch05 Java流程控制


5.1 Object

Object类是所有Java类的祖先。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。

Object API

方法名 描述
Object() 默认构造方法
toString() 返回该对象的字符串表示。
getClass() 返回一个对象的运行时类。
equals(Object obj) 指示某个其他对象是否与此对象“相等”。
hashCode() 返回该对象的哈希码值。
clone() 创建并返回此对象的一个副本。
notify() 唤醒在此对象监视器上等待的单个线程。
notifyAll() 唤醒在此对象监视器上等待的所有线程。
wait() 导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。
wait(long timeout) 导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量。
wait(long timeout, int nanos) 导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量。
finalize() 当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。

equals() (判断两个对象是否相等)

【例题1】 Object举例

package cn.du.ch05;

public class Java01_Object {
    public static void main(String[] args) {

        // TODO 常见类和对象
        System.out.println("常见类和对象 - Object对象【杜老师改编】");
        // java.lang.Object : 对象
        Object obj = new Person();
        // Object obj = new User();

        // 讲对象转换成字符串。
        // toString默认打印的就是对象的内存地址,所以,为了能够更直观理解对象的内容,所以可以重写这个方法
        System.out.println("obj.toString(): "+ obj.toString());

        // TODO 获取对象的内存地址
        System.out.println("obj.hashCode(): " + obj.hashCode());

        // TODO 判断两个对象是否相等, 如果相等,那么返回true,否则返回false
        // equals方法比较对象时,默认比较就是内存地址
        Person other = new Person();
        System.out.println("other.hashCode(): "+other.hashCode());
        System.out.println("obj.equals(other)= "+obj.equals(other));

        // getClass获取对象的类型信息
        Class<?> aClass = obj.getClass();
        System.out.println("简洁类名:" + aClass.getSimpleName());
        System.out.println("包名:"+aClass.getPackageName());
        System.out.println("obj的父类名称:" + aClass.getSuperclass().getSimpleName());
    }
}
class Person {    // Object是超类----所有未指明父类的父类
    public String name = "杜老师";

    @Override
    public String toString() {
        return "Person["+name+"]";
    }

//    @Override
//    public boolean equals(Object obj) {
//        return true;
//    }
}

class User extends Person {

}
图1 Object举例
图1 Object举例之二

5.2 数组

【例题2】 数组举例之一

package cn.du.ch05;

public class Java02_Object {
    public static void main(String[] args) {

        // TODO 常见类和对象 - 数组
//        User1 user1 = new User1();
//        User1 user2 = new User1();
//        User1 user3 = new User1();
//        User1 user4 = new User1();
//
//        user1.test();
//        user2.test();
//        user3.test();
//        user4.test();

        System.out.println("常见类和对象 - 数组【杜老师整理】");
        // 0, 1, 2, 3
        User1[] users = new User1[5];
        for ( int i = 0; i < users.length; i++ ) {
            users[i] = new User1();
            users[i].test();
        }

        // TODO 数组的声明方式:类型[] 变量;
        // TODO 数组的创建:new 类型[容量];
        String[] names = new String[3];
        // 给数组的小格子添加数据,添加的方式为 :数组变量[索引] = 数据
        // 添加数据和访问数据时,索引是不能超过指定的范围的(0 ~ length-1)
        // 如果重复给相同的索引添加数据,那么等同于修改数据
        names[0] = "张三";
        names[0] = "张山";  // 覆盖
        names[1] = "李四";
        names[2] = "王五";
        // names[3] = "赵六";  // 索引超过指定的范围的(0 ~ length-1)

        // 查询(访问)数据,访问的方式为 :数组变量[索引]
//        System.out.println(names[0]);
//        System.out.println(names[1]);
//        System.out.println(names[2]);
        System.out.println("****************************");
        for ( int i = 0; i < names.length; i++ ) {
            System.out.println(names[i]);
        }
    }
}
class User1 {
    public void test() {
        System.out.println("  test()方法运行...");
    }
}
图2 数组举例之1

【例题3】 数组举例之二

package cn.du.ch05;

public class Java03_Object {
    public static void main(String[] args) {

        // TODO 常见类和对象 - 数组
        System.out.println("常见类和对象 - 数组【杜老师改编】");
        int[] nums = new int[3];
        nums[0] = 1;
        for (Object num : nums) {
            System.out.print(num+"    ");
        }
        System.out.println("\nnums.length = "+ nums.length+"\n");

        String[] 直辖市 = {"北京", "天津", "上海", "重庆"};
        System.out.println(直辖市);
        System.out.println(直辖市.toString());
        for (String name : 直辖市) {
            System.out.print(name+"    ");
        }
        System.out.println("\n直辖市.length = "+直辖市.length+"\n");

        // 二维数组
        String[][] 省区市 = {{"特别行政区", "香港", "澳门"}, {"自治区", "新疆", "西藏", "广西", "内蒙", "宁夏"}, {"直辖市", "北京", "天津", "上海", "重庆"},{"省", "河北", "山西", "黑龙江", "吉林", "辽宁", "江苏", "浙江", "安徽", "福建", "江西", "山东", "河南", "湖北", "湖南", "广东", "海南", "四川", "贵州", "云南", "陕西", "甘肃", "青海", "台湾"}};
        for ( String[] row: 省区市 ) {
            for ( String x: row ) {
                System.out.print(x + "  ");
            }
            System.out.println();
        }
        System.out.println("省区市.length = "+省区市.length);
        System.out.println("省区市[2].length = "+省区市[2].length);
        System.out.println("省区市[3].length = "+省区市[3].length);
        System.out.println();

        // 标准的二维数组
        String[][] namess = new String[3][3];
        namess[0][1] = "杜老师";
        System.out.println("namess[1][1] = "+namess[1][1]);
        for ( int row = 0; row < 3; row++ ) {
            for ( int col = 0; col < 3; col++ ) {
                System.out.print(namess[row][col] + "      ");
            }
            System.out.println();
        }
    }
}
图3 数组举例之2

【例题4】 二维数组-九层妖塔

package cn.du.ch05;

public class Java03_Object_Test {
    public static void main(String[] args) {

        // TODO 常见类和对象
        // 二维数组-九层妖塔
        /*
            *
           ***
          *****
         *******
         */
        // 1 => 1
        // 2 => 3
        // 3 => 5
        // 4 => 7

        // 1 => 0
        // 2 => 1
        // 3 => 2
        // 4 => 3

        // 0 =>   8
        // 1 =>  789
        // 2 => 678910

        int row = 9;
        int col = 2 * (row - 1) + 1;
        System.out.println("二维数组-九层妖塔[【杜老师改编】");

        String[][] nineTower = new String[row][col];

        for ( int i = 0; i < row; i++ ) {
            for ( int j = 0; j < col; j++ ) {
                if ( j >= ( row - 1 ) - i && j <= ( row - 1 ) + i  ) {
                    nineTower[i][j] = "*";
                } else {
                    nineTower[i][j] = " ";
                }
            }
        }

        for ( int i = 0; i < row; i++ ) {
            for ( int j = 0; j < col; j++ ) {
                System.out.print(nineTower[i][j]);
            }
            System.out.println();
        }
    }
}
图4 二维数组-九层妖塔

【例题5】数组-排序举例

package cn.du.ch05;

public class Java03_Object_Test_1 {
    public static void main(String[] args) {

        // TODO 常见类和对象-数组-排序
        System.out.println("数组-排序【杜老师改编】");
        int[] nums = {1,4,3,5,2};
        for (int num : nums) {
            System.out.print(num+"    ");
        }
        System.out.println();

        // TODO 希望获取到的数据,1,2,3,4,5
        // 简化需求:将数组中的最大值放置数组的最后
        for ( int j = 0; j < nums.length; j++ ) {
            for ( int i = 0; i < nums.length - j - 1; i++ ) {
                int num1 = nums[i];
                int num2 = nums[i+1];
                if ( num1 > num2 ) {
                    // 左边的数据大于右边的数据,应该交互位置
                    nums[i] = num2;
                    nums[i+1] = num1;
                }
            }
        }

        for (int num : nums) {
            System.out.print(num+"    ");
        }
    }
}
图5 数组-排序举例

【例题6】数组-选择排序举例

package cn.du.ch05;

public class Java03_Object_Test_2 {
    public static void main(String[] args) {
        // TODO 常见类和对象
        // 数组 - 选择排序
        System.out.print("数组-选择排序【杜老师整理】\n排序前:");
        int[] nums = {1,4,3,5,2};
        for (int num : nums) {
            System.out.print(num+"   ");
        }
        System.out.print("\n排序后:");
        for ( int j = 0; j < nums.length; j++ ) {
            int maxIndex = 0;
            for ( int i = 1; i < nums.length - j; i++ ) {
                if ( nums[i] > nums[maxIndex] ) {
                    maxIndex = i;
                }
            }

            int num1 = nums[nums.length-j-1];
            int num2 = nums[maxIndex];

            nums[maxIndex] = num1;
            nums[nums.length-j-1] = num2;
        }

        for (int num : nums) {
            System.out.print(num+"   ");
        }
    }
}
图6 举例

【例题7】举例

package cn.du.ch05;

public class Java03_Object_Test_3 {
    public static void main(String[] args) {

        // TODO 常见类和对象
        // 数组 - 数据查询 - 二分查找法
        System.out.println("数组-数据查询-二分查找法--对分检索【杜老师整理】");
        int[] nums = {0,1,2,3,4,5,6,7,9,12,18};
        for (int num : nums) {
            System.out.print(num+"   ");
        }
        System.out.println();

        // 查询目标
//        int targetNum = 6;
//        int start = 0;
//        int end =  nums.length - 1;
//        int middle = 0;
//        while ( start <= end ) {
//            middle = (start + end) / 2;
//            if ( nums[middle] > targetNum ) {
//                end = middle - 1;
//            } else if ( nums[middle] < targetNum ) {
//                start = middle + 1;
//            } else {
//                break;
//            }
//        }
        System.out.println(" 6 数据在数组的位置:" + find(nums,6));
        System.out.println(" 0 数据在数组的位置:" + find(nums,0));
        System.out.println("10 数据在数组的位置:" + find(nums,10));
        System.out.println("12 数据在数组的位置:" + find(nums,12));
        System.out.println("15 数据在数组的位置:" + find(nums,15));
        System.out.println("18 数据在数组的位置:" + find(nums,18));
    }

    static int find(int[] nums, int targetNum){
        // 查询目标
        int start = 0;
        int end =  nums.length - 1;
        int middle = 0;
        while ( start <= end ) {
            middle = (start + end) / 2;
            if ( nums[middle] > targetNum ) {
                end = middle - 1;
            } else if ( nums[middle] < targetNum ) {
                start = middle + 1;
            } else {
                break;
            }
        }
        return middle;
    }
}
图7 举例

5.3 字符串

【例题8】字符串举例

package cn.du.ch05;

import java.util.Scanner;

public class Java04_Object_String {
    public static void main(String[] args) throws Exception {

        // TODO 常见类和对象
        // TODO 字符串连续字符组成形成的数据整体
        // java.lang.String
        // 字符串,字符,字节的关系
        System.out.println("字符串,字符,字节的关系【杜老师整理】");

        String name = "杜老师";
        String name2 = "杜老师";
        String name3 = "杜老师";
        String name4 = "杜老师";
        String name1 = new String("杜老师");  //new String是冗余的
        char[] cs = {'a', '中', '国'};
        byte[] bs = {-28,-72,-83,-27,-101,-67};

        String s = new String(cs);
        String s1 = new String(bs, "UTF-8");

        System.out.println(s);
        System.out.println(s1);
        String s2 = "\"";
        // 转义字符:\" => 文字内容的双引号
        // \', \t, \n, \\
        System.out.println("双引号:"+s2);
        System.out.println("单引号:\'");
        System.out.println("ab之间tab键:a\tb");
        System.out.println("cd之间换行键:c\nd");
        System.out.println("ef之间转义字符----反斜杠:e\\f");
    }
}
图8 字符串举例

【例题9】字符串操作

package cn.du.ch05;

public class Java04_Object_String_1 {
    public static void main(String[] args) throws Exception {

        // TODO 字符串操作
        System.out.println("字符串操作【杜老师整理】");
        // TODO 拼接:将多个字符串连接在一起
        {
            System.out.println("1. 拼接:将多个字符串连接在一起");
            String s = "a" + "b"; // "ab"
            String s1 = "ab";
            String s2 = "abc" + 1 + 2; // abc12
            String s3 = 1 + "abc" + 2; // 1abc2
            String s4 = (1 + 2) + "abc"; // 3abc

            System.out.println("s.hashCode() = "+s.hashCode());
            System.out.println("s1.hashCode() = "+ s1.hashCode());
            System.out.println(s2);
            System.out.println(s3);
            System.out.println(s4);
            System.out.println(s1.concat("abc")+"\n");
        }

        // TODO 字符串的比较
        {
            System.out.println("2. 字符串的比较");
            String a = "a";
            String b = "A";

            // 相等
            System.out.println("a.equals(b) = "+a.equals(b));
            // 忽略大小写的相等
            System.out.println("a.equalsIgnoreCase(b) = " + a.equalsIgnoreCase(b));

            // i = 正数,a > b
            // i = 负数,a < b
            // i = 0, a = b

            byte b1 = (byte) 'A';
            byte b2 = (byte) 'a';
            System.out.println("A = " + b1);
            System.out.println("a = " + b2);

            int i = a.compareTo(b);
            System.out.println(i);
            // 忽略大小写的比较
            System.out.println(a.compareToIgnoreCase(b)+"\n");
        }

        // TODO 字符串的截断操作 : 截取字符串的操作
        {
            System.out.println("3. 字符串的截断操作");
            String s = "  Hello World   ";
            // 子字符串
            // substring方法用于截取字符串,需要传递两个参数,
            //     第一个参数表示截取字符串的起始位置(索引,包含)
            //     第二个参数表示截取字符串的结束位置(索引,不包含)
            System.out.println(s.substring(0, 3));
            System.out.println(s.substring(0, "Hello".length()));
            System.out.println(s.substring(6, s.length()));
            // substring方法如果只传递一个参数,那么就表示从指定位置开始截取字符串,然后截取到最后
            System.out.println(s.substring(6));
            // 分解字符串 :根据指定的规则对字符串进行分解。可以将一个完整的字符串,分解成几个部分。
            String[] s1 = s.split(",");
            System.out.println(s1.length);
            for (String s2 : s1) {
                System.out.println(s2);
            }
            // TODO trim : 去掉字符串的首尾空格的意思
            System.out.println("去掉字符串的首尾空格 !" + s.trim() + "!\n");
        }

        // TODO 字符串的替换。
        {
            System.out.println("4. 字符串的替换");
            String s = "Hello World 杜老师"; // Hello Java Java
            // 替换
            System.out.println(s.replace("World 杜老师", "Java"));
            // replaceAll按照指定的规则进行替换
            System.out.println(s.replaceAll("World|杜老师", "Java")+"\n");
        }

        // TODO 字符串的大小写转换
        {
            System.out.println("5. 字符串的大小写转换");
            String s = "Hello World";

            System.out.println(s.toLowerCase());
            System.out.println(s.toUpperCase());
            String className = "user"; // u + ser

            String s1 = className.substring(0, 1); // u
            String s2 = className.substring(1); // ser

            System.out.println(s1.toUpperCase() + s2+"\n");
        }

        // TODO 字符串的查找
        {
            String s = "Hello 杜老师 World World";
            System.out.println("6. 字符串的查找:"+s);
            char[] chars = s.toCharArray();
            byte[] bytes = s.getBytes("UTF-8");
            // charAt可以传递索引定位字符串中指定位置的字符
            System.out.println("位置为1的字符:"+s.charAt(1));
            // indexof方法用于获取数据在字符串中第一次出现的位置。
            System.out.println("第一次出现World的位置: "+s.indexOf("World"));
            // lastIndexOf方法用于获取数据在字符串中最后一次出现的位置。
            System.out.println("最后一次出现World的位置: "+s.lastIndexOf("World"));
            // 是否包含指定的字符串,返回布尔类型
            System.out.println("是否包含Hello123: "+s.contains("Hello123"));
            // 判断字符串是否以指定的数据开头,返回布尔类型
            System.out.println("是否以Hello开头: "+s.startsWith("Hello"));
            // 判断字符串是否以指定的数据结尾,返回布尔类型
            System.out.println("是否以World结尾: "+s.endsWith("World"));
            // 判断字符串是否为空,空格其实是一个特殊的字符,所以看不到,但是不为空。
            System.out.println("字符串是否为空: "+s.isEmpty());
        }
    }
}
图9 字符串操作

StringBuilder和String区别

【例题10】stringBuilder字符串

package cn.du.ch05;

public class Java04_Object_String_2 {
    public static void main(String[] args) throws Exception {

        // TODO 常见类和对象
        // StringBuilder : 构建字符串

        System.out.println("StringBuilder【杜老师整理】");
        String s = "";
        for ( int i = 0; i < 50; i++ ) {
            s = s + i; // 01234....
        }
        System.out.println(s);

        // "a" + "b" => "ab"
        StringBuilder sb = new StringBuilder();
        for ( int i = 0; i < 30; i++ ) {
            sb.append(i);
        }
        System.out.println(sb.toString());

        StringBuilder s1 = new StringBuilder();
        s1.append("abcdef");
        System.out.println("\ns1.toString()="+s1.toString());
        System.out.println("s1.length()="+s1.length());
        System.out.println("s1.reverse()="+s1.reverse()); // 反转字符串
        System.out.println("s1 1位置 插入d ="+s1.insert(1, "d"));

    }
}
图10

【例题11】String及其unicode

package cn.du.ch05;

public class Java04_Object_String_4 {

    /**
     * 字符串转unicode
     *
     * @param str
     * @return
     */
    public static String str2Unicode(String str) {
        str = (str == null ? "" : str);
        String tmp;
        StringBuffer sb = new StringBuffer(1000);
        char c;
        int i, j;
        sb.setLength(0);
        for (i = 0; i < str.length(); i++) {
            c = str.charAt(i);
            sb.append("\\u");
            j = (c >>> 8); // 取出高8位
            tmp = Integer.toHexString(j);
            if (tmp.length() == 1)
                sb.append("0");
            sb.append(tmp);
            j = (c & 0xFF); // 取出低8位
            tmp = Integer.toHexString(j);
            if (tmp.length() == 1)
                sb.append("0");
            sb.append(tmp);
        }
        return sb.toString();
    }

    /**
     * 字符串转unicode
     *
     * @param str
     * @return
     */
    public static String strToUnicode(String str) {
        StringBuilder sb = new StringBuilder();
        char[] c = str.toCharArray();
        for (int i = 0; i < c.length; i++) {
            sb.append("\\u" + Integer.toHexString(c[i]));
        }
        return sb.toString();
    }

    /**
     * unicode转字符串
     *
     * @param unicode
     * @return
     */
    public static String unicodeToStr(String unicode) {
        StringBuilder sb = new StringBuilder();
        String[] hex = unicode.split("\\\\u");
        for (int i = 1; i < hex.length; i++) {
            int index = Integer.parseInt(hex[i], 16);
            sb.append((char) index);
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        System.out.println("String及其Unicode【杜老师整理】");
        String ucode = str2Unicode("Hollow 世界");
        System.out.println(ucode);
        System.out.println(unicodeToStr(ucode) + "\n");

        ucode = strToUnicode("Hollow 新世界");
        System.out.println(ucode);
        System.out.println(unicodeToStr(ucode) + "\n");

        ucode = strToUnicode("杜兆将");
        System.out.println(ucode);
        System.out.println(unicodeToStr(ucode));

        System.out.print(Character.toString(0x675c));
        System.out.print(Character.toString(0x5146));
        System.out.print(Character.toString(0x5c06));
    }
}
图11 String及其Unicode

5.4 包装

【例题12】基本数据类型的包装类

package cn.du.ch05;

public class Java05_Object_Datatype {
    public static void main(String[] args) throws Exception {

        // TODO 常见类和对象
        System.out.println("基本数据类型的包装类【杜老师整理】");
        // byte short int long
        // float double
        // char
        // boolean
        // TODO 包装类
        {
            Byte b = null;
            Short s = null;
            Integer i = null;
            Long lon = null;
            Float f = null;
            Double d = null;
            Character c = null;
            Boolean bln = null;
        }

        // TODO 将基本数据类型转换为包装类型
        {
            // 自动装箱
            int i = 10;
            // Integer i1 = new Integer(i);  //已弃用
            // Integer i2 = Integer.valueOf(i);  //不必要的装箱 'Integer.valueOf(i)'
            Integer i3 = i;
            System.out.println("i3的类型:"+i3.getClass());
            System.out.println("比较i3.equals(11):"+i3.equals(11));
            System.out.println("比较i3.equals(10):"+i3.equals(10));
            System.out.println("比较 i3 == 10):"+(i3 == 10));
            System.out.println("比较 i3 == 11):"+(i3 == 11));

            // 自动拆箱
            //int i4 = i3.intValue();
            int i5 = i3;
            System.out.println("比较 i == i5):"+(i == i5));
        }
    }
}
图12 基本数据类型的包装类

5.5 日期、日历类

【例题13】日期

package cn.du.ch05;

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

public class Java06_Object_Date {
    public static void main(String[] args) throws Exception {

        // TODO 常见类和对象
        // Date : 日期类
        // 时间戳 : 毫秒
        SimpleDateFormat sdf0 = new SimpleDateFormat("yyyy-MM-dd HH:mm.ss");
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日");

        long l = System.currentTimeMillis();
        System.out.println("时刻1:long l = System.currentTimeMillis()\n  当下从1970.1.1 0:0:0:000 开始过去的毫秒数 ="+l);
        System.out.println("  当下从1970.1.1 0:0:0:000 开始过去的秒数 ="+(l/1000));
        System.out.println("  当下从1970.1.1 0:0:0:000 开始过去的天数 ="+(l/1000/60/60/24));
        System.out.println("  当下从1970.1.1 0:0:0:000 开始过去的天数 ="+(l/1000/60/60/24/365));
        // 根据时间戳构建指定的日期对象。
        Date d1 =  new Date(l);
        System.out.println("  毫秒数:"+d1.getTime());
        System.out.println("  中国标准日期格式 "+sdf0.format(d1));
        System.out.println("  中国标准日期格式 "+sdf1.format(d1));
        System.out.println("  中国标准日期格式 "+sdf2.format(d1));
        Thread.sleep(2000);

        // Date : 日期类
        // Calendar : 日历类
        Date d2 = new Date();
        System.out.println("\n时刻2:Date d2 = new Date();\n  一般Date格式 "+d2);

        // Java格式化日期格式:
        // y (Y) -> 年 -> yyyy
        // m (M) -> MM : 月份,mm:分钟
        // d (D) -> dd : 一个月中的日期,D:一年中的日期
        // h (H) -> h : 12进制, HH:24进制
        // s (S) -> s : 秒,S :毫秒

        // Date -> String
        System.out.println("  中国标准时间格式 "+sdf0.format(d2));
        System.out.println("  中国标准日期格式 "+sdf1.format(d2));
        System.out.println("  中国标准日期格式 "+sdf2.format(d2));

        // String -> Date
        String dateString = "2022-06-01";
        System.out.println("\n时刻3:2022-06-01");
        Date parseDate = sdf1.parse(dateString);
        System.out.println("  默认格式:"+parseDate);
        System.out.println("  中国标准时间格式:"+sdf0.format(parseDate));
        System.out.println("  中国标准时间格式:"+sdf1.format(parseDate));
        System.out.println("  中国标准日期格式:"+sdf2.format(parseDate));
        System.out.println("  在当前时刻d1之前:"+parseDate.before(d1));
        System.out.println("  在当前时刻d1之后:"+parseDate.after(d1));
    }
}
图13 日期

【例题14】日历

package cn.du.ch05;

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

public class Java07_Object_Date {
    public static void main(String[] args) throws Exception {

        // TODO 常见类和对象

        // 日历类
        System.out.println("日历类【杜老师改编】");
        Calendar instance = Calendar.getInstance(); ///当前时间的calendar对象
        System.out.println("instance = "+instance);
        System.out.println("年 = " + instance.get(Calendar.YEAR));
        System.out.println("月 = " + instance.get(Calendar.MONTH));  // 这里二月 为 1
        System.out.println("日 = " + instance.get(Calendar.DATE));
        //System.out.println(instance.get(Calendar.DAY));

        // instance.setTime(new Date());
        instance.add(Calendar.YEAR, -1);
        System.out.println("instance.add(Calendar.YEAR, -1)  年 = " + instance.get(Calendar.YEAR));

    }
}
图14 日历

【例题15】打印日历

package cn.du.ch05;

import java.util.Calendar;
import java.util.Date;

public class Java07_Object_Date_Test {
    public static void main(String[] args) throws Exception {

        // TODO 常见类和对象
        // 打印当前日历
        System.out.println("周一\t周二\t周三\t周四\t周五\t周六\t周日");
        // 获取当前日期的日历对象
        Calendar firstDate = Calendar.getInstance();
        // 把日历对象设定位当前月的第一天 : 10-01
        firstDate.set(Calendar.DAY_OF_MONTH, 1);
        // 获取当前月最大的日期 : 31
        int maxDay = firstDate.getMaximum(Calendar.DAY_OF_MONTH);
        for ( int i = 0; i < maxDay; i++ ) {
            // 当前日期是周几
            int weekX = firstDate.get(Calendar.DAY_OF_WEEK);
            // 当前日期是几号
            int monthY = firstDate.get(Calendar.DAY_OF_MONTH);
            if ( i == 0 ) {
                if (weekX == Calendar.SUNDAY) {
                    for ( int j = 0; j < 6; j++ ) {
                        System.out.print("\t\t");
                    }
                    System.out.println(monthY);
                } else {
                    // 周日是1,周一是2...周六是7
                    for ( int j = 0; j < weekX - 2; j++ ) {
                        System.out.print("\t\t");
                    }
                    System.out.print(monthY);
                    System.out.print("\t\t");
                }
            } else {
                // 不是一号的场合
                if ( weekX == Calendar.SUNDAY ) {
                    System.out.println(monthY);
                } else {
                    System.out.print(monthY);
                    System.out.print("\t\t");
                }
            }
            // 打印日历后,应该增加一天
            firstDate.add(Calendar.DATE, 1);
        }

    }
}
图15 打印日历

5.6 工具类

【例题16】StringUtil工具类

package cn.du.ch05;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Random;
import java.util.UUID;

public class Java08_Object_Util {
    public static void main(String[] args) throws Exception {
        System.out.println("StringUtil【杜老师】");
        System.out.println("null   是否为空:"+StringUtil.isEmpty(null));
        System.out.println("\"\"     是否为空:"+StringUtil.isEmpty(""));
        System.out.println("\"   \" 是否为空:"+StringUtil.isEmpty("   "));
        System.out.println("\"abc\" 是否为空:"+StringUtil.isEmpty("abc"));

        System.out.println("UUID1 = "+StringUtil.makeString());
        System.out.println("UUID2 = "+StringUtil.makeString("abcdedf123456", 6));
        System.out.println("UUID3 = "+StringUtil.makeString("abcdedf123456", 32));
        System.out.println("UUID4 = "+StringUtil.makeString("abcdedf123456", 36));

        System.out.println("今天的日期格式化:"+StringUtil.formatDate(new Date(), "yyyy-MM-dd"));
        System.out.println("解析字符串2020-06-14为日期:"+StringUtil.parseDate("2020-06-14", "yyyy-MM-dd"));
    }
}
// 字符串工具类
// 1. 工具类不应该创建对象才能使用,也就意味着,可以直接使用类中的属性和方法,一般都声明为静态的。
// 2. 工具类对外提供的属性或方法都应该是公共的。
// 3. 为了使用者开发方便,应该尽量提供丰富的方法和属性
class StringUtil {
    // 非空判断
    public static boolean isEmpty(String str) {
        // 如果字符串为null,为空
        if ( str == null ) {
            return true;
        }
        // 如果字符串为空字符串,为空
        if ( "".equals(str) ) {
            return true;
        }
        // 如果字符串全都是空格,也为空
        if ( "".equals(str.trim()) ) {
            return true;
        }
        if ( str == null || "".equals(str.trim()) ) {
            return true;
        }
        return false;
    }

    public static boolean isNotEmpty(String str) {
        return !isEmpty(str);
    }

    // 生成随机字符串
    public static String makeString() {
        return UUID.randomUUID().toString();
    }

    public static String makeString(String from, int len) {
        if ( len < 1 ) {
            return "";
        } else {
            char[] chars = from.toCharArray();
            StringBuilder str = new StringBuilder();
            for ( int i = 0; i < len; i++ ) {
                Random random = new Random();
                int j = random.nextInt(chars.length);
                char c = chars[j];
                str.append(c);
            }
            return str.toString();
        }
    }

    // 转换字符串 : ISO8859-1 => str => UTF-8
    public static String transform( String source, String encodeFrom, String encodeTo  ) throws Exception {
        byte[] bytes = source.getBytes(encodeFrom);
        return new String(bytes, encodeTo);
    }

    public static Date parseDate( String dateString, String format ) throws Exception {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.parse(dateString);
    }

    public static String formatDate( Date date, String format ) throws Exception {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(date);
    }
}
图16 工具类

5.7 对象比较

【例题17】对象比较

package cn.du.ch05;

import java.util.Calendar;

public class Java09_Object {
    public static void main(String[] args) throws Exception {

        // TODO 常见类和对象
        // 等于
        // 基本数据类型,双等号比较数值
        System.out.println("基本数据类型,双等号比较数值. \nint i = 10; int j = 10; double d = 10.0");
        int i = 10;
        int j = 10;
        System.out.println("  i == j : " + (i == j));
        double d = 10.0;
        System.out.println("  i == d : "+ (i == d));
        // 引用数据类型,双等号比较变量的内存地址
        String s = "abc"; // 字符串常量池
        String s1 = "abc";
        String s2 = new String("abc");   // 新建 1 个 String 实例
        System.out.println("引用数据类型,双等号比较变量的内存地址,比较值用o.equals()");
        System.out.println("String s = \"abc\"; String s1 = \"abc\"; String s2 = new String(\"abc\");");
        System.out.println("  比较变量的内存地址 s == s1 : "+(s == s1));
        System.out.println("  比较变量的内存地址 s == s2 : "+(s == s2));
        System.out.println("  比较字符串数值 s.equals(s2)) : "+s.equals(s2));  //比较字符串数值

        User9 user1 = new User9();
        User9 user2 = new User9();

        System.out.println("\n  user1 == user2 "+ (user1 == user2));
        System.out.println("  比较值 user1.equals(user2) : "+user1.equals(user2));

        // 包装类型 比较值 要用 equals
        // int => Integer => JVM为了操作方便,简化了很多操作
        // Integer缓存:-128 ~ 127
        {
            Integer i1 = 100;
            Integer i2 = 100;
            System.out.println("\n  100 i1 == i2  "+(i1 == i2));
            System.out.println("  100 i1.equals(i2) "+i1.equals(i2));
        }
        {
            Integer i1 = 1000;
            Integer i2 = 1000;
            System.out.println("  1000 i1 == i2  "+(i1 == i2));
            System.out.println("  1000 i1.equals(i2) "+i1.equals(i2));
        }
        {
            Integer i1 = Integer.valueOf(-129);;
            Integer i2 = Integer.valueOf(-129);;
            System.out.println("  -129 i1 == i2  "+(i1 == i2));
            System.out.println("  -129 i1.equals(i2 "+i1.equals(i2));
        }
    }
}
class User9 {

}
图17 对象比较
图18 ch05 常用类源代码截图

返回