跳转至

第13章 常用类(P460 - P498)

1、包装类

  • 包装类的分类

  • 针对八种基本数据类型定义相应的引用类型——包装类

  • 有了类的特点,就可以调用类中的方法
基本数据类型 包装类
boolean Boolean Object
char Character Object
byte Byte Number
short Short Number
int Integer Number
long Long Number
float Float Number
double Double Number
  • 包装类和基本数据的转换

  • jdk5 前的手动装箱和拆箱方式,装箱:基本类型 -> 包装类型,反之,拆箱

  • jdk5 以后(含jdk5)的自动装箱和拆箱方式
  • 自动装箱底层调用的是 valueOf 方法,比如Integer.valueOf()

  • 包装类型和String类型的相互转换

WrapperVSString.java

  • Integer类和Character类的常用方法

Integer.MIN_VALUE:返回最小值

Integer.MAX_VALUE:返回最大值

Character.isDigit('a'):判断是不是数字

Character.isLetter('a'):判断是不是字母

Character.isUpperCase('a'):判断是不是大写

Character.isLowerCase('a'):判断是不是小写

Character.isWhitespace('a'):判断是不是空格

Character.toUpperCase('a'):转成大写

Character.toLowerCase('a'):转成小写

2、String类

  1. String 对象用于保存字符串,也就是一组字符序列

  2. 字符串的字符使用Unicode字符编码,一个字符(不区分字母还是汉字)都只占用两个字节

  3. String 类有很多构造器,构造器的重载

  4. String 类实现了接口 Serializeable (String 可以串行化:可以在网络传输)

​ 接口 Comparable (String 对象可以比较大小)

  1. String 是final类,不能被其他的类继承

  2. String 有属性 private final char value[];用于存放字符串内容

  3. 注意:value 是一个final类型,不可以修改(需要功力):即value不能指向新的地址,但是单个字符内容是可以变化的

  4. 两种创建String对象的区别

方式一:直接赋值 String s = "abc";

方式二:调用构造器 String s2 = new String("abc");

  1. 方式一:先从常量池查看是否有“abc”数据空间,如果有,直接指向;如果没有则重新创建,然后指向。s最终指向的是常量池的空间地址

  2. 方式二:先在堆中创建空间,里面维护了value属性,指向常量池的abc空间。

    如果常量池没有”abc“,重新创建如果有,直接通过value指向。最终指向的是堆中的空间地址

  3. 字符串的特性

  4. String 是一个final 类,代表不可变的字符序列

  5. 字符串是不可变的。一个字符串对象一旦被分配,其内容是不可变的。
String a = "hello";
String b = "abc";
String c = a + b;//c是指向堆中的对象(String) value[] -> 池中"helloabc"
String d = "helloabc";
System.out.println(c == d);//false

String c = a + b;

底层是 StringBuilder sb = new StringBuilder(); sb.append(a); sb.append(b); sb 是在堆中,并且append是在原来字符串的基础上追加的。

解读:

  1. 先创建一个 StringBuilder sb = StringBuilder()
  2. 执行 sb.append("hello");
  3. sb.append("abc");
  4. String c = sb.toString();
  5. 最后其实 c 是指向堆中的对象(String) value[] -> 池中"helloabc"

  6. String类的常见方法

String类是保存字符串常量。每次更新都需要重新开辟空间,效率较低,因此提出了 StringBuilderStringBuffer 来增强String的功能,并提高效率。

  1. equalsIgnoreCase 忽略大小写,判断内容是否相等

  2. length 获取字符个数,字符串长度

  3. indexOf 获取字符/字符串在字符串对象中第一次出现的索引,索引从0开始,如果找不到,则返回-1

  4. lastIndexOf 获取字符/字符串在字符串对象中最后一次出现的索引,索引从0开始,如果找不到,则返回-1

  5. substring 截取指定范围的字串

    str.substring(6); ==> 截取索引6以后的全部字符

    str.substring(2,5); ==> 从索引2开始截取到索引5-1的位置

  6. toUpperCase 转换成大写

  7. toLowerCase 转换成小写

  8. concat 拼接字符串

  9. replace 替换字符串

    replace("11","22"); 把字符串中的所有11替换成22

  10. split 分割字符串,对于某些分割字符,需要转义

  11. toCharArray 转换成字符数组

  12. compareTo 比较两个字符串的大小,如果前者大,则返回正数,后者大,则返回负数,相等返回0;

    长度相同或者不同:进行比较时,可以区分大小,就返回(c1 - c2)

    前面部分都相同,就返回 str1.len - str2.len

  13. format 格式字符串

    占位符有:%s 字符串;%c 字符;%d 整形;%.2f 浮点型(会进行四舍五入)

    String name = "john";
    int age = 10;
    double score = 56.546;
    char gender = '男';
    String info = String.format("我的姓名是%s,年龄是%d,成绩是%.2f,性别是%c,希望大家喜欢我",name,age,score,gender);
    //String formatStr = "我的姓名是%s,年龄是%d,成绩是%.2f,性别是%c,希望大家喜欢我";
    //String info2 = String.format(formatStr,name,age,score,gender)
    System.out.printfln(info);
    

