值传递

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

public class Ch01 {

    private String name;

    public Ch01(String name) {
        this.name=name;
    }

    public static Ch01 change(Ch01 ch01) {
        ch01 = new Ch01("JERRY");
        return ch01;
    }

    public static void change(int j) {
        j=8;
    }

    public static void main(String[] args) {
        Ch01 ch01 = new Ch01("TOM");
        System.out.println(change(ch01));

        int i=5;
        change(i);
        System.out.println(i);
    }

    @Override
    public String toString() {
        return "Ch01{" +
                "name='" + name + '\'' +
                '}';
    }
}
输出结果:
name='JERRY';
i=5;
public void setName(String name) {
        this.name = name;
    }
    public static Ch01 change(Ch01 ch01) {
        ch01.setName("JERRY");
        return ch01;
    }

    public static void main(String[] args) {
        Ch01 ch01 = new Ch01("TOM");
        change(ch01);
        System.out.println(ch01);
    }
输出结果:
name='JERRY';

常用API

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


Date类

时间、时区(北京时间:东八区)
时间戳:1970.1.1 00:00:00 到今天2022.7.28 9:29:30的毫秒数
1s=1000ms、1min=60s
时间戳在全世界都是固定的(格林尼治时间)

System.currentTimeMillis()获取时间戳
可以通过时间戳转换成我们当前所在地的具体时间和日期

public static void main(String[] args) {
    long start = System.currentTimeMillis();
    for (int i = 0; i < 10000000; i++) {
        if (i%100 ==0) {
            System.out.println(i);
        }
    }
    long end = System.currentTimeMillis();
    System.out.println(end - start);
}

使用以上方式,在程序运行前后可以计算消耗了多少时间


将时间戳放入Date()

将指定时间戳放入 new Date()
将会按照默认更新返回指定时间的时间格式
public static void main(String[] args) {
    Date date = new Date();
    System.out.println(date);

    long milliseconds = System.currentTimeMillis();
    System.out.println(milliseconds);
    date = new Date(1658974491148L);
    System.out.println(date);
}

after方法

判断date1是否在date2之后
如果是 返回true 反之返回false
Date date1 = new Date(1658974491148L);
Date date2 = new Date();

System.out.println(date1.after(date2));
System.out.println(date2.after(date1));

compareTo方法

当返回负数时,说明date1>date2
当返回0时,说明date1=date2
当返回正数时,说明data1<date2
System.out.println(date1.compareTo(date2));
System.out.println(date2.compareTo(date1));
System.out.println(date2.compareTo(date2));

equals方法

判断两个时间是否相等,返回truefalse
System.out.println(date1.equals(date2));
System.out.println(date2.equals(date2));

输出七天后的时间

思路:
计算好七天一共多少毫秒,定义现在的时间戳
七天后的时间戳即为 bt+milliseconds,最后放入Date()
public static void main(String[] args) {
    long bt = 768000000L*7;
    long milliseconds = System.currentTimeMillis();
    Date date = new Date();
    System.out.println("今天的时间是 "+date);
    date = new Date(bt+milliseconds);
    System.out.println("七天后的时间是 "+date);
}

Calendar类

日历类:日期时间
Calendar是一个抽象类不能创建对象

初始化:
提供了一组对 年月日时分秒星期 将信息操作的函数 操作不同时区的信息
JDK1.1版本开始,在处理时间和日期是,系统推荐使用Calendar
所以 CalendarDate 强大的多
Calendar calendar = Calendar.getInstance(); 获取子类对象(向上转型)

Calendar calendar = Calendar.getInstance();
System.out.println(calendar.get(Calendar.YEAR));
System.out.println(calendar.get(Calendar.DAY_OF_MONTH));
System.out.println(calendar.get(Calendar.MONTH));
System.out.println(calendar.get(Calendar.MINUTE));
System.out.println(calendar.get(Calendar.MILLISECOND));
System.out.println(calendar.get(Calendar.DAY_OF_WEEK));
System.out.println(calendar.get(Calendar.DAY_OF_YEAR));
System.out.println(calendar.get(Calendar.HOUR_OF_DAY));
System.out.println(calendar.get(Calendar.HOUR));
System.out.println(calendar.get(Calendar.SECOND));
输出:
2022
28
6
57
851
5
209
10
10
53

