2022-07-28 第八组 卢睿 学习心得

JAVA(api)

今日重点

  1. API
  2. Date
  3. Calender
  4. ZoneId
  5. SimpleDateFormat
  6. Math数学类
  7. BigDecimal统计类
  8. Arrays数组的工具类
  9. StringBuffer和StringBuilder

学习内容

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

API(Application Programing Interface)应用程序接口

JDK给我们提供一些已经写好的类,我们可以直接调方法来解决问题
我们类的方法,在宏观上都可以称为接口
api文档,介绍api

时间相关的api

时间:
格林尼治天文台,伦敦
时区:东八区
北京时间:+8
时间戳: 格兰尼治时间1970.1.1 00:00:00 到今天2022.7.28 9:29:30 的毫秒数
时间戳全世界都是固定的

时间戳应用

public class Ch03 {
    public static void main(String[] args) {
        //获取时间戳
        //可以通过时间戳转换成我们当前所在地的具体时间和日期
        System.out.println(System.currentTimeMillis());
        long start = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) {
            System.out.println(i);
        }
        long end  = System.currentTimeMillis();
        System.out.println(end - start);
    }
}

日期类 Date

获取系统当前日期时间

public class Ch04 {
    public static void main(String[] args) {
        Date date = new Date();
        System.out.println(date);

        long millis = System.currentTimeMillis();
        System.out.println(millis);

    }
}

日期前后比较

public class Ch05 {
    public static void main(String[] args) {
        Date date1 = new Date(1658974443876L);
        Date date2 = new Date();

//        System.out.println(date2.after(date1));
        /*
         当返回负数时,说明调用者时间是在参数时间之前
         当返回0时,说明调用者时间和参数时间相同
         当返回正数,说明调用者时间是在参数时间之后
        */
        System.out.println(date1.compareTo(date2));
    }
}

日历类:日期、时间,Calender

  • 初始化:
  • 提供了一组对“年月日时分秒星期”等信息的操作函数、操作不同时区的信息。
  • JDK1.1版本开始,在处理时间和日期时,系统推荐使用Calendar类。
  • Calendar要比Date强大的多
public class Ch06 {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();
        System.out.println(calendar.get(Calendar.YEAR));
        System.out.println(calendar.get(Calendar.DAY_OF_YEAR));
        System.out.println(calendar.get(Calendar.DAY_OF_WEEK));
        System.out.println(calendar.get(Calendar.MONTH));
        System.out.println(calendar.get(Calendar.HOUR_OF_DAY));
        System.out.println(calendar.get(Calendar.HOUR));
    }
}

时区

public class Ch07 {
    public static void main(String[] args) {
//        System.out.println(TimeZone.getDefault());
        System.out.println(new Date());
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeZone(TimeZone.getTimeZone("GMT-08:00"));
        System.out.println(calendar.get(Calendar.HOUR));
    }
}

ZoneId

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

日期格式化SimpleDateFormat

format:格式化Date类型,把Date类型转成String类型(一般是我们要展示数据到客户端)
parse:把String类型的时间,转成Date类型(从客户端传过来的时间,一般都是String类型,存入数据库)

public class Ch09 {
    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");
        String s = sdf.format(date);
        System.out.println(s);
    }
}

设计一个工具类

可以对Date类型的日期进行格式化,转成String
format方法 参数是Date,返回值是String
可以对String类型的日式进行格式转换,转换成Date
parse方法 参数是String,返回值是Date

思考:
1.这个类要不要留个口
2.方法,要不要用final

public class DateUtils {

    private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

    public static final String dateToString(Date date){

        return SDF.format(date);
    }

    public static final Date stringToDate(String dateStr) throws ParseException {

        return SDF.parse(dateStr);
    }
}

JDK8的日期时间类

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

阿里巴巴规约明确要求
如果是jdk8的应用,可以使用Instant代替Date
LocalDateTime代替Calendar
DateTimeFormatter代替SimpleDateFormat

新的实践类

  • Instant
  • LoaclDtae
  • LocalTime
  • LoaclDateTime
  • DateTimeFormatter
public class Ch01 {
   public static void main(String[] args) {
       Instant instant = Instant.now();
       System.out.println(instant.atZone(ZoneId.systemDefault()));
       //获取秒数
       System.out.println(instant.getEpochSecond());
       //h获取毫秒数
       System.out.println(instant.toEpochMilli());
       long mills = System.currentTimeMillis();
       System.out.println(Instant.ofEpochMilli(mills));
       System.out.println("------------------------------------------------------------");
       String text = "2022-07-28T06:05:41.475Z";
       Instant parse = Instant.parse(text);
       System.out.println(text);
   }
}

