一,Object :所有类的超类
是java中所有类的父类,java中所有的类都会直接或者间接的继承自Object
如果显示的使用extends继承其他类,因为单继承机制,不会直接继承自Object,如果没有显示继承其他类,会默认继承自Object类
toString : 返回对象的字符串表现形式
当输出一个对象的引用时,默认输出的是调用toString方法的返回值
Object类中的toString实现 :
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
需求 : 想要输出对象的字符串表现形式时|引用时,输出的是对象所有的属性值---->子类中进行重写toString
//定义实体类,重写toString 方法
public String toString() {
return "Cat{name = " + name + ", age = " + age + "}";
}
equals : 比较两个对象是否相等
equals与==之间的区别 :
共同点 : 比较两个数据是否相等
异同点 :
比较数据类型要求 :
== 能够比较任意类型数据
equals 只能比较引用数据类型对象数据
int i=0;
int j=0;
System.out.println(i==j);//true
String str1 = "abc";
String str2 = new String("abc");
System.out.println(str1==str2);//false
System.out.println(str1.equals(str2));//true
比较规则 :
== 基本数据类型比较数据值,引用数据类型对象数据比较地址值
equals :
Object-> 比较为对象的地址值,默认通过==比较
public boolean equals(Object obj) {
return (this == obj);
}
重写->根据所有属性值进行比较是否相等
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Car car = (Car) o;
return age == car.age && name.equals(car.name);
}
注意 :
以后再定义实现类,都要根据所有属性值进行重写toString与equals
实体类规范 : javabean
1.类是公共的
2.至少 提供一个空构造,根据需求提供带参
3.私有的属性
4.公共的访问方式
5.重写toString与equals
二,字符串
String : 不可变的字符序列(内容,长度,顺序)
StringBuilder : 可变的字符序列,线程不安全|不同步,效率较高
StringBuffer : 可变的字符序列,线程安全|同步的,效率较低
1, String :
String类表示字符串。 Java程序中的所有字符串文字(例如"abc" )都实现为此类的实例。
分析以下代码是否存在对象创建,有几个?
String str1 = "abc"; //1个 "abc" 在字符串常量池中
String str2 = new String("bcd"); //2个 new String()->堆内存中 "bcd"->常量池中
//首先在常量池中找有没有abc,如果有直接让变量指向常量池中的地址,故只有在堆内存中new出来的对象
//如果常量池中没有我们要找的字符串,那么再新建一个对象
String str3 = new String("abc"); //1个 new String()->堆内存
String底层结构 :
jdk8->字符数组 private final char[] value;
jdk11->字节数组 private final byte[] value;
注意 : 以后要比较字符串内容是否相等,就使用equals方法
// String重写的equals方法
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String aString = (String)anObject;
if (coder() == aString.coder()) {
return isLatin1() ? StringLatin1.equals(value, aString.value)
: StringUTF16.equals(value, aString.value);
}
}
return false;
}
2,StringBuilder|StringBuffer
String, StringBuilder,StringBuffer 的区别 :
都表示字符串,字符序列
是否可变 :
String : 不可变
StringBuilder : 可变
StringBuffer : 可变
线程安全|同步
StringBuilder : 线程不安全|不同步
StringBuffer : 线程安全|同步
执行效率
StringBuilder > StringBuffer > String
StringBuilder,StringBuffer :
StringBuilder :
一个可变的字符序列。 此类提供与StringBuffer兼容的API,但不保证同步。 在可能的情况下,建议使用此类优先于StringBuffer因为在大多数实现中它会更快。
StringBuffer :
线程安全,可变的字符序列。可供多个线程使用。
从JDK 5版本开始,这个类已经补充了一个设计用于单个线程的等效类, StringBuilder 。 通常应优先使用StringBuilder类,因为它支持所有相同的操作,但速度更快,因为它不执行同步。
底层结构 :
来自共同的父类 AbstractStringBuilder
jdk8及之前 : char[] value;
jdk11 : byte[] value;
初始容量 : 16 | 可以通过构造器指定
扩容机制 : 调用Arrays的valueOf方法实现创建新数组+拷贝数据,新数组的容量为原数组容量的2倍+2 int newCapacity = (oldCapacity << 1) + 2;
注意 :
以后如果使用某种类型底层数据结构为数组,关注初始容量 + 扩容机制
三,Math
四,Data包装类
包装类 :
有了基本数据类型为什么要提供包装类 ?
1.类中可以定义很多方法,方便操作使用
2.集合存储数据,只能存储引用数据类型的对象数据
3.结合业务 : 区分用户账户余额是否充过值|充值后消费完 :
null --> 没有充过值,新用户
0.0 --> 老用户,重置了花没了
为了什么有了包装类还要存在基本数据类型?
1.使用简单,赋值简单
2.有利于节省内存
1.基本数据类型与包装类之间相互转换 :
jdk5新增的自动拆装箱
自动装箱 : 基本-->引用
自动拆箱 : 引用-->基本
基本 <----> 包装类
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
2,Integer的一些方法展示
//基本
int i1 = 1;
//包装
//自动装箱 Integer.valueOf(i1)
Integer in1 = i1;
//自动拆箱 in1.intValue();
int i2 = in1;
getSum(1.1,2.2); //自动装箱
//static int max(int a, int b) 返回两个 int值中较大的一个, int调用 Math.max一样 。
//static int min(int a, int b) 返回两个 int值中较小的一个, int调用 Math.min一样 。
//static int parseInt(String s) 将字符串参数解析为带符号的十进制整数。
System.out.println(Integer.parseInt("10"));
//static int parseInt(String s, int radix) 将字符串参数解析为第二个参数指定的基数中的有符号整数。
System.out.println(Integer.parseInt("10",2));
System.out.println(Integer.parseInt("10",8));
System.out.println(Integer.parseInt("10",16));
//static int sum(int a, int b) 根据+运算符将两个整数相加。
//static String toBinaryString(int i) 返回整数参数的字符串表示形式,作为base 2中的无符号整数。
System.out.println(Integer.toBinaryString(10));
//static String toHexString(int i) 返回整数参数的字符串表示形式,作为基数为16的无符号整数。
System.out.println(Integer.toHexString(10));
//static String toOctalString(int i) 返回整数参数的字符串表示形式,作为基数为8的无符号整数。
五,枚举
枚举 enum
确定一种事物的所有可能|实例
枚举是一种特殊的类型,定义特殊,特点特殊,使用特殊
使用enum定义枚举类型
枚举类型的实例是由枚举类内部提供,不允许外部创建,只能获取使用
enum State{
//字段
BUSY,FREE,NORMAL;
}
枚举类中的字段为当前枚举类型的实例,相当于省略了public static final
枚举类中的构造器默认修饰符为private
枚举类中可以定义字段,属性,构造器,方法....
enum WDay{
//实例
D1("星期一"),D2("星期二"),D3("星期三");
//属性
private String name;
//构造器
private WDay() {
}
WDay(String name) {
this.name = name;
}
//成员方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void test(){}
}
枚举类型的使用,通过枚举类名.实例名获取对象,通过对象调用成员
new Staff("lisa",20,"2021",20000,State.BUSY),
new Staff("haha",24,"2020",21000,State.FREE),
new Staff("yaya",25,"2021",15000,State.NORMAL),
new Staff("甘师傅",23,"2023",28000,State.BUSY)
枚举类型默认隐式的继承自 java.lang.Enum 这是所有Java语言枚举类型的公共基类。
枚举的一些方法
//int ordinal() 返回此枚举常量的序数(它在枚举声明中的位置,其中初始常量的序数为零)。
//String toString() 返回声明中包含的此枚举常量的名称。
//T valueOf(类<T> enumType, String name) 返回具有指定名称的指定枚举类型的枚举常量。
public class Class001_Enum1 {
public static void main(String[] args) {
Weekday w1=Weekday.D1;
//int ordinal() 返回此枚举常量的序数(它在枚举声明中的位置,其中初始常量的序数为零)。
System.out.println(w1.ordinal());
//static <T extends Enum<T>>
//T valueOf(类<T> enumType, String name) 返回具有指定名称的指定枚举类型的枚举常量。
Weekday[] arr=w1.values();//得到的是w1类型的枚举的全部实例组成的数组
System.out.println(Arrays.toString(arr));
//String toString() 返回声明中包含的此枚举常量的名称。
}
}
//定义枚举
enum Weekday{
//字段
D1("星期一"),D2("星期二"),D3("星期三"),D4("星期四"),D5("星期五"),D6("星期六"),D7("星期天");
private String name;
//构造器默认是用private修饰
Weekday(){
}
Weekday(String name){
this.name=name;
}
}