java基础10--包装类、String类、StringBuffer类、StringBuilder类、Math类、Arrays类、System类、BigInteger和BigDecimal类、日期类

一、八大Wapper类

包装类的分类

在这里插入图片描述

包装类和基本数据类型的转换

其他的包装类类似
在这里插入图片描述
注意:自动装箱右边必须是对应的基本数据类型,不存在转型

经典习题:
三目运算符中,数据类型会自动提升到最高
在这里插入图片描述

包装类型和String类型的相互转化

在这里插入图片描述
补充:String 转Integer还有一种方式:Integer.parseInt(string);

Integer类和Character类的常用方法

在这里插入图片描述

Integer的创建机制(易错!易忘!)

-128~127会放在缓存中
在这里插入图片描述

// -128-127是直接从缓存中的数组返回,否则新建Integer对象
   public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

==只要遇到基本数据类型就是判断是否值相等
在这里插入图片描述

二、String类

在这里插入图片描述
Serializable表示可以串行化,即对象可以在网络中传播
Comparable表示对象可以比较
String是final修饰的不可以被继承
String有个private final char value[];用来存放字符串内容(char数组value用final修饰,只是说栈里的这个叫value的引用地址不可变。没有说堆里数组本身数据不可变)

创建String对象的两种方式

两种方式的区别

在这里插入图片描述

String的内存布局

在这里插入图片描述

习题

在这里插入图片描述

字符串特性(通过习题充分理解String中的final)

在这里插入图片描述
String的底层是private final char value[],这边的final和private确保了value数组的地址不会变,但是可以在常量池中新建新的对象,让value数组的引用指向新的对象,所以看似字符串在变,实则是底层的value数组的引用指向在变,value数组的地址并没有变/font>


编译器会优化!!!:如果是常量池中的字符串(常量)拼接会直接用一个对象完成拼接
在这里插入图片描述


如果是使用引用(变量)拼接,会新建一个StringBuilder()对象,然后使用它的append()方法
在这里插入图片描述
在这里插入图片描述


这题比较综合,首先形参是引用类型会影响实参的,其次是因为String是final修饰的,它没有把常量池中的hsp改成java而是新建了一个java,此时形参中str的指向java,实参中的str指向的是hsp
在这里插入图片描述

String类的常见方法

常见方法

在这里插入图片描述


indexOf()和lastIndesOf()除了指定字符也可以是指定的字符串,返回字符串第一个字符出现的下标
在这里插入图片描述


注意substring的使用
在这里插入图片描述


注意:

  • replace不会改变原来的字符串,而是返回一个替换后的字符串
  • split(字符串str),以字符串为标准进行分割,返回一个String数组(不包含str ),如果str中有特殊字符要加转译符
  • s1.compareTo(s2)比较字符串时,前面和后面每个字符完全一样,返回 0;前面每个字符完全一样,返回:后面就是字符串长度差;前面每个字符不完全一样,返回:出现不一样的字符 ASCII 差
    在这里插入图片描述

format的使用
在这里插入图片描述

  		String s1 = "abc";
        String s = "add";
        int a = 1;
        String ss = String.format("输出%s%s%d", s1, s, a);
        String sss = String.format("输出%s%s%d");
        System.out.printf("输出%s%s%d%n", s1, s, a);//ok
        System.out.println("输出%s%s%d", s1, s, a);//报错,println
        System.out.println(ss);//ok
        System.out.println(sss,s1,s,a);//报错
        System.out.printf(sss,s1,s,a);//ok

三、StringBuff类

基本介绍

在这里插入图片描述

StringBuff和String对比

在这里插入图片描述
主要就是String 中的char[] value是final修饰的,并且存放在常量池中的,而StringBuff中的char[] value没有final修饰,并且是存放在堆中的, 在使用过程中只有长度不够时才会改变引用s的指向

StringBuff的构造器

在这里插入图片描述

String和StringBuff的相互转换

StringBuff类的常用方法

注意:delete,replace中的start,end都是[start,end),会改变原来的字符串,insert是在指定索引前面插入字符串

习题

StringBuff的append方法中,如果传的是null会调用父类的appendNull方法,该方法把null字符数组{‘n’,‘u’,‘l’,‘l’}放进了byte[]数组中。

在这里插入图片描述

四、StringBuilder类

在这里插入图片描述
在这里插入图片描述

StringBuilder的方法

j

String,StringBuffer,StringBuilder对比

在这里插入图片描述

String,StringBuffer,StringBuilder选择

在这里插入图片描述

五、Math类

常见方法

注意:round()方法就是加上0.5向下取整
在这里插入图片描述

在这里插入图片描述
输出[a,b]的随机整数x
(int)a<=x<=(int)(a+Math.random()*(b-a+1))
因为,Math.random()是[0,1)

六、Arrays类

常见方法

在这里插入图片描述

