Java基础第十四天 - Object 类,String 类

本文介绍了Java中的Object类基本概念,包括构造方法和内置方法如hashCode、getClass、toString、equals、finalize和clone。此外,还讨论了链式调用的概念,并详细比较了String、StringBuilder和StringBuffer的使用和性能差异。
摘要由CSDN通过智能技术生成

一、Object类

根类

object 类是所有类的父类或者以上,所有类都直接或者间接继承Object类,所有Object类也叫根类。

构造方法

Object类只有一个无参的构造方法。

Object类中的方法

1.hashCode()

        int hashCode() 返回哈希码值

        不同的对象,返回不同的整数,相同的对象返回相同的整数

结果:

 

 2.getClass()

        public final 类<?> getClass(): 返回此Object的运行时类。

        getClass().getName() 返回当前类的名字

结果: 

3.toString()

public String toString() : 返回对象的字符串表示形式。

注意,当直接输出这个对象时,相当于直接调用对象的toString方法:

结果:

4.equals()

equals底层调用的其实还是 == 来运算,但在String类中重写了equals方法,所有equals用法会有区别,

== 和 equals 的区别

== 基本类型和引用类型都可以比较,不同之处在于, == 在比较基本类型的时候是毕竟的值是否相等,而在比较引用类型的时候是比较地址值是否相等。

equals 是专门来比较引用类型的,在非String类型时,equals作用和 == 相同,在比较String类型时,String对equals方法进行了重写。这时equals比较的就是值是否相等。

结果:

5.finalize()

finalize()是垃圾回收机制调用的方法,其实就算我们调用这个方法,也不一定会立即回收,只有垃圾回收器空闲时才会去回收。

因此更加推荐方法:

System.gc(); //运行垃圾加收器

6.clone()

clone是创建并返回此对象的副本。对原来没有影响。

clone的使用方法比较复杂



public class Test {
    //3.抛出异常处理 throws CloneNotSupportedException
    public static void main(String[] args) throws CloneNotSupportedException {
        Person person = new Person();
        person.name = "张三";
        person.age = 18;
        
        //4.  clone 是Object的对象,父类不能访问子类特有的属性,所有要强转
        Person p  = (Person) person.clone();

        System.out.println(p.name);
        System.out.println(p.age);
    }
}


// 1. 实现克隆的接口   implements Cloneable
class Person implements Cloneable{
    public String name;
    public int age;
// 2.在Person类中重写clone的方法。
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

要想使用clone,

1.首先在要克隆的类,先实现对Cloneable接口的实现,

2.然后在类中重写clone方法,

3.然后在测试类中抛出不支持克隆的异常(CloneNotSupportException ),

4.最后因为clone是Object类的方法,想要访问子类特有的属性,必须向下兼容,所有必须强制转换后在进行克隆方法调用。

二、链式调用

当一个返回值是一个对象的时候,我们可以采用链式调用。是后期我们常用的方法。

结果:

三、String 类

String类被final修饰,他没有子类。

String底层是一个被final修饰的字符数组,所有String的值不会改变。

String字符串是存储在方法区的字符常量区

String的定义分为:

                1.当定义字符串后,去字符常量区查找是否有对应的字符,

                2.有就将地址赋给定义的变量,

                3.没有就重新在字符常量区创建一个区域,区域里面是定义的字符串,在将这个地址赋给接收的变量

因此,当我们有多个字符变量的定义情况下,会多次在字符常量区创建静态字符地址,降低运行效率,所有我们在面对这种情况常用StringBuffer和StringBuilder。

StringBuilder()和StringBuffer()

StringBuffer()和StringBuilder()其实没有什么不同,他们都是在已有的对象上修改,不会产生新的对象,最大的区别就是,StringBuffer支持同步访问,StringBuilder不支持同步访问(线程不安全)。

然后因为StringBuilder的访问速度比StringBuffer块,我们常用的还是StringBuilder方法。

构造方法

StringBuilder() 构造一个没有字符的字符串构建器,初始容量为16个字符。

StringBuilder(CharSequence seq) 构造一个包含与指定的相同字符的字符串构建器 CharSequence 。

StringBuilder(int capacity) 构造一个没有字符的字符串构建器,由 capacity参数指定的初始容量。 StringBuilder(String str) 构造一个初始化为指定字符串内容的字符串构建器。

成员方法

底层是一个char[] 如果长度不够,创建一个更大长度的数组 自动扩容

int capacity(): 返回容量
int length() : 返回长度

append() ;  追加字符串(加在最后)
insert(int offset , String str):  
delete:
deleteCharAt()

replace
 

String与StringBuilder的转换

方法1:

String s = "hello";

StringBuilder sb = new StringBuilder(s);

方法2:

StringBuilder sb = new StringBuilder();

sb.append(s);

 StringBuilder 转换为 String

 方法一

StringBuilder sb = new StringBuilder("abc");

sb.toString();

方法二

String str = new String(sb);

 

String和StringBuilder,StringBuffer的区别

他们都是用于字符串的修改。

String是被final修饰的类,同时底层的字符数组也是被final修饰的不可变数组。所有他被编译器设置为共享。

String的修改其实是创建了新的对象,对新的对象赋修改后的值。原来的值依然存储在字符常量区,引起了内存浪费,拖慢了运行速度。

StringBuilder和StringBuffer 是在原来对象上修改,减少了内存的占用。但StringBuilder不能同步(线程不安全)但运行速度快。StringBuffer虽然慢,但线程安全。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值