第十一周周记

目录

String、StringBuffer、StringBuilder的区别

String的不可变性

String实例化的两种方式

StringBuffer

StringBuilder和StringBuffer的区别

"equals()"和"=="

抽象类 方法

1.抽象方法使用规则

2.抽象类的语法规则

接口里的抽象方法


String、StringBuffer、StringBuilder的区别
  • String是被final修饰的类,不能被继承;
  • String实现了Serializable和Comparable接口,表示String支持序列化和可以比较大小;
  • String底层是通过char类型的数据实现的,并且被final修饰,所以字符串的值创建之后就不可以被修改,具有不可变性。
String的不可变性

当字符串重新赋值时,不会在原来的内存地址进行修改,而是重新分配新的内存地址进行赋值。

当字符串的内容相同时,字符串指向同一地址值。

String实例化的两种方式

方式一:通过字面量方式实例化     String str = "abc";
方式二:通过new+构造器的方式实例化     String str=new String("abc");

用String实现字符串拼接,会在方法区中占用大量内存,因为java中字符串是不可变的,每一次拼接都会产生新字符串,即要在字符串常量池中开辟新的空间存储它(产生新的对象)。所以就有了StringBuffer这个类,用来解决字符串拼接造成方法区内存浪费的问题。

StringBuffer

1.StringBuffer,它的默认初始化容量(字符串缓冲区)是16(无参构造情况下),这个我们通过看JDK中的源代码可以知道。
2.StringBuffer底层实际上是一个byte数组(jdk版本不同可能为char数组),用来存放修改后的字符串,即不用在字符串常量池中创建新的对象。
3.你可以调用append方法,往里面添加字符串,底层数组满了,会自动进行扩容(底层调用了System.arraycopy()方法,对数组进行扩容,实质就是指向一个更大的数组,原来那个小的由垃圾回收器回收)。
4.为了提高StringBuffer的性能,应根据实际情况确定初始化容量,减少底层数组扩容次数。

StringBuilder和StringBuffer的区别

前者的方法都有synchronized修饰,表示在多线程环境下运行时是安全的,后者没有,在多线程环境下运行是不安全的。但StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。

"equals()"和"=="

==操作符专门用来比较变量的值是否相同。

  • 基本数据类型:比较的是他们的值是否相同。
  • 引用数据类型:比较的是他们的内存地址是否同一地址。

引用类型对象变量其实是一个引用,它们的值是指向对象所在的内存地址,而不是对象本身。

equals()方法

  • 未重写equals()方法:
    public boolean equals(Object obj) {
        return (this == obj);
    }

Object中的equals方法实际使用的也是==操作符,比较的是他们的内存地址是否同一地址。

  • 重写equals()方法
if(s1.equals(s2)){
    .....
}

一般是比较对象的内容是否相同

抽象类 方法
1.抽象方法使用规则
  • 抽象方法没有方法体
  • 含有抽象方法的类必须是抽象类
  • 抽象类中可以暂时没有抽象方法
  • 抽象类中的抽象方法跟子类有什么联系?

        (1) 如果子类完全实现了父类的抽象方法,那么子类可以不用声明为抽象类
        (2) 如果子类没有完全实现父类的抽象方法,那么子类必须声明为抽象类


2.抽象类的语法规则
  • 被abstract修饰的类是抽象类
  • 抽象类中可以有抽象方法,也就是被abstract修饰的方法,也可以没有。
  • 抽象方法没有方法体,只有方法声明。
  • 子类继承抽象类需要重写父类所有的抽象方法,否则,子类也必须声明为抽象类
  • 抽象类有构造方法,但是不能被显示调用,也就是不能实例化,或者说抽象类没有对象。防
    止直接调用抽象方法
  • 抽象类的构造方法只在子类实例化时隐式调用。
  • 抽象类的使用一般是作为引用类型,指向非抽象的引用实例,体现出多态。
  • 构造方法和静态方法都不能(abstract)抽象修饰
  • 静态方法不能被子类覆盖(重写),一旦声明为抽象方法 将永远没有具体的实现
接口里的抽象方法

接口相当于一个抽象类,但又和抽象类有些不同。在抽象类里可以出现普通方法,但在接口中只能出现抽象方法。

在一个类继承接口时,必须在这个类里面重写接口中的抽象方法,使抽象方法实例化

public interface Paper {
    String size();
}
public class A4 implements Paper {

    @Override
    public String size() {
        return "A4";
    }
}

你可能感兴趣的:(java,jvm,开发语言)