疯狂Java讲义(读书笔记)(第六章--Java基础类库)

第6章Java基础类库

6.1 与用户互动

6.1.1 运行Java程序的参数

下面详解main()方法为什么采用这个方法签名。

  • public修饰符:Java类由JVM调用,为了让JVM可以自由调用这个main()方法,所以使用public修饰符把这个方法暴露出来。
  • static修饰符:JVM调用这个主方法时,不会先创建该主类的对象,然后通过对象来调用该主方法。JVM直接通过该类来调用主方法,因此使用static修饰主方法。
  • void返回值:因为主方法被JVM调用,该方法的返回值将返回给JVM,这没有任何意义,因此main()方法没有返回值。

6.1.2 使用Scanner获取键盘输入

Scanner主要提供了两个方法来扫描输入:

  • hasNextXxx():是否还有下一个输入项,其中Xxx可以是Int、Long等代表基本数据类型的字符串。如果只是判断包含下一个字符串,则直接使用hasNext()。
  • nextXxx():获取下一个输入项。Xxx的含义与前一个方法中的Xxx相同。
import java.util.Scanner;

public class ScannerKeyBoardTest {
    public static void main(String[] args) {
        //System.in 代表标准输入,就是键盘输入
        Scanner sc = new Scanner(System.in);
        //增加下面一行将只把回车作为分隔符
        // sc.useDelimiter("\n")
        // 判断是否还有下一个输入项
        while (sc.hasNext()){
            //输出输入项
            System.out.println("键盘输入的内容是:" +
                    sc.next());
        }
    }
}

事实上,Scanner提供了两个简单的方法来逐行读取。

  • boolean hasNextLine():返回输入源中是否还有下一行。
  • String nextLine():返回输入源中下一个的字符串。
import java.util.Scanner;

public class ScannerLongTest {
    public static void main(String[] args) {
        // System.in 代表标准输入,就是键盘输入
        Scanner sc = new Scanner(System.in);
        // 判断是否还有下一个long型整数
        while (sc.hasNextLong()){
            // 输出输入项
            System.out.println("键盘输入的内容是:"
            + sc.nextLong());
        }
    }
}

6.2 系统相关

6.2.1 System类

6.2.2 Runtime类

6.3 常用类

6.3.1 Object类

Object类提供了如下几个常用方法:

  • boolean equals(Object obj):判断指定对象与该对象是否相等。
  • protected void finalize():当系统中没有引用变量引用到该对象时,垃圾回收器调用此方法来清理该对象的资源。
  • ClassgetClass():返回该对象的运行时类。
  • int hashCode():返回该对象的hashCode值。
  • String toString():返回该对象的字符串表示。

6.3.2 Objects类

6.3.3 String、StringBuffer、StringBuilder类

6.3.4 Math类

6.3.5 ThreadLocalRandom类与Random类

6.4 Java 8 的日期、时间类

6.4.1 Date类

Date类的两个构造器:

  • Date():生成一个代表当前日期的Date对象。
  • Date(long date):根据指定的long型整数来生成一个Date对象。

Date类的方法:

  • boolean after(Date when):测试该日期是否在指定日期when之后。
  • boolean before(Date when):测试该日期是否在指定日期when之前。
  • long getTime():返回该时间对应的long型整数。
  • void setTime(long time):设置该类Date对象的时间。

总体来说,Date是一个设计相当糟糕的类,因此Java官方推荐尽量少用Date的构造器和方法。

6.4.2 Calendar类

Calendar类提供了大量访问、修改日期时间的方法,常用方法如下:

  • void add(int field, int amount):根据日历的规则,为给定的日历字段添加或减去指定的时间量。
  • int get(int field):返回指定日历字段的值。
  • int getActualMaximum(int field):返回指定日历字段可能拥有的最大值。
  • int getActualMinimum(int field):返回指定日历字段可能拥有的最小值。
  • void roll(int field, int amount):与add()方法类似,区别在于架上amount后超过了该字段所能表示的最大范围时,也不会向上一个字段进位。
  • void set(int field, int value):将给定的日历字段设置为给定值。
  • void set(int year, int mouth, int date):设置Calendar对象的年、月、日三个字段的值。
  • void set(int year, int mouth, int date, int hourOfDay, int minute, int second):设置Calendar对象的年、月、日、时、分、秒6个字段的值。

如下程序示范了Calendar类的常规用法:

import java.util.Calendar;