持续时间Duration

输出5天后时间

public class Ch02 {

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

LocalDate:获取当前的日期

public class Ch03 {
    public static void main(String[] args) {
        LocalDate now = LocalDate.now();
        System.out.println(now);
        System.out.println(now.getMonth());
        System.out.println(now.getDayOfWeek());
        System.out.println(now.getDayOfMonth());
        LocalDate of = LocalDate.of(2024, 9, 10);
        System.out.println(of);
        //判断是否为闰年
        System.out.println(of.isLeapYear());

    }
}

LocalTime 获取本地时间

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

LocalDateTime:获取日期和时间

public class Ch05 {
    public static void main(String[] args) {
        System.out.println(LocalDateTime.now());
    }
}

DateTimeFormatter 处理日期格式化问题

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

转换

  • Instant和Date的转换
  • Instant和LocalDate转换
  • Date和LocalDateTime
public class Ch07 {
    public static void main(String[] args) {
        Instant instant = Instant.now();
        // 把Instant转成Date
        Date date = Date.from(instant);
        // 把Date转成Instant
        Instant toInstant = date.toInstant();
        // 把Instant转成LocalDateTime
        LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
        // 把LocalDateTime转成Instant
        Instant instant1 = LocalDateTime.now().toInstant(ZoneOffset.UTC);

        // 把date转成LocalDateTime
        Date date1 = new Date();
        Instant instant2 = date.toInstant();
        LocalDateTime localDateTime1 = LocalDateTime.ofInstant(instant2, ZoneId.systemDefault());

        // 把LocalDateTime转成Date
        LocalDateTime now = LocalDateTime.now();
        Instant instant3 = now.atZone(ZoneId.systemDefault()).toInstant();
        Date date2 = Date.from(instant3);
    }
}

Math数学类

  • 随机数 random()
  • 向上取整 ceil()
  • 向下取整 floor()
  • 四舍五入 round()
  • Math.E
  • Math.PI
  • 看api文档
public class Ch08 {
   public static void main(String[] args) {
       // 生成0-1的随机数
       // 生成1-100的随机整数
       // 生成13-26的随机整数
       // (int)(Math.random()*(max-min)+min)
       System.out.println(Math.random());
       System.out.println((int)(Math.random() * (26 - 13) + 13));
   }
}

BigDecimal统计类

在钱这方面,可以用BigDecimal,Double的精度问题可以用BigDecimal来解决

public class Ch09 {

    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的构造器,开发中,传入的参数必须是字符串
        BigDecimal bigDecimal3 = new BigDecimal("0.7");
        BigDecimal bigDecimal4 = new BigDecimal("0.1");


        System.out.println(bigDecimal1.add(bigDecimal2));
        System.out.println(bigDecimal3.add(bigDecimal4));


    }
}

随机:Random

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

Arrays数组的工具类

public class Ch11 {
    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, 4));
        int[] ints = Arrays.copyOf(arr, 2);
        System.out.println(Arrays.toString(ints));
        System.out.println(Arrays.equals(arr, ints));
    }
}

输出结果:
[1, 2, 3, 4, 5]
3
[1, 2]
false

System类(系统类)

public class Ch12 {
    public static void main(String[] args) {
//        System.exit(-1);
//        System.out.println();
//        System.err.println("错误信息");
//        System.currentTimeMillis();
        Properties properties = System.getProperties();
        System.out.println(properties);
    }
}

Objects

public class Ch13 {
    public static void main(String[] args) {
        //判断是不是空
        System.out.println(Objects.isNull(""));
    }
}

StringBuffer和StringBuilder

可变的字符序列,和String是有本质区别的

String怎么反转

StringBuffer是同步的。安全。效率低
StringBuilder是异步的。不安全。效率高

面试题:
三个字符串的区别?

public class Ch14 {
    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.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);

    }
}

反转

public class Demo01 {

    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        String str = "abcdefg";
        char[] array = str.toCharArray();
        String str2 = "";
        for (int i = array.length- 1;i >= 0; i--) {
            str2 += array[i];
        }
        str = str2;
        System.out.println(str);
        long end = System.currentTimeMillis();
        System.out.println(end - start); // 23
    }
}
public class Demo3 {

    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        String str = "abcdefg";
        StringBuffer stringBuffer = new StringBuffer(str);
        stringBuffer.reverse();
        str = stringBuffer.toString();
        System.out.println(str);

        long end = System.currentTimeMillis();
        System.out.println(end - start); // 1
    }
}
posted @ 2022-07-29 20:01  LegendR  阅读(31)  评论(0)    收藏  举报