Object类解析 基本数据类型包装类 StringBuffer类与StringBuilder类

一: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是线程安全的->加锁(同步锁)               多        效率会更低

 

StringSB本质上都是字符数组

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值