TimeZone类

public static void main(String[] args) {
    System.out.println(TimeZone.getDefault());
    System.out.println(new Date());
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeZone(TimeZone.getTimeZone("UTC"));
    System.out.println(calendar.get(Calendar.HOUR));
}

ZoneId类

public static void main(String[] args) {
    ZoneId zoneId = ZoneId.of("America/New_York");
    System.out.println(TimeZone.getTimeZone(zoneId));
}

SimpleDateFormat类

SimpleDateFormat 日期格式化
format: 格式化Date类型,把Date类型转成String类型
parse:把String类型的时间,转成Date类型
public static void main(String[] args) {
    Date date = new Date();
    System.out.println(date);
    /*
        yyyy:年
        yy:年的后两位
        MM:月
        dd:日
        HH:小时 24小时
        hh:小时 12小时
        mm:分
        ss:秒
        SSS:毫秒
     */
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss.SSS");
    System.out.println(sdf.format(date));
}

小题1

使用Date类:
打印输出七天以后的日期和时间
public class Demo01 {

    public static void main(String[] args) {
        long bt = 86400000L*7;
        long milliseconds = System.currentTimeMillis();
        Date date = new Date();
        System.out.println("今天的时间是 "+date);
        date = new Date(bt+milliseconds);
        System.out.println("七天后的时间是 "+date);
    }
}

小题2

设计一个工具类
可以对Date类型的日期进行格式化,转成String
可以对String类型的日期进行转换,转成Date
public class DateUtils {

    public static void main(String[] args) throws ParseException {
        Date date = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        System.out.println(simpleDateFormat.format(date));

        date = simpleDateFormat.parse("2022/01/01 10:00:30");
        System.out.println(date);
    }
}

JDK8的日期时间类

JDK8之前,处理日期和时间,基本上就是用上面的几个类
DateCalendar 获取到的月份都是0-11,而不是我们生活中的1-12

阿里巴巴规约明确要求:
如果JDK8的应用,可以使用instant来代替Date
LocalDateTime代替CalendarDateTimeFormatter代替SimpleDateFormat
新的时间类:instant、LocalDateTime、LocalDate、LocalTime


instant类

public static void main(String[] args) {
    Instant instant = Instant.now();
    System.out.println(instant.atZone(ZoneId.systemDefault()));
    System.out.println(instant.getEpochSecond());
    System.out.println(instant.toEpochMilli());
    long milliSecond = System.currentTimeMillis();
    System.out.println(Instant.ofEpochMilli(milliSecond));

    System.out.println("----------------------");
    String text = "2022-07-28T14:06:50.100Z";
    Instant parse = Instant.parse(text);
    System.out.println(parse);
}

持续时间Duration

public static void main(String[] args) {
    Instant instant = Instant.now();
    Instant plus = instant.plus(Duration.ofDays(5));
    System.out.println(plus);
}

LocalDate类

public static void main(String[] args) {
    System.out.println(LocalDate.now());
    System.out.println(LocalDate.now().getMonth());
    System.out.println(LocalDate.now().getDayOfWeek());
    System.out.println(LocalDate.now().getDayOfMonth());
    System.out.println(LocalDate.of(2022, 9, 10));
    System.out.println(LocalDate.now().isLeapYear());
}

LocalTime类

public static void main(String[] args) {
    LocalTime localTime = LocalTime.now();
    System.out.println(localTime);
    System.out.println(localTime.getSecond());
}

LocalDateTime类

public static void main(String[] args) {
    LocalDateTime localDateTime = LocalDateTime.now();
    System.out.println(localDateTime);
    System.out.println(localDateTime.getHour());
}

DateTimeFormatter类

