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的常用方法
-
indexOf() public int indexOf(int ch,int fromIndex);
返回给定字符在字符串中的第一次位置,未找到返回-1, ‘char’实际是转换为int
indexOf() public int indexOf(String str,int fromIndex);
查找子串的第一个匹配位置,先找到第一个字符串的位置,再匹配剩余字符串 -
charAt(int index) 返回数组的对应位置的字符,越界抛出StringIndexOutOfBoundsException
-
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对应的数组
-
trim()去除两端的空白字符,指向一个新的String对象
获取当前字符串两端的空白字符串的 index,调用substring(),即
new String(char[], start, end),使用Arrays.copyOfRange新建 -
split()以指定表达式分割,返回字符串数组,表达式为1个字符时,会循环调用indexOf和substring方法构建String[],当时表达式时,会调用
Pattern.compile(regex).split(this, limit); -
getBytes 返回字符串byte类型的数组
调用StringCoding.encode进行编码,先使用defaultCharset,编码失败,则再尝试"ISO-8859-1"进行编码,若再次失败抛出UnsupportedEncodingException,并退出System.exit(1); -
length 返回字符串的长度,即数组的长度
-
toLowerCase toUpperCase 小写 大写
-
substring 截取字符串, 返回新的字符串对象
-
equals 字符串比较 先使用==判断是否是同一个对象 ,再 进行字符串的逐个字符比较
11.抽象类 是否一定要有抽象方法
抽象 是 面向对象中重要的部分 是(封装继承多态)继承的一种关系
声明抽象方法会造成以下两个结果:
- 如果一个类包含抽象方法,那么该类必须是抽象类。
- 任何子类必须重写父类的抽象方法,或者声明自身为抽象类。
继承抽象方法的子类必须重写该方法。否则,该子类也必须声明为抽象类。最终,必须有子类实现该抽象方法,否则,从最初的父类到最终的子类都不能用来实例化对象。
12.普通类和抽象类的区别
普通类不能包含抽象方法,抽象类不一定包含抽象方法
抽象类不能直接实例化
抽象类不能用final关键字修饰,普通类可以,会在编译阶段提示错误
一般情况我们使用abstract 抽象出基类的抽象方法,默认实现一些共有的方法,在子类中自定义实现特有的抽象方法,要确保子类方法不会被再次继承,使用final修饰(例如 dataProvider => jdbcDataProvider => mysqlDataProvider)
13.接口和抽象类的区别
参数 | 抽象类 | 接口 |
---|---|---|
默认的方法实现 | 它可以有默认的方法实现 | 接口完全是抽象的。它根本不存在方法的实现 |
实现 | 子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。 | 子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现 |
构造器 | 抽象类可以有构造器 | 接口不能有构造器 |
与正常Java类的区别 | 除了你不能实例化抽象类之外,它和普通Java类没有任何区别 | 接口是完全不同的类型 |
访问修饰符 | 抽象方法可以有public、protected和default这些修饰符 | 接口方法默认修饰符是public。你不可以使用其它修饰符。 |
main方法 | 抽象方法可以有main方法并且我们可以运行它 | 接口没有main方法,因此我们不能运行它。 |
多继承 | 抽象方法可以继承一个类和实现多个接口 | 接口只可以继承一个或多个其它接口 |
速度 | 它比接口速度要快 | 接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。 |
添加新方法 | 如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。 | 如果你往接口中添加方法,那么你必须改变实现该接口的类。 |