2022-07-28 java之日期时间、Math、StringBuilder、java的值传递和引用传递

一、 日期相关类

1.使用 SimpleDateFormat 格式化日期

public class Demo01 {
    public static void main(String[] args) {
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
        Long time =  System.currentTimeMillis();
        System.out.println(sdf.format(time));
    }
}
    * yyyy:年
    * yy:年的后两位
    * MM:月
    * dd:日
    * HH:小时24小时制
    * hh:小时12小时制
    * mm:分
    * ss:秒
    * SSS:毫秒

2.工具类

设计一个工具类:
可以对Date类型的日期进行格式化,转成String
format方法 参数是Date,返回值是String
parse方法 参数是String,返回值是Date

public class DateUtils {
    static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");

    public static final String format(Date date){
        return sdf.format(date);
    }

    public static final Date parse(String time) {
        Date date = null;
        try {
            date = sdf.parse(time);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }

}

3.新的时间类

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

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

新的时间类
Instant
LocalDate
LocalTime
DateTimeFormatter

二、Calendar类

1.Calendar类对象信息的获得

Calendar c1 = Calendar.getInstance();
// 获得年份
int year = c1.get(Calendar.YEAR);
// 获得月份
int month = c1.get(Calendar.MONTH) + 1;
// 获得日期
int date = c1.get(Calendar.DATE);
// 获得小时
int hour = c1.get(Calendar.HOUR_OF_DAY);
// 获得分钟
int minute = c1.get(Calendar.MINUTE);
// 获得秒
int second = c1.get(Calendar.SECOND);
// 获得星期几(注意(这个与Date类是不同的):1代表星期日、2代表星期1、3代表星期二,以此类推)
int day = c1.get(Calendar.DAY_OF_WEEK);

2.时间类型转换

  • Instant和Date的转换
  • Instant和LocalDate转换
  • Date和LocalDateTime转换
        // 把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);

3.BigDecimal统计类

        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(bigDecimal3.add(bigDecimal4));

三、Math类

在这里插入图片描述

四、Java的值传递和引用传递

  • 值传递:对形参的修改不会影响到实参 。引用传递:对实参的修改能够影响到实参
  • Java是值传递:如果是基本数据类型,就是复制一份值传递给形参;如果是引用类型,那就将引用复制一份,传递给形参。形参拿到的始终都是一个副本,因为形参只是操作实参的副本,所以无论如何都无法通过形参改变实参。

1.实参与形参的概念

实参:我们要传递给方法的实际参数
形参:我们方法签名上定义的参数
实参在方法外面,形参在方法里面。

2.对于基本数据类型

public static void show(int a){
     a = 1;
    System.out.println("形参为:"+a);
}

public static void main(String[] args) {
    int a = 8;
    System.out.println("实参为:"+a);
    show(a);
    System.out.println(a);
}

在这里插入图片描述

3.对于引用类型

当对象引用传递给方法时,其实是创建了一个引用副本,但是此时实参和形参都是指向同一个对象的

public class Ch01_1 {
    String name;

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

    @Override
    public String toString() {
        return "Ch01_1{" +
                "name='" + name + '\'' +
                '}';
    }

    public static void main(String[] args) {
        Ch01_1 ch = new Ch01_1("张三");
        System.out.println("实参为:"+ch);
        show(ch);
        System.out.println(ch);
    }

    public static void show(Ch01_1 ch){
        ch.name = "李四";
        System.out.println("形参为:"+ch);
    }
}

在这里插入图片描述
因为创建对象的时候,方法中我们拿到的是这个对象的引用,通过对象的引用就可以操作对象.

五、String类

1.StringBuilder的常用方法

(1)Append
  Append方法可用来将文本或对象的字符串表示形式添加到由当前 StringBuilder对象表示的字符串的结尾处。以下示例将一个StringBuilder对象初始化为“Hello World”,然后将一些文本追加到该对象的结尾处。将根据需要自动分配空间。

StringBuilderMyStringBuilder = new StringBuilder("Hello World!");
MyStringBuilder.Append(" What a beautiful day.");
Console.WriteLine(MyStringBuilder);
此示例将 Hello World! What abeautiful day.显示到控制台。

(2)AppendFormat
  AppendFormat方法将文本添加到 StringBuilder的结尾处,而且实现了 IFormattable接口,因此可接受格式化部分中描述的标准格式字符串。可以使用此方法来自定义变量的格式并将这些值追加到 StringBuilder的后面。以下示例使用 AppendFormat方法将一个设置为货币值格式的整数值放置到 StringBuilder的结尾。

int MyInt= 25;
StringBuilder MyStringBuilder = new StringBuilder("Your total is ");
MyStringBuilder.AppendFormat("{0:C} ", MyInt);
Console.WriteLine(MyStringBuilder);
此示例将 Your total is $25.00显示到控制台。

(3)Insert
  Insert方法将字符串或对象添加到当前 StringBuilder中的指定位置。以下示例使用此方法将一个单词插入到 StringBuilder的第六个位置。

StringBuilderMyStringBuilder = new StringBuilder("Hello World!");
MyStringBuilder.Insert(6,"Beautiful ");
Console.WriteLine(MyStringBuilder);
此示例将 Hello BeautifulWorld!显示到控制台。

(4)delete
  可以使用 delete方法从当前 StringBuilder中移除指定数量的字符,移除过程从指定的从零开始的索引处开始。以下示例使用 Remove方法缩短 StringBuilder。

StringBuilderMyStringBuilder = new StringBuilder("helloooo");
MyStringBuilder.delete(5,7);
Console.WriteLine(MyStringBuilder);
此示例将 helloo显示到控制台。

(5)Replace
  使用 Replace方法,可以用另一个指定的字符来替换 StringBuilder对象内的字符。以下示例使用 Replace方法来搜索 StringBuilder对象,查找所有的感叹号字符 (!),并用问号字符 (?)来替换它们。

StringBuilderMyStringBuilder = new StringBuilder("Hello World!");
MyStringBuilder.Replace('!', '?');
Console.WriteLine(MyStringBuilder);

2.String StringBuffer StringBuilder区别及其使用场景

  • String是被final修饰的,所以它是不可变的,每一次的操作都会生成一个新的Srting对象,频繁使用占用内存大
  • StringBuffer和StringBuilder他俩是在原有的对象基础上进行操作,不会产生新的对象,所以占用内存小。

StringBuffer是线程安全的 StringBuilder是不安全的
因为StringBuffer里面的每一个方法都添加了synchronized(锁)修饰。而StringBuilder是没有在方法上添加synchronized(锁)修饰所以相比之下StringBuilder的效率要优于StringBuffer但是安全性不如StringBuffer。安不安全也就是不加锁的情况下该值在多线程操作的时候和共享变量被操作的时候会不会产生变化(是不是预期结果)。

- 使用场景:经常需要改变字符串的值使用StringBuffer和StringBuilder。

一般情况下我们优先使用StringBuilder,当我们遇到多线程和共享变量的时候我们使用StringBuffer。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值