包装类
我们前面学习的八种基本数据类型并不是对象,为了将基本类型数据和对象之间实现互相转化,Java为每个基本数据类型提供了相应的包装类。
Java是面向对象的语言,但并不是 “纯面向对象”的,因为我们经常用到的基本数据类型就不是对象。但是我们在实际应用中经常需要将基本类型转化成对象,以便于操作。
比如:将基本数据类型存储到Object[] 数组中或集合中的操作等。
为了解决这个不足,Java 在设计类时为每个基本数据类型 设计了一个对应的类进行代表,这样八个和基本数据类型对映的类统称为“包装类(Wrapper Class)”。
包装类位于java.lang包,八种包装类和基本数据类型的对应关系:
-
byte --> Byte
-
boolean --> Boolean
-
short --> Short
-
char --> Character
-
int --> Integer
-
long --> Long
-
float --> Float
-
double --> Double
Number 类
Number 类时一个抽象类,因此它的抽象方法,所有子类都需要提供实现 。
Number 类提供了抽象方法: intValue(),longValue(), floatValue(),DoubleValue(),意味着所有的“数字型”包装类都能互相转型。
public static void main(String[] args) {
Integer a = new Integer(100); // Java9 开始被废弃
Integer j = Integer.valueOf(100); // 官方推荐
int aa = j.intValue();
double bb = j.doubleValue(); // 把字符串转成数字
Integer n = Integer.valueOf("4444");
}
包装类的用途
对于包装类来说,这些类的用途主要包含两种:
-
作为和基本数据类型对应的类型存在,方便涉及到对象的操作买入Object[] 、集合等的操作;
-
包含每种基本类型的相关属性,如最大值、最小值等以及相关的操作方法(这些操作方法的作用是在基本数据类型,包装类对象、字符串之间提供相互之间的转化);
自动装箱和拆箱
将基本数据类型和包装类自动转换
自动装箱
基本类型的数据处于需要对象的环境中时,会自动转为“对象”。 Integer i = 5; 编译器会自动转成: Integer i = Integer.vlaueOf(5), 这就是Java的自动装箱。
自动拆箱
每当需要一个值时,对象会自动转成基本数据类型,没必要再显式调用intValue() 等方法; Integer i = Integer.vlaueOf(5) int j = i; 编译器会自动转成: int i = i.intValue();这样的过程就是自动拆箱。
本质: 自动拆装箱时编译器来帮忙,在编译时依据您所编写的语法,决定是否进行;
包装类的缓存
整型、char类型所对应的包装类,在自动装箱时,对于-128~127之间的值会进行缓存,其目的是提高效率;
缓存原理: 如果数据在-128~127 这个区间,并将这256个对象存放在一个名为cache的数组中。每当自动装箱过程发生时 (或手动调用valueOf时),先判断数据是否在该区间,如果在则直接获取数组中对应的包装类对象的引用,如果不再区间,则会通过new 调用包装类的构造方法来创建对象。
字符串相关类
String 类代表不可变的字符序列
StringBuilder 类和StringBuffer类代表可变字符序列;
这三个类在笔试面试以及实际开发中经常用到,必须掌握好;
String 类源码分析
String 类对象代表不可变的Unicode字符序列,一次我们可以将String对象称为“不可变对象”。指的是对象内部的成员变量的值无法再改变;
public static void main(String[] args) {
String str1 = "hello"+"java";
String str2 = "hellojava"; // 编译器做了优化直接在编译的时候将字符串进行拼接
System.out.println(str1 == str2); // true
String str3 = "hello";
String str4 = "java"; // 编译时不知道变量中存储的是什么,所以没办法在编译的时候优化;
String str5 = str3 + str4;
System.out.println(str2 == str5); // false
}
StringBuffer 和 StringBuilder 可变字符序列
-
StringBuffer 线程安全,做线程同步检查,效率较低;
-
StringBuilder 线程不安全,不做线程同步检查,因此效率较高 (建议采用);
常用方法列表:
-
重载的public StringBuilder append 可以为该 StringBuilder 对象添加字符序列。仍然返回自身对象
-
方法 public StringBuilder delete(int start,int end), 可以删除从start开始到end-1 为止的一段字符序列,仍然返回自身对象
-
方法 public StringBuilder deleteCharAt(int index),移除此序列指定位置上的char,返回自身对象。
-
重载的 public StringBuilder insert ,可以为该对象在指定位置插入字符序列,返回自身对象
-
public StringBuilder reverse,用于将字符序列逆序。
如果有字符串拼接的功能养成习惯使用 StringBuilder。
public static void main(String[] args) {
String str = "";
long num1 = Runtime.getRuntime().freeMemory(); // 系统剩余内存空间
long time1 = System.currentTimeMillis();
for (int i = 0; i < 5000; i++) {
str = str + i;
}
long num2 = Runtime.getRuntime().freeMemory(); // 系统剩余内存空间
long time2 = System.currentTimeMillis();
System.out.println(num2 - num1);
System.out.println(time2 - time1);
System.out.println(str);
StringBuilder str2 = new StringBuilder("");
long num3 = Runtime.getRuntime().freeMemory(); // 系统剩余内存空间
long time3 = System.currentTimeMillis();
for (int i = 0; i < 5000; i++) {
str2.append(i);
}
long num4 = Runtime.getRuntime().freeMemory(); // 系统剩余内存空间
long time4 = System.currentTimeMillis();
System.out.println(num4 - num3);
System.out.println(time4 - time3);
System.out.println(str2);
}
时间处理相关类
基准时间 1970-01-01 00:00:00 > long 类型的变量来表示时间
时间类 (java.util.Date)
在标准Java类库中包含一个Date类。它的对象表示一个特定的瞬间,精确到毫秒。
Date() 分配一个Date对象,并初始化此对象为系统当前的日期和时间,可以精确到毫秒
Date(long date) 分配Date 对象并初始化此对象,以表示自从标准基准时间以来的毫秒数;
boolean equals(Object obj) 比较两个日期的相等性
long getTime() 返回毫秒数
String toString() 把此Date对象转换为以下形式的String
dow mon dd hh:mm:ss zzz yyyy 之中dow是一周中的某一天
DateFormat类和SimpleDateFormat类
把时间对象转化成指定格式的字符串。 反之,把指定格式的字符串转化成时间对象。
DateFormat 是一个抽象类,一般使用它的子类SimpleDateFormat类实现。
Calendar日历类
Calendar 是一个抽象类,为我们提供了关于日期计算的功能,比如年、月、日、时、分、秒的展示和计算 。
GregorianCalendar 是Calendar 的子类,表示公历;
Math 类
abs 绝对值
acos,asin,atan,cos,sin,tan 三角函数
sqrt 平方根
pow(double a,double b) a 的 b 次幂
max(double a,double b) 取大值
min(double a,double b) 取小值
ceil(double a) 大于a的最小整数
floor(double a) 小于a的最大整数
random() 返回0.0 到 1.0 的随机数
long round(double a) double型的数据转换为long (四舍五入)
toDegrees(double angrad) 弧度 -> 角度
toRadians(double angdeg) 角度 -> 弧度
File 类
java.io.File : 代表文件和目录,用于:读取文件,创建文件,删除文件,修改文件;
File类常见的构造方法public File(String pathname)
以pathname为路径创建File对象,如果pathname是相对路径,则默认的当前路径系统属性user.dir中存储 。
通过File对象创建空文件或目录
1 .createNewFile() 创建新文件
-
delete() 删除file对应的文件
-
mkdir() 创建一个目录,中间某个目录缺失,创建失败 ;
-
mkdirs() 创建多个目录,中间某个目录缺失,则创建该缺失目录
枚举
JDK1.5 引入了枚举类型,定义包括枚举声明和枚举体:
enum 枚举名 { 枚举体(常量列表) }
枚举体就是放置一些常量。
所有的枚举类型隐性的继承自 java.lang.Enum。 枚举实质上还是类,而每个被枚举的成员实质上就是一个枚举类型的实例,它们默认都是public static final修饰的。可以直接通过枚举名使用它们;
注意:
-
当你需要定义一组常量时,可以使用枚举类型。
-
尽量不要使用枚举的高级特性,事实上高级特性都可以使用普通类实现,没有必要。