第九章 常用类
9.1 String
String: 不可变的字符序列
StringBuffer: 可变的字符序列 线程安全 效率低
StringBuilder: 可变的字符序列 线程不安全 效率高 【一般用他】
执行效率:
StringBuilder > StringBuffer > String
String : String类表示字符串 Java程序中的所有字符串文字(例如"abc")都实现为此类的实例
字符串对象内存问题:
String str = “abc”;
- 创建了1个对象 new的对象在堆内存中 "abc"字符串常量存在于字符串常量池中
String str2 = new String(“haha”); 【str2指向堆内存中newString的地址】
- 创建了2个对象 new的对象在堆内存中 "haha"字符串常量存在于字符串常量池中
String str3 = new String(“abc”);
- 创建了1个对象 new的对象在堆内存中 "abc"前面已构建 常量池中已有
String底层存储字符数据的结构:
- jdk8 :private final char[] value;
- jdk11 : private final byte[ ] value;
9.2 StringBuilder和String相互转换
1、StringBuilder转换为String
- public String toString():通过toString就可以把StringBuilder转换为String
2、String转换为StringBuilder
- public StringBuilder(String s):通过构造方法就可以实现String转换为StringBuilder
public class Test10{
public static void main(String[] args) {
Stringbuilder转换为String
/*
StringBuilder sc=new StringBuilder();
sc.append("hello");
String s=sc.toString();
System.out.println(s);
*/
String转换为StringBuilder
String s="wang";
StringBuilder sc=new StringBuilder(s);
System.out.println(sc);
}
}
9.3 包装类
基本数据类型 --> 包装类
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
自动拆装箱:
1.自动装箱 : 基本 --> 引用
2.自动拆箱 : 引用 --> 基本
基本类型与包装类对象比较问题 :
1.两个int类型比较 值相等就相等
2.两个new Integer比较 肯定不相等 new就是新的地址
3.int与Integer|new Integer比较 只要值相等就相等 因为会先自动拆箱 再比值
4.两个Integer比较 如果值在[-128,127]之间返回缓冲区对象相等 否则超过这个范围就会新new对象 返回new
Integer不相等
9.4 Math
Math 数学相关类 静态工厂
-
static double abs(double a) 返回 double值的绝对值
-
static double ceil(double a) 返回大于或等于参数且等于数学整数的最小值(最接近负无穷大)
-
static double floor(double a) 返回小于或等于参数且等于数学整数的最大值(最接近正无穷大)
-
static int max(int a, int b) 返回两个 int值中较大的 int
-
static int min(int a, int b) 返回两个 int值中较小的 int
-
static double pow(double a, double b) 返回第一个参数的值,该值是第二个参数的幂
-
static double random() 返回带有正号的 double值 大于或等于 0.0且小于 1.0 。
-
公式: Math.random()–>[0.0,1.0)
- 随机整数[min,max) (int)(Math.random()*(max-min)+min)
- 随机整数[min,max] (int)(Math.random()*(max-min+1)+min)
-
9.5 枚举
枚举 : 确定一种事物的所有可能|实例
- 枚举是类,特殊的枚举类型,具有枚举类型特殊的约束
- 定义枚举使用enum
- 枚举类中的字段默认为当前枚举类型的实例,修饰符默认为public static final
- 枚举类中可以根据需求定义成员,构造器…
- 枚举类中默认构造器私有化
- 定义的枚举类型默认隐式的继承自 java.lang.Enum->这是所有Java语言枚举类型的公共基类。
public class Class001_Enum {
public static void main(String[] args) {
//使用枚举类型的实例
WeekDay day1 = WeekDay.DAY1;
System.out.println(day1.getName());
//name()
System.out.println(day1.name()); //枚举类字段名
//ordinal() 获取枚举实例在枚举类中字段列表的序号,从开始
System.out.println(day1.ordinal());
//values() 获取当前枚举类型的所有实例
WeekDay[] arr = day1.values();
System.out.println(Arrays.toString(arr));
//switch语句 在jdk1.5新增支持对枚举类型的数据的判断
switch (day1){
case DAY1:
System.out.println("周一");
break;
case DAY2:
System.out.println("周二");
break;
case DAY7:
System.out.println("周天");
break;
}
}
}
//枚举 : 周中的每一个天
enum WeekDay{
/*枚举的字段,默认为当前WeekDay类型的实例*/
DAY1("星期一"),DAY2("星期二"),DAY3,DAY7;
//成员变量
private String name;
private WeekDay() {
}
WeekDay(String name) {
this.name = name;
}
//成员方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
9.6 克隆
clone( ) 克隆 | 拷贝 来自Object类clone( )方法
Cloneable接口 : 对象的类型要求实现Cloneable 才具有克隆的能力
java.lang.CloneNotSupportedException : 抛出此异常表示已调用类Object中的clone方法来克隆对象 但
该对象的类未实现Cloneable接口
方法重写的细节: 子类中的重写方法 父类中被重写的方法
- == 方法签名完全相等
- <= 返回值类型 : 基本数据类型要求完全相等 引用数据类型:重写方法的返回值类型<=被重写方法的返回值类型
- = 权限修饰符 : 重写方法的权限修饰符>=被重写方法的权限修饰符**
浅拷贝|浅克隆 : 当拷贝对象的时候,对象的属性如果为引用数据类型,属性所指向的对象不拷贝
深拷贝|深克隆 : 当拷贝对象的时候,对象的属性如果为引用数据类型,属性所指向的对象也拷贝一份
建议:
当对象的属性是通过复杂的运算或者算法计算出来,在想要等到相同内容的对象时候可以使用clone克隆,提高
效率
9.7 时间日期类型
java8之前 Date 类型 java.util 包下的Date
- Date( )
分配 Date对象并对其进行初始化,使其表示分配时间,测量 Date到毫秒
- Date(long date)
分配 Date对象并初始化它以表示自标准基准时间(称为“纪元”)以来的指定毫秒数,即1970年1月1日00:00:00 GMT
- long getTime()
返回自此 Date对象表示的1970年1月1日00:00:00 GMT以来的毫秒数
- boolean after(Date when)
测试此日期是否在指定日期之后
- boolean before(Date when)
测试此日期是否在指定日期之前
- static Date from(Instant instant)
从 Instant对象获得 Date的实例。
- Instant toInstant()
将此 Date对象转换为 Instant
格式化
DateFormat类应该用于格式化和解析日期字符串。
SimpleDateFormat是一个用于以区域设置敏感的方式格式化和解析日期的具体类。 它允许格式化(日期→文
本),解析(文本→日期)和规范化。
java8新增时间日期API :
Date,SimpleDateFormat 线程不安全的
JDK8当中提供的LocalTime
、LocalDate
、 LocalDateTime
等类型,线程安全,使用简单灵活