1、包装类

  • 包装类的分类

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

    2. 有了类的特点,就可以调用类中的方法

    基本数据类型

    包装类

    boolean

    Boolean

    Object

    char

    Character

    Object

    byte

    Byte

    Number

    short

    Short

    Number

    int

    Integer

    Number

    long

    Long

    Number

    float

    Float

    Number

    double

    Double

    Number

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

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

    2. jdk5 以后(含jdk5)的自动装箱和拆箱方式

    3. 自动装箱底层调用的是 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 对象可以比较大小)

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

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

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

  • 两种创建String对象的区别

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

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

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

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

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

  • 字符串的特性

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

    2. 字符串是不可变的。一个字符串对象一旦被分配,其内容是不可变的。

    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"

  • 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类

  • 基本介绍

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

    2. 很多方法与String相同,但StringBuffer是可变长度的

    3. StringBuffer是一个容器

  • String与StringBuffer比较

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

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

  • String --> StringBuffer

    1. 使用构造器

      StringBuffer stringBuffer = new StringBuffer(str)

    2. 使用append方法

      StringBuffer stringBuffer = new StringBuffer(str)

      stringBuffer = stringBuffer.append(str)

  • StringBuffer --> String

    1. 使用StringBuffer提供的 toString方法

      String s = stringBuffer.toString();

    2. 使用构造器

      String s = new String(stringBuffer);

  • StringBuffer方法

    1. append()方法

      StringBuffer s = new StringBuffer("abc");

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

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

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

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

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

    6. 长度

      s.length();

4、StringBuilder类

  • 基本介绍

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

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

  • 理解

    1. StringBuilder 继承 Abstract StringBuilder 类

    2. 实现了 Serializable ,说明StringBuilder 对象是可以串行化(对象可以网络传输,可以保存到文件)

    3. 是final类,不能被继承

    4. StringBuilder 对象字符序列任然是存放在其父类 AbstractStringBuilder 的 char[] value;因此,字符序列是堆中

    5. StringBuilder 的方法没有做互斥的处理,即没有synchronized(已同步) 关键字,因此在单线程的情况下使用

  • String、StringBuffer 和StringBuilder的比较

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

    2. String:不可变字符序列,效率低,但复用率高

    3. StringBuffer:可变字符序列,效率较高(增删)、线程安全

    4. StringBuilder:可变字符序列、效率最高、线程不安全

  • String、StringBuffer 和 StringBuilder 的选择

    使用的原则:

    1. 如果字符串存在大量的修改操作,一般使用 StringBuffer 或 StringBuilder

    2. 如果字符串存在大量的修改操作,并在单线程的情况,使用 StringBuilder

    3. 如果字符串存在大量的修改操作,并在多线程的情况,使用 StringBuffer

    4. 如果我们字符串很少修改,被多个对象引用,使用String,比如配置信息等

5、Math类

  • 基本介绍

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

    均为静态方法

  • 常用方法

    1. abs 绝对值

      int abs = Math.abs(-9);

    2. pow 求幂

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

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

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

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

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

    5. round 四舍五入

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

    6. sqrt 开方

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

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

    8. max 返回最大值

    9. 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表示一个状态,表示正常退出

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

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

    int[] dest = new int[3];

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

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

  4. gc 运行垃圾回收机制

    System.gc();

8、BigInteger 和 BigBecimal

  • 介绍

    1. BigInteger 适合保存比较大的整形

    2. BigDecimal 适合保存精度更高的浮点型(小数)

  • 常见方法

    1. add 加

    2. subtract 减

    3. multiply 乘

    4. divide 除

8、日期类

  • 第一代日期类

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

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

      注意:

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

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

        Date d1 = new SimpleDateFormat sdf = new SimpleDateFormat(”yyyy年MM月dd日 hh:mm: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仍然在输出时,还是按照国外的形式,如果希望指定格式输出,需要转换

  • 第二代日期类

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

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

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

    • 注意

      1. Calendar 是一个抽象类,并且构造器是private

      2. 可以通过 getInstance() 来获取实例

      3. 提供大量的方法和字段

      4. Calendar 返回月的时候要 +1 ,是按照 0 编号的

      5. Calendar 没有提供对应的格式化类,需要自己编写

      6. 按照 24小时进制来获取时间, Calendar.HOUR --改成-->Calendar.HOUR_OF_DAY

  • 第三代日期类

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

      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();

      4. DateTimeFormatter 格式日期类

        类似于SimpleDateFormat

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

        String str = dtf.format(ldt);

      5. Instant 时间戳

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

        Instant——>Date

        Date date = Date.form(instant);

        Date——>Instant

        Instant instant = date.toInstant();