2022-07-28 day17第一小组 王鸣赫

Java的值传递和所谓的引用传递
本质上Java只有值传递,所有的赋值传参都是一次值的拷贝
引用数据类型其实拷贝的就是引用地址(虚地址)
基本数据类型拷贝的是值,不会传入实例对象本身

常用API

API(Application Programming Interface)应用程序接口
JDK给我们提供的一些已经写好的类,我们可以直接调方法来解决问题
String(可以叫API接口)
我们类的方法,在宏观上都可以称为接口
API文档,用来介绍API

时间相关的API
时间:
格林尼治天文台
时区:东八区
北京时间
时间戳:格林尼治时间1970.1.1 00:00:00 到尽头2022.7.28 9:29:30 的毫秒数
1s = 1000ms , 1min = 60s , 1h = 60min , 1day =24h。
时间戳在全世界都是固定的。忽略了时区等

日期类
Date

1、只用于显示系统时间,其大部分操作由Calendar代替。
格林威治时间(GMT):指的是1970年1月1日0时,不同地区有时间差。
默认输出格式:星期、月、日、时、分、秒、时区、年
 
2、构造方法:
(1)public Date(); //无参构造创建的对象可以获取本机的当前日期与时间。

(2)public Date(long date) ; //根据自定义时间创建Date对象。date若为正数,则表示公元后,若为负数,则表示公元前。

3、常用方法:
(1)public long getTime(); //可以获取从1970年开始到现在时间的毫秒数。
(2)public void setTime(long time); //可以自定义date时间

点击查看代码
import java.util.Date;

public class Demo {
    public static void main(String[] args) {
        Date date = new Date();// 实例化一个Date类,用于获取当前系统时间
        System.out.println(date);// 输出时间,Thu May 23 14:10:49 JST 2019

        System.out.println(date.getTime());// 输出毫秒值,1558588249722

        date.setTime(date.getTime() + 1000);// 手动增加1000毫秒
        System.out.println(date.getTime());// 输出毫秒值,1558588250722
    }
}

    

DateFormat

1、java1.5版本前,使用该类作用是将字符串(String)与时间(Date)相互转换。

  2、构造方法:
    (1)public SimpleDateFormat(); //按照系统默认格式将Date转换为String。

    (2)public SimpleDateFormat(String pattern); //按照自定义格式pattern转换。

  3、常用方法:
    (1)public final String format(Date date); //可以将Date转为String。

    (2)public Date parse(String source) throws ParseException; //可以将String转为Date,使用时需要抛出异常(ParseException)。

  4、格式规则:

    y--年   M--月   d--日    E--星期  h--12进制小时    H--24进制小时    m--分    s--秒

点击查看代码
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Demo {
    public static void main(String[] args) {
        Date date = new Date();// 实例化一个Date类,用于获取当前系统时间
        System.out.println(date);// 输出时间,Thu May 23 14:36:10 JST 2019

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd E HH-mm-ss");
        String str = sdf.format(date);// 按照指定格式转为字符串
        System.out.println(str);// 输出转换后的时间,2019-05-23 星期四 14-36-10
        try {
            // 将字符串转为Date,Thu May 23 14:36:10 JST 2019
            System.out.println(sdf.parse(str));
        } catch (ParseException e) {
            System.out.println("格式转换异常。");
        }
    }
}


Calendar

 1、Calendar类是一个抽象类,不能被实例化,可以通过静态方法getInstance()初始化一个日历对象。默认为当前系统时间。该类用于封装日历信息,并对时间分量(年、月、日、时、分、秒)进行计算。

  2、常用方法:
    (1)public final Date getTime(); //将Calendar转为Date型。

    (2)public final void setTime(Date date); //将Date型转为Calendar。

    (3)public int get(int field); //用于获取时间分量。其中field使用Calendar类的静态变量表示。
      注意:
        Calendar.Month 从0开始计数,即0表示1月,11表示12月。
        Calendar.DAY_OF_WEEK 从1开始计数,即1表示星期天,7表示星期六。

    (4)public void set(int field, int value); //设置时间分量,value指要设置的值。

    (5)public final void set(int year, int month, int date); //设置年月日。

    (6)public int getActualMaximum(int field); //获取时间分量field的最大值。

    (7)abstract public void add(int field, int amount); //加时间分量,若加天数时,field需使用Calendar.DAY_OF_YEAR

点击查看代码
import java.util.Calendar;
import java.util.Date;

public class Demo {
    public static void main(String[] args) {
        Date date = new Date();// 获取系统时间
        System.out.println(date);// 输出系统时间,Thu May 23 15:46:00 JST 2019

        date.setTime(date.getTime() + 1000 * 60);// 设置时间

        Calendar calendar = Calendar.getInstance();// 获取日历类
        calendar.setTime(date);// 将Date转为Calendar
        System.out.println(calendar.getTime()); // 将Calendar转为Date,Thu May 23 15:47:00 JST 2019
       
       System.out.println(calendar.get(Calendar.MONTH)); // 获取月份,输出4,4表示5月
        System.out.println(calendar.get(Calendar.DAY_OF_WEEK));// 获取星期几,输出5,5表示星期四

        calendar.set(Calendar.DAY_OF_WEEK, 6);// 设置星期为星期5
        System.out.println(calendar.get(Calendar.DAY_OF_WEEK));// 输出星期几,输出6,表示星期五。

        System.out.println(calendar.getActualMaximum(Calendar.DAY_OF_MONTH));// 获取这个月最大的天数,输出31

        calendar.add(Calendar.DAY_OF_WEEK, 2);// 给星期加2天
        System.out.println(calendar.get(Calendar.DAY_OF_WEEK));// 输出1,表示星期天。
     }
}
获取时间戳的方法

