JAVA学习线路:day04常用API(Object类、DateFormat类)

所有的文档和源代码都开源在GitHub: https://github.com/kun213/JavaNotes上了。希望我们可以一起加油,一起学习,一起交流。

day04 【Object类、常用API】

今日学习内容-2020.9.20

@

Object类

1、可以说出Object类的特点

java.lang.Object类是Java语言中的根类,每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。

如果一个类没有特别指定父类,那么默认则继承自Object类。例如:

public class MyClass /*extends Object*/ {
  	// ...
}

2、能够重写Object类的toString方法

由于toString方法返回的结果是内存地址,而在开发中,内存地址并没有实际的应用价值,经常需要按照对象的属性得到相应的字符串表现形式,因此也需要重写它。

public class Person {  
    private String name;
    private int age;
    
    public String toString() {
        return "Person"+name+":"+age;
    }
    // 省略构造器与Getter Setter
}

3、能够重写Object类的equals方法

实际应用中,比较内存地址是否相同并没有意义,我们可以定义对象自己的比较方式,比较对象中成员变量的值是否相同。需要对方法进行重写。

需求:重写equals()方法,比较两个对象中姓名和年龄是否相同,如果姓名和年龄都相同返回true,否则返回false。

public class Person {
    private String name;
    private int age;
    
    public boolean equals(Object obj){
        //判断两个对象地址弱相同,即为同一个对象
        if(this == obj)
            return true;
        //obj对象为空,无需比较,返回false
        if(obj == null)
            return  false;
        //obj如果是Person类型对象,则强制转换
        if(obj instanceof Person){
            Person person = (Person)obj;
            //比较两个对象的name属性和age属性,如果相等,返回true
            return this.name.equals(person.name) && this.age == person.age;
        }
        return false;}}

DateFormat类

使用将日期格式化为字符串的方法

使用将字符串转换成日期的方法

java.text.DateFormat 是日期/时间格式化子类的抽象类,我们通过这个类可以帮我们完成日期和文本之间的转换,也就是可以在Date对象与String对象之间进行来回转换。

  • 格式化:按照指定的格式,把Date对象转换为String对象。

  • 解析:按照指定的格式,把String对象转换为Date对象。

  • String format(Date date)传递日期对象,返回格式化后的字符串。

  • Date parse(String str)传递字符串,返回日期对象。

 public static void main(String[] args) throws ParseException {
     //格式化:从 Date 到 String
     Date d = new Date();
     SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
     String s = sdf.format(d);
     System.out.println(s);
     System.out.println("--------");

     //从 String 到 Date
     String ss = "2048-08-09 11:11:11";
     //ParseException
     SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
     Date dd = sdf2.parse(ss);
     System.out.println(dd);
    }

Calendar日历类

1、日历对象获取方式

Calendar是抽象类,不能创建对象,需要使用子类对象。java.util.GregorianCalendar类是Calendar的子类,但是创建日历对象需要根据本地的时区,语言环境来创建,比较困难,Calendar类提供了静态方法 getInstance()直接获取子类的对象。

public static Calendar getInstance():使用默认时区和语言环境获得一个日历。

Calendar cal = Calendar.getInstance();

2、 常用方法

  • public int get(int field):返回给定日历字段的值。
  • public void set(int field, int value):将给定的日历字段设置为给定值。
  • public abstract void add(int field, int amount):根据日历的规则,为给定的日历字段添加或减去指定的时间量。
  • public Date getTime():返回一个表示此Calendar时间值(从历元到现在的毫秒偏移量)的Date对象。

3、日历字段

Calendar类中提供很多静态成员,直接类名调用,代表给定的日历字段:

字段值 含义
YEAR
MONTH 月(从0开始,可以+1使用)
DAY_OF_MONTH 月中的天(几号)
HOUR 时(12小时制)
HOUR_OF_DAY 时(24小时制)
MINUTE
SECOND
DAY_OF_WEEK 周中的天(周几,周日为1,可以-1使用)

代码使用简单演示:

public static void main(String[] args) {
    // 创建Calendar对象
    Calendar cal = Calendar.getInstance();
    // 获取年
    int year = cal.get(Calendar.YEAR);
    //设置年份为2020年
    cal.set(Calendar.YEAR, 2020);
    //将年份修改为2000年
    cal.add(Calendar.YEAR,-20)     
    //将日历对象转换为日期对象
    Date d = cal.getTime();
    System.out.println(d);
}    