3、StringBuffer类

  • 基本介绍

  • Java.lang.StringBuffer 代表可变的字符序列,可以对字符串内容进行增删

  • 很多方法与String相同,但StringBuffer是可变长度的
  • StringBuffer是一个容器

  • String与StringBuffer比较

  • String保存的是字符串常量,里面的值不能更改,每次String类的更新实际上就是更改地址,效率低。

  • StringBuffer保存的是字符串常量,里面的值可以更改,每次StringBuffer的更新实际上是可以更新的内容,不用每次更新地址,效率较高

  • String → StringBuffer

  • 使用构造器

    StringBuffer stringBuffer = new StringBuffer(str)

  • 使用append方法

    StringBuffer stringBuffer = new StringBuffer(str)

    stringBuffer = stringBuffer.append(str)

  • StringBuffer → String

  • 使用StringBuffer提供的 toString方法

    String s = stringBuffer.toString();

  • 使用构造器

    String s = new String(stringBuffer);

  • StringBuffer方法

  • append()方法

    StringBuffer s = new StringBuffer("abc");

    s.append("sss");//abcsss

  • s.delete(11,14);//删除 11~14字符 [11,14)

  • s.replace(9,11,"xyz");//使用“xyz”替换索引9-11的字符 [9,11)

  • int indexOf = s.indexOf("111");//查找指定的字符串在字符第一次出现的索引,找不到返回-1

  • s.insert(9,"22");//在索引为9的位置插入 “22” ,原来索引为9的内容自动后移

  • 长度

    s.length();

4、StringBuilder类

  • 基本介绍

  • 一个可变的字符序列。此类提供一个与StringBuffer 兼容的 API,但不保证同步(StringBuilder 不是线程安全)。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候。如果可能,建议优先采用该类,在大多数实现中,他比 StringBuffer 要快

  • 在 StringBuffer 上的主要操作是append和insert方法,可重载这些方法,已接受任意类型的数据。

  • 理解

  • StringBuilder 继承 Abstract StringBuilder 类

  • 实现了 Serializable ,说明StringBuilder 对象是可以串行化(对象可以网络传输,可以保存到文件)
  • 是final类,不能被继承
  • StringBuilder 对象字符序列任然是存放在其父类 AbstractStringBuilder 的 char[] value;因此,字符序列是堆中
  • StringBuilder 的方法没有做互斥的处理,即没有synchronized(已同步) 关键字,因此在单线程的情况下使用

  • String、StringBuffer 和StringBuilder的比较

  • StringBuilder 和 StringBuffer 非常类似,均代表可变的字符序列,而且方法也一样

  • String:不可变字符序列,效率低,但复用率高
  • StringBuffer:可变字符序列,效率较高(增删)、线程安全
  • StringBuilder:可变字符序列、效率最高、线程不安全

  • String、StringBuffer 和 StringBuilder 的选择

使用的原则:

  1. 如果字符串存在大量的修改操作,一般使用 StringBuffer 或 StringBuilder
  2. 如果字符串存在大量的修改操作,并在单线程的情况,使用 StringBuilder
  3. 如果字符串存在大量的修改操作,并在多线程的情况,使用 StringBuffer
  4. 如果我们字符串很少修改,被多个对象引用,使用String,比如配置信息等

5、Math类

  • 基本介绍

Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数

均为静态方法

  • 常用方法

  • abs 绝对值

    int abs = Math.abs(-9);

  • pow 求幂

    double pow = Math.pow(2,4);//2的4次方

  • ceil 向上取整,返回>=改参数的最小整数(并转成double类型)

    double ceil = Math.ceil(-3.0001);//-3.0

  • floor 向下取整,返回<=改参数的最大整数(并转成double类型)

    double floor = Math.floor(3.9);//3.0

  • round 四舍五入

    long round = Math.round(-5.001);//5

  • sqrt 开方

    double sqrt = Math.sqrt(9.0);//3.0

  • random 求随机数,返回的是 0<= X <1 之间的一个随机小数

  • max 返回最大值

  • min 返回最小值