1、public static native long currentTimeMillis(); //java.lang.System类,获取时间戳

2、public long getTime(); //java.util.Date类,可以获取从1970年开始到现在时间的毫秒数。

3、public long getTimeInMillis(); //java.util.Calendar类,获取时间戳。

4、currentTimeMillis获取时间戳的速度最快。

Java 8新特性
点击查看代码
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Scanner;

public class Demo {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入日期:格式为yyyy-MM-dd :");
        String str = scanner.nextLine(); // 获取输入的字符串

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try {
            Date date = sdf.parse(str);// 将字符串转为Date
            System.out.println(date);

            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);// 将Date转为Calendar

            calendar.add(Calendar.YEAR, 3);// 给日期加三年
            calendar.add(Calendar.MONTH, 3);// 给日期加三月
            calendar.add(Calendar.WEEK_OF_YEAR, 3);// 给日期加三个星期
            calendar.set(Calendar.DAY_OF_WEEK, 4);// 设置日期为星期三

            date = calendar.getTime();// 将Calendar转为Date
            System.out.println(date);

            str = sdf.format(date);// 将Date转为String
            System.out.println(str);
        } catch (ParseException e) {
            System.out.println("输入格式错误!");
        }
    }
}
2、java.time包是在JDK 8 之后引入的,提供了用于日期、时间、周期等的API。其所有类均为不可变的,线程安全的。

3、常用类:

    (1)java.time.LocalDateTime:存储了时间与日期,格式为:年-月-日T时:分:秒.毫秒。比如:2019-05-23T12:51:36.494,可以使用withNano(0)将毫秒值设为0。

    (2)java.time.LocalDate:存储了日期,格式为:年-月-日。比如:2019-05-23。

    (3)java.time.LocalTime:存储了时间,格式为:时:分:秒.毫秒。比如:12:53:44.954。可以使用withNano(0)将毫秒值设为0。

    (4)java.time.format.DateTimeFormatter;类似于java.text.SimpleDateFormat。但其只用来创建日期的显示模板,parse()(是一种静态方法)与format()方法需要使用LocalDateTime类来调用。

    (5)java.time.Duration; 此类用来计算两同类型日期的时间差。
4、注意:
    (1)java.time中,星期一的值为1,星期天的值为7.且月份从 1~12。

    (2)java.util.Calendar中,星期天为1,星期六为7,且月份从 0~11。

    (3)对于time相关类,属于不可变类,原理类似String(参考String值变化的情况)。若其值改变,会重新创建一个实例。

#######LocalDateTime
1、常用方法:
    (1)public static LocalDateTime now(); //静态方法,获取当前系统时间。

    (2)public static LocalDateTime of(int year, int month, intdayOfMonth, int hour, int minute, int second) ; //静态方法,自定义时间

    (3)public int getYear(); //获取年

    (4)public LocalDateTime plusYears(long years); //增加年,会返回一个新的实例,若参数为负,也会出现减的效果。,

    (5)public LocalDateTime minusMonths(long months); //减月,会返回一个新的实例,若参数为负,会出现加的效果。

    (6)public LocalDateTime withDayOfMonth(int dayOfMonth); //修改日,会返回一个新的实例。

Instant
点击查看代码
import java.time.Instant;

public class Demo {
    public static void main(String[] args) {
        Instant instant = Instant.now();
        System.out.println(instant);// 输出当前系统时间
        System.out.println(instant.toEpochMilli());// 获取当前的毫秒值
        // 当前时间与参数中的时间进行对比,在参数的时间之前,相同,之后的值分别是(-1,0,1)
        System.out.println(instant.compareTo(instant));
    }
}
DateTimeFormatter

1、类似于java.text.SimpleDateFormat。但其只用来创建日期的显示模板。

2、parse()方法是一种静态方法,使用LocalDateTime.parse()来调用。

3、format()方法需要使用LocalDateTime等类来调用。

stringbuilder和stringbuffer

反转StringBuilder.reverse
插入StringBuilder.insert
删除StringBuilder.deleteChar(0)

String、StringBuffer和StringBuilder的六大区别

区别一:String是final类不能被继承且为字符串常量,而StringBuilder和StringBuffer均为字符串变量。
在Java中字符串使用String类进行表示,但是String类表示字符串有一个最大的问题:“字符串常量一旦声明则不可改变,而字符串对象可以改变,但是改变的是其内存地址的指向。”所以String类不适合于频繁修改的字符串操作上,所以在这种情况下,往往可以使用StringBuffer类,即StringBuffer类方便用户进行内容修改。

区别二:在String类中使用“+”作为数据的连接操作,而在StringBuffer类中使用append()方法(方法定义:public StringBuffer append(数据类型 变量))进行数据连接。

区别三:类的定义不同
String、StringBuffer和StringBuilder类都是CharSequence接口的子类,也就证明String、StringBuffer和StringBuilder类的对象都可以利用自动向上转型的操作为CharSequence接口实例化。

区别四:String类和StringBuilder、StringBuffer类的转换。
1.String类通过apend()方法转换成StringBuilder和StringBuffer类。

区别五:String类、StringBuffer和StringBuilder类中定义的常用方法,三类的大部分方法(下例)可以互补。

区别六:线程安全性方面

1.StringBuilder(非线程安全)

该类提供一个与StringBuffer兼容的 API,但不能保证同步,所以在性能上较高。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。

2.StringBuffer(线程安全的)

StringBuffer上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。

posted @ 2022-07-28 22:11  404notfond  阅读(16)  评论(0)    收藏  举报