一:Object类解析
所有类的最终父类都是Object
native本地函数:就是指当前的方法内容有计算机具体的底层来实现 C/C++语言
private static native void registerNatives();
Object的这个类一旦被加载进方法区 则执行 注册本地方法registerNatives()
就会在底层去创建一个Object对象并对类进行一定程度上初始化
static {
registerNatives();
}
1.所有Object的子类 可以继承到此方法 但是不能重写
功能:主要就是获取当前类的信息(当前对象的类的对象 - Class类)
万事万物皆对象 类是不是对象呢? Class是 Java类的描述的一个类
就是字节码的类 .class文件当成一个对象去看待 Class就是该对象的类
本地方法
public final native Class<?> getClass(); ***** 反射时说的多一些
2.本地方法
功能:获取当前对象的哈希值(在哈希表中的一个存储位置)
本方法可以被重写:
如果子类重写该方法 就意味着有子类去决定它自己的哈希值
如果子类没有重写该方法 默认将该对象的地址当做哈希值
public native int hashCode(); *****
当前对象this和传入的对象obj是否相等
对于Object而言 比较的其实就是两个对象的地址!!!
如果子类没有重写该方法 那么也默认进行地址的比较!!!
【一般而言 我们比较的应该是对象的内容 而不是对象的地址】
【== equals有什么区别:==比的永远是地址 equals在Object中与==一样 当然 也可以由子类自行重写】
public boolean equals(Object obj) { *****
return (this == obj);
}
功能:就是当我们直接打印一个对象时 打印的内容默认就是toString返回的内容
返回当前对象的字符串形式
Object obj=new Object();
println(obj); == println(obj.toString());
全类名+@+十六进制哈希值的字符串形式
public String toString() { *****
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
当对象被垃圾收集器回收时 会执行该方法 JVM去详细说 可以理解为是“临刑前的遗言”
protected void finalize() throws Throwable { }
二:基本数据类型包装类
万事万物皆对象
所以我们的基本数据类型其实也有其针对的类描述
byte - Byte
short - Short
int - Integer
long - Long
float - Float
double - Double
char - Character
boolean - Boolean
Number
|-- Byte Short Integer Long Float Double 【BigDecimal BigInteger】
Object
|-- Character Boolean
三:StringBuffer类与StringBuilder类
也称之为是 字符串缓冲区(就是个动态扩容的数组而已!)
1.如果说String是固定长度的且不能修改内容的字符串
SB就是长度可变的且能够修改内容的字符串
StringBuffer和StringBuilder 方法都是一样的
唯一的区别就在于适用的场景不同,StringBuffer适用于多线程; StringBuilder适用于单线程
StringBuilder是线程不安全的->没加锁(同步锁) 单 效率会更高
StringBuffer是线程安全的->加锁(同步锁) 多 效率会更低
String和SB本质上都是字符数组
String中不支持字符数组扩容和修改内容的
SB中支持字符数组扩容和修改内容的
AbstractStringBuilder
|impl Appendable 可扩展(字符/字符序列)的
Appendable append(char c)
Appendable append(CharSequence csq)
Appendable append(CharSequence csq, int start, int end)
|impl CharSequence 此接口对许多不同种类的 char 序列提供统一的只读访问
char charAt(int index)
int length()
CharSequence subSequence(int start, int end)
String toString()
|StringBuilder 有final表示不能被继承 成员函数没有synchronized修饰 无同步锁
|impl Serializable
|impl CharSequence
|StringBuffer 有final表示不能被继承 成员函数都有synchronized修饰 同步锁
|impl Serializable
|impl CharSequence
String 有final表示不能被继承 线程不安全的 会产生额外的垃圾!
|impl Serializable
|impl Comparable
|impl CharSequence
字符串缓冲区SB其实就是个动态扩容的数组而已!
如果扩容的次数越多,那么也就意味着所用过的数组也越多 产生的垃圾越多!
我们在使用String去操作的话,也会产生许多临时的字符串 产生的垃圾也多!
SB产生的垃圾主要集中在 堆内存
String产生的垃圾主要集中在 方法区(字符串常量池)
【JVM告诉你,GC在堆内存中活跃程度 比在方法区的活跃程度 要大的大的大的多!】
【GC 垃圾收集器】
【也就意味着 GC在堆内存中回收垃圾的效率要远远比在方法区高】
(堆垃圾就像是家用垃圾桶,满了就清理)
(方法区就像是垃圾场,满了才清理)
【堆的垃圾被回收的很快 方法区的垃圾回收的很慢】
综上而言 还是推荐使用SB