Java中常用类
1.String
java.long.String
- String表示字符串类型,属于引用数据类型不属于基本数据类型
- 在Java中随便使用双引号括起来的都是String对象。例如:“abc” “sdf”
- Java中规定,双引号括起来的字符串是不可变的
- String是为啥不可变的,因为源代码中String类有一个byte数组,数组一旦创建长度是不可变的并且这个byte数组是使用final修饰的,final修饰的引用一旦指向某个对象之后,不可再指向其它对象。
- 在JDK中括起来的字符串都是直接存储在“方法区”的“字符串常量池”当中的。由于字符串在实际开发中使用太频繁,为了执行效率,所以把字符串放到方法区的字符串常量池当中。
- 字符串对象之间的比较不能使用“==”,应该调用equals方法
- 面试题:判断数组长度和判断字符串长度不一样,判断数组长度是length属性,判断字符串长度是length()方法
2.StringBuffer
-
我们在实际开发中如果需要进行字符串的频繁拼接,因为Java中的字符串是不可变的,每一次拼接都会产生新字符串,这样会占用大量的方法区内存。造成内存空间的浪费
-
如果以后需要进行大量字符串拼接操作,建议使用JDK自带的:
java.lang.StringBuffer
java.lang.StringBuilder
-
如何优化StringBuffer的性能
在创建StringBuffer的时候尽可能给定一个初始化容量
最好减少底层数组的扩容次数。预估计一下,给一个大一些初始化容量
关键点:给一个合适的初始化容量。可以提高程序的执行效率
-
StringBuffer和StringBuilder的区别:
StringBuffer是线程安全的
StringBuilder是非线程安全的
-
StringBuffer和StringBuilder为什么是可变的
源代码中,StringBuffer和StringBuilder内部实际上是一个byte[ ]数组,这个byte[ ]数组没有被final修饰,StringBuffer和StringBuilder的初始化容量是16,当存满之后会进行扩容。底层调用了数组拷贝的方法System.arraycopy()…。所以StringBuffer和StringBuilder适合于使用字符串的频繁拼接操作。
3.基础类型对应的8个包装类
-
Java中为8种基本数据类型又对应准备了8种包装类型。8种包装类型属于引用数据类型,父类是Object。
-
8种基本数据类型对应的包装类型
基本数据类型 包装类型 byte java.lang.Byte(父类是Number) short java.lang.Short(父类是Number) int java.lang.Integer(父类是Number) long java.lang.Long(父类是Number) float java.lang.Float(父类是Number) double java.lang.Double(父类是Number) boolean java.lang.Boolean(父类是Object) char java.lang.Character(父类是Object) -
Number中公共的方法:
Number是一个抽象类,无法实例化对象
装箱:基本类型---->(转换为)---->引用数据类型
拆箱:引用数据类型---->(转换为)---->基本类型
-
关于Integer类的构造方法,有两个:
Interger(int)
Interger(String)
-
通过访问包装类的常量,来获取最大值和最小值
-
自动装箱:基本数据类型自动转换成包装类
自动拆箱:包装类自动转换成基本数据类型
-
Java中为了提高执行效率,将-128到127之间所有的包装对象提前创建好,放到了一个方法区的“整数型常量池”当中了,目的是只要用这个区间的数据不需要再new了,直接从整数型常量池中取出来。
-
经典异常:
空指针异常:NullPointerException
类型转换异常:ClassCastException
数组下标越界异常:ArrayIndexOutOfBoundsException
数字格式化异常:NumberFormatException
4.日期相关类
-
获取系统当前时间(精确到毫秒的系统当前时间),直接调用无参数构造方法Date()
-
SimpleDateFormat是专门负责日期格式化的
-
日期字符串String转换成Date类型
String time = “日期格式”
SimpleDateFormat sdf2 = new SimpleDateFormat(“格式不能随便写,要和日期字符串格式相同”)
Date dateTime = sdf2.parse(time);
System.out.println(dateTime);
-
获取自1970年1月1日00:00:00 000到当前系统时间的总毫秒数:用currentTimeMillis()
-
System类的相关属性和方法:
System.out out是System类的静态变量System.out.println() println() 方法不是System类的,是PrintStream类的方法
System.gc() 建议启动垃圾回收器
System.currentTimeMillis() 获取自1970年1月1日到系统当前时间的总毫秒数。
System.exit(0) 退出JVM
-
yyyy 年 MM 月 dd 日 HH 时 mm 分 ss 秒 SSS毫秒(毫秒3位,最高999.1000毫秒代表1秒)
注意:在日期格式中,除y M d H m s S 这些字符不能随便写外,剩下的符号格式自己随意组织。
5.数字相关类
关于数字格式化:
- 数字格式:# 代表任意数字 ,代表千分位 . 代表小数点
###,###.## 表示:加入千分位,保留2位小数
-
java.text.DecimalFormat专门负责数字格式化
-
BigDecimal属于大数据,精度极高。不属于基本数据类型,属于Java对象(引用数据类型)
这是SUM提供的一个类。专门用在财务软件当中
6.Random
- 随机数
package random;
import java.util.Random;
public class RandomTest01 {
public static void main(String[] args) {
// 创建随机数
Random random = new Random();
// 随机产生一个int类型取值范围内的数字
int num1 = random.nextInt();
System.out.println(num1);
// 产生【0~100】之间的随机数。不能产生101
// nextInt翻译为:下一个int类型的数据是101,表示只能取到100
int num2 = random.nextInt(101);//不包括101
System.out.println(num2);
}
}
7.Enum
-
枚举是一种引用数据类型
-
枚举定义的语法:
Enum 枚举类型名{
枚举值1,枚举值2
}
-
结果只有两种情况,建议使用布尔类型
结果超过两种并且还是可以一枚一枚列举出来的,建议使用枚举类型。
例如:颜色,四季,星期等
-
SUCCESS是枚举Result类型中的一个值
-
FAIL是枚举Result类型中的一个值
-
枚举中的每一个值,可以看做是“常量”