冒泡排序

冒泡排序法是采用数组中相邻元素进行比较换位。

冒泡排序图解

代码实现

public static void main(String[] args) {
    public static void main(String[] args) {
        //定义一个数组
        int[] arr = {7, 6, 5, 4, 3};
        System.out.println("排序前:" + arrayToString(arr));
        // 这里减1,是控制每轮比较的次数
        for (int x = 0; x < arr.length - 1; x++) {
            // -1是为了避免索引越界,-x是为了调高比较效率
            for (int i = 0; i < arr.length - 1 - x; i++) {
                if (arr[i] > arr[i + 1]) {
                    int temp = arr[i];
                    arr[i] = arr[i + 1];
                    arr[i + 1] = temp;
                }
            }
        }
        System.out.println("排序后:" + arrayToString(arr));
    }

数组的二分查找法

所谓数组的二分查找法,对于一个有序数组,查找一个元素是否存在于数组中,如果存在就返回出现的索引,如果不存在就返回负数。

二分查找法原理

取数组中间的元素和被查找的元素进行比较,如果被查找元素大于数组中间元素,就舍去数组元素的一半,对另一半继续进行查找。

代码实现

 public static void main(String[] args) {
        int[] arr = {5,13,19,21,37,56,64,75,80,88,92};
        int key = 21;
        int index = binarySearch(arr, key);
        System.out.println(index);

    }
    public static int binarySearch(int[]arr,int key){
        //最小索引
        int min = 0;
        //最大索引
        int max = arr.length - 1;
        //初始化中间索引
        int mid = 0;
        //循环折半,最小索引小于等于最大索引时,才能折半
        while (min <= max){
            //折半,计算中间索引
            mid = (min + max) / 2;
            if(key > arr[mid]){
                //元素大于数组中间索引元素,移动最小索引
                min = mid + 1;
            }else if(key < arr[mid]){
                //元素小于数组中间索引元素,移动最大索引
                max = mid - 1;
            }else{
                //查询到元素,返回索引
                return mid;
            }
        }
        //循环查找结束后,找不到元素,返回-1
        return - 1;
    }

正则表达式

(1) 正则规则-字符类

规则写法 规则含义
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a 到 z 或 A到 Z,两头的字母包括在内(范围)
[0-9] 0到9,两头的数字包括在内(范围)
[a-zA-Z0-9] a 到 z 或 A到 Z或0-9

(2) 正则规则-预定义字符类

规则写法 规则含义
. 任何字符
\d 数字[0-9]
\D 非数字 [^0-9]
\w 单词字符 [a-zA-Z0-9_]
\W 非单词字符[^a-zA-Z0-9_]

(3 )正则规则-数量词

规则写法 规则含义
X 一次或一次也没有
X 零次或多次
X 一次或多次
X 恰好 n
X 至少 n
X 至少 n 次,但是不超过 m

1、 正则练习-String类matches方法

方法:boolean matches(String regex)传递正则表达式规则,检测字符串是否匹配正则表达式规则,匹配返回true。

需求:检查手机号,检查邮件地址。

分析:

  • 手机号:只能1开头,第二位可以是345678任意一个,第三位开始全数字,总长11位。
  • 邮件地址:@前面可以是数字,字母,下划线。@后面是字母和.。
public static void main(String[] args){
    //验证手机号码
    String tel = "13800138000";
    String telRegex = "1[345678][0-9]{9}";
    boolean flag = tel.matches(telRegex);
    System.out.println(flag);
    //验证邮件地址
    String email = "s_123456@sina.com.cn.";
    String emailRegex = "[a-zA-Z0-9_]+@([a-z]+\\.[a-z]+)+";
    flag = email.matches(emailRegex);
    System.out.println(flag);
}

2、 正则练习-String类split方法

方法:String[] split(String regex)传递正则表达式规则,以正则规则对字符串进行切割。

public static void main(String[] args){
    String str1 = "ab  a   bbb  abc   aa      c";
    //对空格进行切割
    String[] strArr =str1.split(" +");
    System.out.println(Arrays.toString(strArr));

    String str2 = "192.168.22.123";
    strArr = str2.split("\\.");
    System.out.println(Arrays.toString(strArr));
}

注意:输出数组元素时会看到存在一个多余空格,Arrays.toString()方法源码中追加的空格。

posted @ 2020-09-20 19:00  CodeBull  阅读(96)  评论(0编辑  收藏  举报