public static void main(String[] args) {
    LocalDate now = LocalDate.now();
    DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
    System.out.println(now.format(dateTimeFormatter));
}

时间类的相互转换

public static void main(String[] args) {
    Instant instant = Instant.now();
    Date date = Date.from(instant);
    Instant instant2 = date.toInstant();

    LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
    Instant instant3 = LocalDateTime.now().toInstant(ZoneOffset.UTC);

    Date date1 = new Date();
    Instant instant4 = date.toInstant();
    LocalDateTime localDateTime = LocalDateTime.ofInstant(instant,ZoneId.systemDefault());

    LocalDateTime now = LocalDateTime.now();
    Instant instant5 = now.atZone(ZoneId.systemDefault()).toInstant();
    Date date2 = Date.from(instant5);
}

Math数学类

random() 随机数 double
ceil() 向上取整 double
floor() 向下取整 double
round() 四舍五入 long
Math.PI
Math.E

BigDecimal统计类

public static void main(String[] args) {
    double d1 = 0.7;
    double d2 = 0.1;
    BigDecimal bigDecimal1 = new BigDecimal(d1);
    BigDecimal bigDecimal2 = new BigDecimal(d2);
    BigDecimal bigDecimal3 = new BigDecimal("0.7");
    BigDecimal bigDecimal4 = new BigDecimal("0.1");
    System.out.println(bigDecimal3.add(bigDecimal4));
}

Random随机类

public static void main(String[] args) {
    Random random = new Random();
    System.out.println(random.nextInt(2));
}

Arrays数组类

public static void main(String[] args) {
    int [] arr = new int[]{1,2,3,4,5};
    System.out.println(Arrays.toString(arr));
    Arrays.sort(arr);
    System.out.println(Arrays.binarySearch(arr, 2));
    int[] newArr = Arrays.copyOf(arr, 2);
    System.out.println(Arrays.toString(newArr));
    System.out.println(Arrays.equals(arr, newArr));
}

System类

public static void main(String[] args) {
    System.exit(-1);
    System.out.println();
    System.err.println("there has a error");
    System.currentTimeMillis();
    System.gc();

    Properties properties = new Properties();
    System.out.println(properties);
}

Objects类

public static void main(String[] args) {
    System.out.println(Objects.isNull(""));
}

equals的不同点

String类中的equals方法与Object类中的equals方法的不同点
String类中的equals方法是用来判断两个对象的内容是否相同,而Object 类中的equals方法是用来判断两个对象是否是同一个对象,所谓同一个对象指的是内存中的同一块存储空间。

StringBuffer和StringBuilder类

可变的字符序列,和String是有本质区别的
String类的对象内容不可改变,所以每当进行字符串拼接时,总是会在内存中
创建一个新的对象,所以经常改变内容的字符串最好不要用String,因为每次生成对象,都会对系统性能产生影响。 >

StringBuilder又称为可变字符序列,是JDK5.0中新增加的一个类,它是一个类似于
String的字符串缓冲区,通过某些方法调用可以改变该序列的长度和内容。即它是一个 容器,容器中可以装很多字符串,并且能够对其中的字符串进行各种操作。它的内部拥有一个数组用来存放字符串内容,进行字符串拼接时,直接在数组中加入新内容,StringBuilder会自动维护数组的扩容。

public static void main(String[] args) {
    StringBuffer stringBuffer = new StringBuffer("你好");
    System.out.println(stringBuffer);
    stringBuffer.append(",我好").append(",大家好");
    System.out.println(stringBuffer);

    stringBuffer.delete(4,7);
    stringBuffer.deleteCharAt(0);
    stringBuffer.insert(1,"哈哈");
    stringBuffer.reverse();
    System.out.println(stringBuffer);
    String str = "hello";
    String s = str.concat(",world!!");
    System.out.println("str = " + str);
    System.out.println("s = " + s);
}
最后修改:2023 年 01 月 09 日
如果觉得我的文章对你有用,请随意赞赏