一、包装类
1、包装类概述
- 8种基本类型对应8种包装类,除了 Integer 和 Character 类以外,其他只是类名首字母大写;
- 除了 Character 和 Boolean,其他都是数字型,继承自 Number 类,重写过 intValue()、longValue()、floatValue()、doubleValue() 方法,可以相互转换;
- 包装类的用途:对象数组和集合操作;包装对象包含方法可以为基本类型、包装类和字符串之间的转换提供方便;
2、自动装箱和拆箱
(1)自动装箱:基本类型的数据处于需要对象的环境中时,会自动转为对象
(2)自动拆箱:每当需要一个值时,对象会自动转成基本数据类型
(3)实现:通过调用包装类的 valueof()和 intValue()方法分别实现 装 拆 箱,整个过程有编译器自动完成
(4)代码:注意包装类的空指针问题
Integer b = 23; // 自动装箱
int a = new Integer(20); //自动拆箱
// 下面的问题我们需要注意:
Integer c = null;
int d = c; // 此处其实就是:c.intValue(),因此抛空指针异常。
3、包装类缓存问题
(1)包装类在自动装箱时为了提高效率,对于-128~127之间的值会进行缓存处理
(2)缓存的本质就是包装类在加载时,自动创建这个范围内的对象,后面用的话直接引用,不会在 new 对象
(3)超过范围后,对象之间不能再使用==进行数值的比较,而是使用equals方法
二、String类
1、String 类概述
(1)String 类对象是不可变的Unicode字符序列(不可变对象),其内部的成员变量用 final 修饰,其值无法改变
(2)字符串常量拼接时的优化
public class TestString2 {
public static void main(String[] args) {
//编译器做了优化,直接在编译的时候将字符串进行拼接
String str1 = "hello" + " java";//相当于str1 = "hello java";
String str2 = "hello java";
System.out.println(str1 == str2);//true
String str3 = "hello";
String str4 = " java";
//编译的时候不知道变量中存储的是什么,所以没办法在编译的时候优化
String str5 = str3 + str4;
System.out.println(str2 == str5);//false
}
}
(3)常用方法总结:
- 这些方法会返回一个新的 String,而不改变原来 String 的值:concat()、 replace()、substring()、 toLowerCase()、 toUpperCase()、trim()
- 提供查找功能的有关方法: endsWith()、 startsWith()、 indexOf()、lastIndexOf()
- 提供比较功能的方法: equals()、equalsIgnoreCase()、compareTo()
- 其它方法: charAt() 、length()
2、StringBuffer和StringBuilder
(1)概念
- tringBuffer 和 StringBuilder 均代表可变的字符序列
- 都是抽象类 AbstractStringBuilder 的子类,方法几乎一模一样
- 二者内部字符数组未用 final 修饰,是可变的
- 字符串的多次拼接可以用这两个类,多用于循环中,可以减少资源的浪费
(2)二者区别
- StringBuffer 线程安全, 效率较低
- StringBuilder 线程不安全,效率较高,建议采用该类;
(3)常用方法
- append(" ")
- delete(int start,int end)
- deleteCharAt(int index)
- insert(index," ")
- reverse()
- 此外还有:indexOf()、substring()、length()、charAt()等方法
三、时间类
1、毫秒值
- 把1970 年 1 月 1 日 00:00:00定为基准时间,每个度量单位是毫秒(1秒的千分之一);
- 毫秒值为 long 型:long now = System.currentTimeMillis();
2、date类
(1)构造器
- 空参:new Date() 时间默认当前时间
- 有参:new Date(100) 参数为毫秒值
(2)方法
- long getTime():得到时间的毫秒值
- 判断时间前后:before、after、equals
- toString:格式化输出
(3)说明:很多方法过时,现在一般用 calendar 类
3、DateFormat类和SimpleDateFormat类
(1)作用:实现字符串和时间对象的相互转换
// new 出 sdf 对象
SimpleDateFormat s1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
// 将时间对象转换成字符串
System.out.println(new SimpleDateFormat("hh:mm:ss").format(new Date()));
// 将符合指定格式的字符串转成成时间对象.字符串格式需要和指定格式一致。
String time = "2007-10-7 20:15:30";
Date date = s1.parse(time);
(2)其他用途:获取当前时间是今年第几天
SimpleDateFormat s1 = new SimpleDateFormat("D");
String daytime = s1.format(new Date());
System.out.println(daytime);
4、calendar类
(1)概述
- Calendar 类是一个抽象类,提供日期计算的相关功能
- GregorianCalendar 是 Calendar 的一个具体子类
- 注意月份的表示,一月是0,二月是1,以此类推,12月是11
(2)方法
- calendar.get(Calendar.YEAR)
- set(Calendar.YEAR, 2999)
- add(Calendar.MONTH, -7)
- calendar3.getTime():日历转时间
- calendar4.setTime(new Date()):时间转日历
(3)某一月份日历打印(练习)
(4)Clendar 类的常量
- Calendar.YEAR
- Calendar.MONTH
- Calendar.DAY_OF_MONTH
- Calendar.DATE
- Calendar.DAY_OF_WEEK
- Calendar.HOUR_OF_DAY
- Calendar.MINUTE
- Calendar.SECOND
四、Math类
1、常用方法
- abs 绝对值、sqrt 平方根、pow(double a, double b) a的b次幂、random() 返回 0.0 到 1.0 的随机数
- ceil(double a) 大于a的最小整数、floor(double a) 小于a的最大整数、long round(double a) 四舍五入
2、关于随机数
(1)Math.random():返回 0到 1的随机数
(2)Random类:nextDouble()、nextInt(10)
(3)Math.random()底层调用的就是Random的nextDouble()方法
五、File类
1、基本用法
(1)说明: java.io.File类代表文件和目录,用于读取文件、生成文件、删除文件、修改文件的属性
(2)构造方法
- public File(String pathname):有相对路径和绝对路径
(3)创建文件
File f = new File("a.txt"); //相对路径:默认放到user.dir目录下面
f.createNewFile();//创建文件
(4)创建目录
- 一个目录
File f2 = new File("d:/电影");
boolean flag = f2.mkdir(); //目录结构中有一个不存在,则不会创建整个目录树
System.out.println(flag);//创建失败
- 多个目录
File f2 = new File("d:/电影/华语/大陆");
boolean flag = f2.mkdirs();//目录结构中有一个不存在也没关系;创建整个目录树
System.out.println(flag);//创建成功
(5)访问属性
2、递归遍历目录
/**
* 打印文件信息
* @param file 文件名称
* @param level 层次数(实际就是:第几次递归调用)
*/
static void printFile(File file, int level) {
//输出层次数
for (int i = 0; i < level; i++) {
System.out.print("-");
}
//输出文件名
System.out.println(file.getName());
//如果file是目录,则获取子文件列表,并对每个子文件进行相同的操作
if (file.isDirectory()) {
File[] files = file.listFiles();
for (File temp : files) {
//递归调用该方法:注意等+1
printFile(temp, level + 1);
}
}
}
六、枚举类
1、概念
(1)定义格式
enum Season {
SPRING, SUMMER, AUTUMN, WINDER
}
(1)实质
- 枚举实质上还是类,而每个被枚举的成员实质就是一个枚举类型的实例,默认都是public static final修饰的,可以通过类名直接调用
2、使用
- 需要定义一组常量时,可以使用枚举类型
- 尽量不要使用枚举的高级特性,事实上高级特性都可以使用普通类来实现