包装类
装箱:基本数据类型到包装类。
拆箱:包装类到基本数据类型。
自动装箱底层调用的是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); // 已弃用
Integer和Character包装类常用方法
经典面试题
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字符编码,一个字符()不区分字母还是汉字)占两个字节
以下两种创建字符串的区别
方式一:先从常量池中查看是否有“aa”数据空间,如果有,直接指向,如果没有,则创建,然后指向,s1最终指向的是常量池的地址。
方式二:先从堆中创建空间,里面维护了value属性,value指向常量池“aa”空间,如果常量池没有aa,则创建,然后指向,s2最终指向堆中的空间地址。
String s1 = "aa";
String s2 = new String("aa");
内存示意图
测试题
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常用方法
StringBuffer类
StringBuffer代表的是可变的字符串序列,可以对字符串进行增删
StringBuffer和String类一样,是final类型,不能被继承
String和StringBuffer对比
- String保存的是字符串常量,里面的值不能更改, 每次更新实际上是更改了地址,效率低。
- StringBuffer保存的字符串变量,里面的值可以更改,每次更新是更新内容,不是更新地址,效率高
StringBuilder
一个可变字符序列,此类提供于StringBuffer兼容的api,但不能保证同步(不是线程安全),用在字符串缓冲区被单个线程使用的时候,设计它是因为它比StringBuffer更快
String,StringBuffer,StringBuilder对比
Math类
Math类常用方法(这些都是静态方法)
Array类
简单,不记录了
几个常用但js没有的方法
- copyOf:复制数组
- asList:将一组值,转化List集合
System类
几个常用方法
System.exit(0) // 主动退出
System.arraycopy // 复制数组,比较适合底层调用,一般都使用Array.copyOf
System.currentTimeMillens // 返回当前时间距离1970-01-01的**毫秒数**
System.gc // 调用垃圾回收机制
BigInteger和BigDecimal
应用场景
- BigInteger合适保存比较大的整数(long型不够用的时候)
- 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差不多,不做详细介绍
- Date:精确到毫秒
- 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,不重要,自己去看
- LocalDate // 只有年月日
- LocalTime // 只有时分秒
- LocalDateTime // 上面两种都有