八:java常用包装类

72 阅读3分钟

包装类

装箱:基本数据类型到包装类。

拆箱:包装类到基本数据类型。

自动装箱底层调用的是valueOf方法,比如integer.valueOf()

// Integer => 包装类String
Integer i  = 10;
// 三种方式
String str1 = i + "";
String str2 = String.valueOf(i);
String str3 = i.toString();

// String => 包装类Integer
String str4 = "123";
Integer i2 = Integer.parseInt(str4);
Integer i3 = new Integer(str4); // 已弃用

image.png

Integer和Character包装类常用方法 image.png

经典面试题

Integer m = 1;
Integer n = 1;
System.out.println(m == n); // true
// 底层是Integer.valueOf(1),范围是-128~127直接返回,超过这个范围则会调用new Integer(xx),所以为false
Integer a = 1;
Integer b = 1;
System.out.println(a == b); // false

String

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

image.png

以下两种创建字符串的区别

方式一:先从常量池中查看是否有“aa”数据空间,如果有,直接指向,如果没有,则创建,然后指向,s1最终指向的是常量池的地址

方式二:先从堆中创建空间,里面维护了value属性,value指向常量池“aa”空间,如果常量池没有aa,则创建,然后指向,s2最终指向堆中的空间地址

String s1 = "aa";
String s2 = new String("aa");

内存示意图

image.png

测试题

String a = "a";
String a1 = new String("a");
System.out.println(a.equals(a1)); // true,比的是值
System.out.println(a == a1); // false,因为内存地址的指向不一样
// intern:返回常量池中的字符串
System.out.println(a1 == a1.intern()); // false
System.out.println(a == a1.intern()); // true

如果两个常量相加,则指向常量池,如果两个变量相加,则指向堆

String a = "a";
String a1 = "a";
String a3 = a + a1;
String a4 = "aa";
// 理解false的原因,a3在内部会new一个StringBuilder对象,a3不是直接指向常亮池的aa
System.out.println(a3 == a4); // false

String常用方法

image.png

StringBuffer类

StringBuffer代表的是可变的字符串序列,可以对字符串进行增删

StringBuffer和String类一样,是final类型,不能被继承

String和StringBuffer对比

  1. String保存的是字符串常量,里面的值不能更改, 每次更新实际上是更改了地址,效率低。
  2. StringBuffer保存的字符串变量,里面的值可以更改,每次更新是更新内容,不是更新地址,效率高

StringBuilder

一个可变字符序列,此类提供于StringBuffer兼容的api,但不能保证同步(不是线程安全),用在字符串缓冲区被单个线程使用的时候,设计它是因为它比StringBuffer更快

String,StringBuffer,StringBuilder对比 image.png

image.png

Math类

Math类常用方法(这些都是静态方法)

image.png

Array类

简单,不记录了

几个常用但js没有的方法

  1. copyOf:复制数组
  2. asList:将一组值,转化List集合

System类

几个常用方法

System.exit(0) // 主动退出
System.arraycopy // 复制数组,比较适合底层调用,一般都使用Array.copyOf
System.currentTimeMillens // 返回当前时间距离1970-01-01的**毫秒数**
System.gc // 调用垃圾回收机制

BigInteger和BigDecimal

应用场景

  1. BigInteger合适保存比较大的整数(long型不够用的时候)
  2. BigDecimal合适保存比较大的浮点型(小数)(dobule精度不够用)

四则运算示范

BigInteger bigInteger = new BigInteger("111");
BigInteger bigInteger1 = new BigInteger("222");
// 加法
BigInteger add = bigInteger.add(bigInteger1);
// 减法
BigInteger subtract = bigInteger.subtract(bigInteger1);
// 乘法
BigInteger multiply = bigInteger.multiply(bigInteger1);
// 除法
BigInteger divide = bigInteger.divide(bigInteger1);

日期类Date,Calendar

Date日期类

和js差不多,不做详细介绍

  1. Date:精确到毫秒
  2. SimpleDateFormat:格式和解析日期的类

Calendar日历类

Calendar instance = Calendar.getInstance();
System.out.println(c);
System.out.println(c.get(Calendar.YEAR));
System.out.println(c.get(Calendar.MONTH) + 1);
System.out.println(c.get(Calendar.DAY_OF_MONTH));
System.out.println(c.get(Calendar.HOUR));
System.out.println(c.get(Calendar.MINUTE));
System.out.println(c.get(Calendar.SECOND));

LocalDate,LocalTime,LocalDateTime

这三个JDK8才加入,就是一些常用api,不重要,自己去看

  1. LocalDate // 只有年月日
  2. LocalTime // 只有时分秒
  3. LocalDateTime // 上面两种都有