第10章 常用类
包装类
引入
- 什么是包装类
- 以前定义变量,经常使用基本数据类型
- 对于基本数据类型来说,他就是一个数,加属性、方法、构造器,
- 将基本数据类型对应进行了一个封装,产生了一个新的类,包装类。
- Int byte :基本数据类型
- 包装类:引用数据类型
- 对应关系:基本数据类型对应的包装类
基本数据类型 | 对应的包装类 | 继承关系 |
byte | byte | Number – Object |
short | Short | Number – Object |
int | Integer | Number – Object |
long | Long | Number – Object |
float | Float | Number – Object |
double | Double | Number – Object |
char | Character | Object |
boolean | Boolean | Object |
- 已经有数据类型了,为什么要封装为包装类?
- Java语言面向对象的语言,最擅长的操作各种各样的类;
- 以前学习装数据的:数组,int[],String[],double[] Student[]
- 以后学习的装数据的:集合,特点:只能装引用数据类型的数据;
- 是不是有了包装类以后就不用基本数据类型了?
- 不是。
Integer
- 直接使用无需导包,
- Java.lang
- 类 Integer
- 类的继承关系
- Java.lang.Object>Java.lang.Number>java.lang.Integer
- 实现接口
- 所有已实现的接口
- Serializable,Comparable<Integer>
- 所有已实现的接口
- 这个类被final修饰,那么这个类不能有子类,不能被继承
- 包装类是对基本数据类型的封装:对int类型封装产生了Integer
- Integer类在对象中包装了一个基本类型int的值,Integer类型的对象包含一个int类型的字段。
- 类的历史
- 从JDK1.0开始
- 属性
- 构造器(发现没有空参构造器)
- 包装类特有的机制:自动装箱 自动拆箱
// 自动装箱:int --->Integer
Integer i = 12;
System.out.println(i);
// 自动拆箱:Integer --->int
Integer i2 = new Integer(12);
int num = i2;
System.out.println(num);
-
- 自动装箱 自动拆箱 是从JDk1.5以后,新出的特性;
- 自动装箱 自动拆箱:将基本数据类型和包装类进行快速的自动转换
- 可以断点进入valueof方法
- 常用方法
compareTo 、==、equals
compareTo
Integer i3 = new Integer(6);
Integer i4 = new Integer(12);
System.out.println(i3.compareTo(i4));//return (x < y) ? -1 : ((x == y) ? 0 : 1);
valueOf方法的底层:
转换
日期相关方法
Java.util.Date类方法
(3)该方法的作用
Java.sql.Date类方法
- String ---> java.util.Date 类型转换:
- String --->java.sql.Date
- java.sql.Date ---> java.util.Date
上述代码有局限性,字符串的格式只能是年-月-日拼接的形式,换成其他类型,就会出现异常:
- 日期转换类,引入新的类 SimpleDateFormat
package com.ymj.test06;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Test01 {
public static void main(String[] args) {
// 日期和转换
// SimpleDateFormat(子类) extends DateFormat(父类是一个抽象类)
// 格式化的标准已经定义好了
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
//String -> Date
try {
Date d = df.parse("2021-11-8 20:36");
System.out.println(d);
} catch (ParseException e) {
e.printStackTrace();
}
// Date -> String
String format = df.format(new Date());
System.out.println(format);
Date date = new Date();
System.out.println(date.toString());
System.out.println(date.toGMTString());
System.out.println(date.toLocaleString());
}
}
Calendar类
练习题
代码
package com.ymj.test06;
import java.sql.Date;
import java.util.Calendar;
import java.util.Scanner;
public class Test02_Calendar {
public static void main(String[] args) {
// Calendar是一个抽象类,不可创建对象
//录入日期的String
Scanner sc = new Scanner(System.in);
System.out.println("请输入你想要查看的如期:(提升:请按照例如2021-11-8的格式书写)");
String st = sc.next();
// System.out.println(st);
//String -> Calendar
//String -> Date
java.sql.Date date = java.sql.Date.valueOf(st);
//Date -> calendar
Calendar cal = Calendar.getInstance();
cal.setTime(date);
//星期提示:
System.out.println("日\t一\t二\t三\t四\t五\t六\t");
//获取本月最大天数
int maxDay = cal.getActualMaximum(Calendar.DATE);
//获取当前日期中的日
int nowDay = cal.get(Calendar.DATE);
//将日期调为本月的1号
cal.set(Calendar.DATE, 1);
//获取1号为本周的第几天
int no = cal.get(Calendar.DAY_OF_WEEK);
// System.out.println(no);
for (int i = 0; i < no-1; i++) {
System.out.print(" \t");
}
//遍历:从1号开始到maxDay号进行遍历
for (int i = 1; i <= maxDay; i++) {
if (i == nowDay)
System.out.print(i + "*\t");
else
System.out.print(i + "\t");
if ((i+no-1) % 7 == 0)
System.out.println();
}
}
}
第三批日期API
LocalDate/LocalTime/LocalDateTime
方法2:of()
格式化类:DateTimeFormatter
Math类
常用方法
静态导入
Random类
Math.random() 实际上还是调用了Random.nextDouble();
String类
equals方法
compareTo方法
substring方法
String的内存分析
- 字符串的拼接
- new关键字创建对象
- 有变量参与的字符串拼接:
反汇编
StringBuilder类
-
-
- 字符串的分类:
- 不可变字符串:String
- 可变字符串:StringBuilder,StringBuffer
- Stringbuilder底层:非常重要的两个属性:
- 对应内存分析及代码
- 字符串的分类:
-
package com.ymj.test07StringBuilder;
public class Test01_StringBuilder {
public static void main(String[] args) {
//表面上调用StringBuilder的空构造器,实际底层是对value数组进行初始化,长度为16
StringBuilder sb3 = new StringBuilder();
//表面上调用有参构造器,传入一个int类型的数,实际底层是对value数据进行初始化,长度为传入的数字;
StringBuilder sb2 = new StringBuilder(3);
StringBuilder sb = new StringBuilder("abc");
sb.append("def").append("aaaaaaaa").append("bbb").append("ooooooo");//
}
}
内存分析
可变与不可变
- String 不可变
- 不可变:在地址不变的情况下,想把“abc”变成“abcdef”是不可能的
- StringBuilder 可变
- 可变,在StringBuilder这个对象的地址不变的情况下,想把“abc”变成“def”时可能的,直接追加即可;
StringBuilder常用方法
StringBuffer常用方法:
和StringBuilder一样
String、StringBuffer、StringBuilder区别与联系
- String类是不可变类,即一旦一个String对象被创建后,包含在这个对象中的字符序列是不可改变的,直至这个对象销毁;
- StringBuffer类则代表一个字符序列可变的字符串,可通过append、insert、reverse、setChartAt、setLength等方法改变其内容。一旦生成了最终的字符串,调用toString方法将其转变为String
- JDK1.5新增了一个StringBuilder类,与StringBuffer相似,构造方法和方法基本相同,不同是StringBuffer是线程安全的,而StringBuilder是线程不安全的,所以性能略高。通常情况下,创建一个内容可变的字符串,应该优先考虑使用StringBuilder
- StringBuilder:JDK1.5开始,效率高,线程不安全;
- StringBuffer:JKD1.0开始,效率低,线程安全。