public class CalendatTest {
    public static void main(String[] args) {
        Calendar c = Calendar.getInstance();
        // 取出年
        System.out.println(c.get(Calendar.YEAR));
        // 取出月
        System.out.println(c.get(Calendar.MONTH));
        // 取出日
        System.out.println(c.get(Calendar.DATE));
        c.set(2003, 10, 23, 12, 32, 23);
        System.out.println(c.getTime());
        // 将Calendar的年前推一年
        c.add(Calendar.YEAR, -1);
        System.out.println(c.getTime());
        // 将Calendar的月前推8个月
        c.roll(Calendar.MONTH, -8);
        System.out.println(c.getTime());
    }
}

Calendar类还有如下几个注意点
1.add和roll的区别
(1)add有如下两条规则:
①当被修改的字段超出它允许的范围时,会发生进位,即上一级字段也会增大。
②如下下一级字段也需要改变,那么该字段会修正到变化最小的值。
(2)roll()的规则与add()处理规则不同,当修改的字段超出了它允许的范围时,上一级字段不会增大。
(3)下一级字段的处理规则与add()相似。
2.设置Calendar的容错性

import java.util.Calendar;

public class LenientTest {
    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();
        // 结果是YEAR字段加1,MONTH字段为1(2月)
        cal.set(Calendar.MONTH, 13);
        System.out.println(cal.getTime());
        // 关闭容错性
        cal.setLenient(false);
        // 导致程序运行时异常
        cal.set(Calendar.MONTH, 13);
        System.out.println(cal.getTime());
    }
}

3.set方法延迟修改

import java.util.Calendar;

public class LazyTest {
    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();
        cal.set(2003, 7, 31);
        // 将月份设为9,但9月31日不存在
        // 如果立即修改,系统将会把cal自动调整到10月1日
        cal.set(Calendar.MONTH, 8);
        // 下面代码输出10月1日
        // System.out.println(cal.getTime());
        // 设置DATE字段为5
        cal.set(Calendar.DATE, 5);
        System.out.println(cal.getTime());
    }
}

6.4.3 Java 8 新增的日期、时间包

Java 8 专门新增了一个java.time包,该包下包含了如下常用的类:

  • Clock:该类用于回去指定时区的当前日期、时间。
  • Duration:该类代表持续时间。
  • Instant:代表一个具体的时刻,可以精确到纳秒。
  • LocalDate:该类不带时区的日期,例如2003-12-03。
  • LocalTime:该类代表不带时区的时间,例如10:15:30。
  • LocalDateTime:该类代表不带时区的日期、时间,例如2007-12-03T10:15:30。
  • MonthDay:该类仅代表月日,例如–04-12。
  • Year:该类仅代表年。
  • YearMonth:该类仅代表年月。
  • ZonedDateTime:该类代表一个时区化的日期。
  • Zoneld:该类代表一个时区。
  • DayOfWeek:这是一个枚举类,定义了周日到周六的枚举值。
  • Month:这也是一个枚举类,定义了一月到十二月的枚举值。

6.5 Java 8 新增的日期、时间格式器

获取DateTimeFormatter对象有如下三种常见的方式:

  • 直接使用静态常量创建DateTimeFormatter格式器。
  • 使用达标不同风格的枚举值来创建DateTimeFormatter格式器。
  • 根据模式字符串来创建DateTimeFormatter格式器。

6.5.1 使用DateTimeFormatter完成格式化

使用DateTimeFormatter将日期、时间(LocalDate、LocalDateTime、LocalTime等实例)格式化为字符串,可通过如下两种方式:

  • 调用DateTimeFormatter的format(TemporalAccessor temporal)方法执行格式化,其中LocalDate、LocalDateTime、LocalTime等类都是TemporalAccessor接口的实现类。
  • 调用LocalDate、LocalDateTime、LocalTime等日期、时间对象的format(DateTimeFormatter formatter)方法执行格式化。

6.5.2 使用DateTimeFormatter解析字符串

本章练习

1.定义一个长度为10的整数数组,可用于保存用户通过控制台输入的10个整数。并计算它们的平均值、最大值、最小值。
2.将字符串“ABCDEFG”中的“CD”截取出来;再将“B”、“F”截取出来。
3.将A1B2C3D4E5F6G7H8拆分开来,并分别存入int[]和String[]数组。得到的结果为[1,2,3,4,5,6,7,8]和[A,B,C,D,E,F,G,H]。

你可能感兴趣的:(疯狂Java讲义学习笔记,java)