6、Arrays类

  • 常见方法应用案例

Arrays里面包含了一系列静态方法,用于管理或操作数组(比如排序和搜索)

  1. toString 返回数组的字符串形式

    Arrays.toString(arr)

  2. sort 排序(自然排序和定制排序)

  3. binartSearch 通过二分搜索法进行查找,要求必须排好序

  4. copyOf 数组元素的复制

  5. fill 数组元素的填充(全部)

  6. equals 比较两个数组内容是否完全一致

  7. asList 将一组值,转换成list

7、System类

  1. exit 退出当前程序

System.exit(0);// 0表示一个状态,表示正常退出

  1. arraycopy 复制数组元素,比较适合底层调用,一般使用Arrays.copyOf 完成复制数组

int[] src = {1,2,3};

int[] dest = new int[3];

System.arraycopy(src,0,dest,0,3);//(源数组,原数组那个索引位置开始,目标数组,拷贝到目标索引那个位置开始,从源数组拷贝多少个数据到目标数组)

  1. currentTimeMillens 返回当前时间距离1970-1-1 的毫秒数

  2. gc 运行垃圾回收机制

System.gc();

8、BigInteger 和 BigBecimal

  • 介绍
  • BigInteger 适合保存比较大的整形
  • BigDecimal 适合保存精度更高的浮点型(小数)
  • 常见方法
  • add 加
  • subtract 减
  • multiply 乘
  • divide 除

8、日期类

  • 第一代日期类

  • Date 精确到毫秒,代表特定的瞬间

  • SimpleDateFormat 格式和解析日期的类格式化和解析日期的具体类。它允许进行日期格式化(日期 -> 文本)、解析(文本 -> 日期)和规范化

    image-20240303170507851

    注意:

    默认输出的日期格式是国外的方式,因此通常要对格式进行转换

    1. 创建 SimpleDateFormat 对象,可以指定相应格式

      Date d1 = new SimpleDateFormat sdf = new SimpleDateFormat(”yyyy年MM月dd日 hh🇲🇲ss E“);

      String format = sdf.format(d1)

    2. 格式使用的字母是规定好的,不能乱写

    3. 可以把一个格式化的字符串转化为对应的Date

      String s = "1996年01月01日 10:20:30 星期一;"

      Date parse = sdf.parse(s);

    4. 得到的Date仍然在输出时,还是按照国外的形式,如果希望指定格式输出,需要转换

  • 第二代日期类

  • 第二代日期类,主要就是 Calendar(日历)。

    public abstract class Calendar extends Object implements Serializsble,Cloneable,Comparable<Calendar>

  • Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAYOFMONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法

  • 注意

    1. Calendar 是一个抽象类,并且构造器是private
    2. 可以通过 getInstance() 来获取实例
    3. 提供大量的方法和字段
    4. Calendar 返回月的时候要 +1 ,是按照 0 编号的
    5. Calendar 没有提供对应的格式化类,需要自己编写
    6. 按照 24小时进制来获取时间, Calendar.HOUR --改成→Calendar.HOUROFDAY
  • 第三代日期类

  • 前两代日期类的不足分析

    JDK 1.0中包含了一个java.util.Date类,但是它的大多数方法 已经在JDK 1.1引入Calendar 类之后被弃用了。而Calendar也存在问题

    1. 可变性:像日期和时间这样的类应该是不可变的
    2. 偏移性:Date中年份是从1900开始的,而月份都是从0开始的
    3. 格式化:格式化只对Date有用,Calendar则不行
    4. 它们也不是线程安全的;不能处理润秒(每隔2天,多出1秒)
  • 常见方法

    1. LocalDate 只包含日期(年月日),可以获取日期字段

    2. LocalTime 只包含时间(时分秒),可以获取时间字段

    3. LocalDateTime 包含日期+时间,可以获取日期和时间字段

    LocalDateTime ldt = new LocalDateTime.now();

    1. DateTimeFormatter 格式日期类

    类似于SimpleDateFormat

    DateTimeFormatter dtf = DateTmineFormatter.oFPattern("yyyy年MM月dd日 HH小时mm分钟ss秒");

    String str = dtf.format(ldt);

    1. Instant 时间戳

    类似于Date,提供了一系列和Date类转换的方式

    Instant——>Date

    Date date = Date.form(instant);

    Date——>Instant

    Instant instant = date.toInstant();