8. String str = "a" 与 String str= new String("a")

String str = "a" jvm会将其分配到常量池中
String str = new String("a") 则会将其分配到堆内存中

9. 字符串反转

StringBuilder 或StringBuffer的reverse()方法
StringBuffer,StringBuilder都是调用的 AbstractStringBuilder reverse()

10. String的常用方法

  1. indexOf() public int indexOf(int ch,int fromIndex);
    返回给定字符在字符串中的第一次位置,未找到返回-1, ‘char’实际是转换为int
    indexOf() public int indexOf(String str,int fromIndex);
    查找子串的第一个匹配位置,先找到第一个字符串的位置,再匹配剩余字符串

  2. charAt(int index) 返回数组的对应位置的字符,越界抛出StringIndexOutOfBoundsException

  3. replace(char oldChar, char newChar) 替换第一个指定字符串,返回new String(value, true),新建一个char[],替换元素,并修改引用

    /*
    * Package private constructor which shares value array for speed.
    * this constructor is always expected to be called with share==true.
    * a separate constructor is needed because we already have a public
    * String(char[]) constructor that makes a copy of the given char[].
    */
    String(char[] value, boolean share) {
        // assert share : "unshared not supported";
        this.value = value;
    }
    通过替换 String所对应的 char[] 数组
    public String(char value[]) {
        this.value = Arrays.copyOf(value, value.length);
    }
    new String(value) 是直接复制一个value对应的数组
  4. trim()去除两端的空白字符,指向一个新的String对象
    获取当前字符串两端的空白字符串的 index,调用substring(),即
    new String(char[], start, end),使用Arrays.copyOfRange新建

  5. split()以指定表达式分割,返回字符串数组,表达式为1个字符时,会循环调用indexOf和substring方法构建String[],当时表达式时,会调用
    Pattern.compile(regex).split(this, limit);

  6. getBytes 返回字符串byte类型的数组
    调用StringCoding.encode进行编码,先使用defaultCharset,编码失败,则再尝试"ISO-8859-1"进行编码,若再次失败抛出UnsupportedEncodingException,并退出System.exit(1);

  7. length 返回字符串的长度,即数组的长度

  8. toLowerCase toUpperCase 小写 大写

  9. substring 截取字符串, 返回新的字符串对象

  10. equals 字符串比较 先使用==判断是否是同一个对象 ,再 进行字符串的逐个字符比较

11.抽象类 是否一定要有抽象方法

抽象 是 面向对象中重要的部分 是(封装继承多态)继承的一种关系
声明抽象方法会造成以下两个结果:

  1. 如果一个类包含抽象方法,那么该类必须是抽象类。
  2. 任何子类必须重写父类的抽象方法,或者声明自身为抽象类。

继承抽象方法的子类必须重写该方法。否则,该子类也必须声明为抽象类。最终,必须有子类实现该抽象方法,否则,从最初的父类到最终的子类都不能用来实例化对象。

12.普通类和抽象类的区别

普通类不能包含抽象方法,抽象类不一定包含抽象方法
抽象类不能直接实例化
抽象类不能用final关键字修饰,普通类可以,会在编译阶段提示错误
一般情况我们使用abstract 抽象出基类的抽象方法,默认实现一些共有的方法,在子类中自定义实现特有的抽象方法,要确保子类方法不会被再次继承,使用final修饰(例如 dataProvider => jdbcDataProvider => mysqlDataProvider)

13.接口和抽象类的区别

参数 抽象类 接口
默认的方法实现 它可以有默认的方法实现 接口完全是抽象的。它根本不存在方法的实现
实现 子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。 子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现
构造器 抽象类可以有构造器 接口不能有构造器
与正常Java类的区别 除了你不能实例化抽象类之外,它和普通Java类没有任何区别 接口是完全不同的类型
访问修饰符 抽象方法可以有public、protected和default这些修饰符 接口方法默认修饰符是public。你不可以使用其它修饰符。
main方法 抽象方法可以有main方法并且我们可以运行它 接口没有main方法,因此我们不能运行它。
多继承 抽象方法可以继承一个类和实现多个接口 接口只可以继承一个或多个其它接口
速度 它比接口速度要快 接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。
添加新方法 如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。 如果你往接口中添加方法,那么你必须改变实现该接口的类。