一、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虽然慢,但线程安全。