Arrays.sort()定制排序:

   Integer[] arr = new Integer[10];
        for (int i = 0; i < 10; i++) {
            arr[i] = (int) (Math.random() * 100);
        }
        // 重写了Comparator方法,这个方法会影响底层二叉排序的判定,如果返回结果(o1-o2)大于0就交换o1和o2的位置(o1>o2就换位置),小于0就不交换位置
        Arrays.sort(arr, new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                Integer integer01 = (Integer) o1;
                Integer integer02 = (Integer) o2;
                return integer01 - integer02;
            }
        });
        for (Integer integer : arr) {
            System.out.println(integer + " ");
        }

binarySearch(arr , key)方法是二分查找,要求数组必须是有序的,如果找到则返回下标,找不到返回-(把key插入数组中后所在下标+1)


在这里插入图片描述
4)拷贝arr数组中长度为arr.length个元素
5)数组中所有元素都设置为99
6)比较两个数组中的元素是否一致
7)转成集合, [2,3,4,5,6,1]

七、System类

常见方法和案例

tip:一个类重写了finalize()方法后,当出现空的引用时,可以调用系统的gc
在这里插入图片描述
1)exit(0),0代表正常状态退出
2)arraycopy(src,0,dest,0,3),从src的下标0开始拷贝到dest数组的0位置,拷贝长度为3个元素
在这里插入图片描述
3)返回的是long类型

八、BigInteger和BigDecimal类

在这里插入图片描述

常见方法

BigInteger的
在这里插入图片描述
注意:BigInteger(String s),int类型传参的构造器是私有的,一般里面只能传字符串
在这里插入图片描述

注意:BigDecimal()里面可以放数字int的double的都可以,除的时候BigDecimal.ROUND_CEILING可以保留分子精度

在这里插入图片描述

舍入模式

BigDecimal.ROUND_CEILING已经弃用
现在要先用setScale设置精度

		BigDecimal bigDecimal = new BigDecimal("923252.22322322");
        BigDecimal res2 = bigDecimal.multiply(new BigDecimal("123.543253"));
        BigDecimal bigDecimal1 = res2.setScale(5, RoundingMode.CEILING);
        System.out.println(bigDecimal1)

九、日期类

第一代日期类

在这里插入图片描述

第一代日期类的应用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第二代日期类

在这里插入图片描述
在这里插入图片描述

Calendar应用实例

这边的calendar是单例设计模式

在这里插入图片描述
在这里插入图片描述

第三代日期类

前两代的不足

在这里插入图片描述

第三代的常见方法(jdk8加入的 )

注意:getMonth() 英文的月份 getMonthValue() 数字月份

package com.bijing.date;

import org.junit.jupiter.api.Test;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;

/**
 * @author 毕晶
 * @date 2022/9/6 09:40
 * 旧版本存在的问题
 * 1.设计不合理,在java.util和java.sql的包中都有日期类,java.util.Date同时包含日期和时间,而java.sql.Date仅仅包含日期
 * 此外,用于格式化和解析的类在java.text包中
 * 2.非线程安全,java.util.Date是非线程安全的.所有日期类都是可变的,这是java日期类最大的问题之一
 * 3.时区处理麻烦,日期类并不提供国际化,没有时区支持
 */
public class dateAndTime {

    @Test
    public void oldDateQuestions() {

        //设计不合理
        Date date = new Date(2022, 9, 6);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        System.out.println(sdf.format(date));//3922-10-06
        //时间格式化和解析操作是线程不安全的
        for (int i = 0; i < 50; i++) {
            new Thread(() -> {
                try {
                    System.out.println(sdf.parse("2022-09-06"));
                } catch (ParseException e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }

    @Test
    public void methods() {
        LocalDateTime dateTime = LocalDateTime.of(2022, 9, 6, 10, 0, 0);
        System.out.println(dateTime);
        System.out.println(dateTime.getYear());
        System.out.println(dateTime.getDayOfWeek());
        //修改日期 对日期和时间的修改,对已存在的LocalDate对象,创建了它的模板,并不会修改原来的信息,就不存在数据安全的问题
        LocalDateTime localDateTime = dateTime.withYear(2060);
        System.out.println(localDateTime);

        //在当前时间和日期的基础上,加上或者减去指定的时间
        LocalDateTime newDateTime = dateTime.plusYears(2);
        System.out.println(newDateTime);
        System.out.println(dateTime.minusMonths(5));

        //时间日期的比较
        LocalDate now = LocalDate.now();
        LocalDate bir = LocalDate.of(1996, 9, 28);
        System.out.println(now.isAfter(bir));//now在bir之后 返回true
        System.out.println(now.isBefore(bir));//now在bir之前 返回false
        System.out.println(now.isEqual(bir));//now和bir相等 返回false
    }
}

DateTimeFormatter格式化日期类

在这里插入图片描述

Instant时间戳

在这里插入图片描述
在这里插入图片描述

第三代日期类的更多方法

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值