10.String 类的常用方法都有那些?
length():获取字符串的长度
charAt(int index):获取指定索引处的字符
indexOf(String str):获取str在字符串对象中第一次出现的索引
subString(int start):从start开始截取字符串
subString(int start,int end):从start开始,到end结束截取字符串。包括start,不包括end
equals(Object obj):比较字符串的内容是否相同
equalsIgnoreCase(String str):比较字符串的内容是否相同,忽略大小写
startsWith(String prefix):判断字符串对象是否以指定的字符开头(区分大小写)
startsWith(String prefix,int toffset):判断字符串对象是否以指定的字符开头,参数toffset为指定从哪个下标开始
endsWith(String suffix):判断字符串对象是否以指定的字符结尾
isEmpty():判断指定字符串是否为空
toCharArray():把字符串转换为字符数组
toLowerCase():把字符串转换为小写字符串
toUpperCase():把字符串转换为大写字符串
trim():去除字符串两端空格
split(String regex):去除字符串中指定的的字符,然后返回一个新的字符串
subSequence(int beginIndex,int endIndex):截取字符串中指定位置的字符组成一个新的字符串
replace(char oldChar,char newChar):将指定字符替换成另一个指定的字符
replaceAll(String regex,String replasement):用新的内容替换全部旧内容
replaceFirst(String regex,String replacement):替换首个满足条件的内容
lastIndexOf(String str):返回指定字符出现的最后一次的下标
contains(charSquence s):查看字符串中是否含有指定字符
concat(String str):在原有的字符串的基础上加上指定字符串
//统一展示效果
public class StringTest {
public static void main (String[] args) {
String str = "abc周子琦";
String str2 = " aaBcD ";
//获取字符串的长度
System.out.println(str.length());//6
//获取指定索引处的字符
System.out.println(str.charAt(3));//周
//获取str在字符串对象中第一次出现的索引
System.out.println(str.indexOf("b"));//1
//从start开始截取字符串
System.out.println(str.substring(3));//周子琦
//从start开始,到end结束截取字符串。包括start,不包括end
System.out.println(str.substring(1,4));//bc周
//比较字符串的内容是否相同
System.out.println(str.equals("abc周子琦"));//true
System.out.println(str.equals("abc"));//false
//比较字符串的内容是否相同,忽略大小写
System.out.println(str.equalsIgnoreCase("ABC周子琦"));//true
//判断字符串对象是否以指定的字符开头(区分大小写)
System.out.println(str.startsWith("a"));//true
System.out.println(str.startsWith("b"));//false
//判断字符串对象是否以指定的字符开头,参数toffset为指定从哪个下标开始
System.out.println(str.startsWith("b", 3));//false
System.out.println(str.startsWith("b", 1));//true
//判断字符串对象是否以指定的字符结尾
System.out.println(str.endsWith("琦"));//true
System.out.println(str.endsWith("子"));//false
//判断指定字符串是否为空
System.out.println(str.isEmpty());//false
//把字符串转换为字符数组
System.out.println(str.toCharArray());//abc周子琦
//把字符串转换为小写字符串
System.out.println(str2.toLowerCase());// aabcd
//把字符串转换为大写字符串
System.out.println(str2.toUpperCase());// AABCD
//去除字符串两端空格
System.out.println(str2.trim());//aaBcD
//去除字符串中指定的的字符,然后返回一个新的字符串
System.out.println(str.split("b"));//[Ljava.lang.String;@7852e922
//直接输出是对象,需要遍历输出
String array[]= str.split("b");
for(int i = 0; i < array.length; i++) {
System.out.print(array[i]);//ac周子琦
}
//截取字符串中指定位置的字符组成一个新的字符串
System.out.println(str.subSequence(1, 4));//bc周
//将指定字符替换成另一个指定的字符
System.out.println(str.replace("abc", "123"));//123周子琦
//用新的内容替换全部旧内容
System.out.println(str2.replaceAll("a", "1"));// 11BcD
//替换首个满足条件的内容
System.out.println(str2.replaceFirst("a", "1"));// 1aBcD
//返回指定字符出现的最后一次的下标
System.out.println(str2.lastIndexOf("a"));//3
//查看字符串中是否含有指定字符
System.out.println(str2.contains("c"));//true
System.out.println(str2.contains("d"));//false
//在原有的字符串的基础上加上指定字符串
System.out.println(str2.concat("周子琦"));// aaBcD 周子琦
}
}
注:在编写上面代码的时候发现subSequence和subString的结果一样,在好奇心的驱使下查到了:String.subSequence只是为了实现CharSequence接口上的同名方法而放在那里的,其行为与String.subString一样。
//subString底层代码
public String substring(int beginIndex) {
if (beginIndex < 0) {
throw new StringIndexOutOfBoundsException(beginIndex);
}
int subLen = value.length - beginIndex;
if (subLen < 0) {
throw new StringIndexOutOfBoundsException(subLen);
}
return (beginIndex == 0) ? this : new String(value, beginIndex, subLen);
}
public String substring(int beginIndex, int endIndex) {
if (beginIndex < 0) {
throw new StringIndexOutOfBoundsException(beginIndex);
}
if (endIndex > value.length) {
throw new StringIndexOutOfBoundsException(endIndex);
}
int subLen = endIndex - beginIndex;
if (subLen < 0) {
throw new StringIndexOutOfBoundsException(subLen);
}
return ((beginIndex == 0) && (endIndex == value.length)) ? this
: new String(value, beginIndex, subLen);
}
//subSequence底层代码
public CharSequence subSequence(int beginIndex, int endIndex) {
return this.substring(beginIndex, endIndex);
}
区别:substring和subSequence的返回类型不一样,substring返回的是String,subSequence返回的是实现了CharSequence接口的类,也就是说使用subSequence得到的结果,只能使用CharSequence接口中的方法。不过在String类中已经重写了subSequence,调用subSequence方法,可以直接向下转型为String对象。
11.抽象类必须要有抽象方法吗?
非必须
被abstract关键字修饰的类和方法为抽象类和抽象方法。
抽象类中可以没有抽象方法,但有抽象方法的类一定是抽象类。
抽象类不能被实例化,只有抽象类的非抽象子类才可以创建对象。
除非子类也是抽象类,否则非抽象子类必须重写抽象父类的抽象方法。
12.抽象类和普通类有哪些区别?
不同:
抽象类需要用abstract关键字修饰,而普通类不需要。
抽象类中可以有或没有抽象方法,而普通类一定没有抽象方法。
抽象类的非抽象子类必须重写抽象类中的抽象方法,而普通类可以选择重写父类方法或直接调用父类方法。
抽象类的存在是为了被继承,不能实例化,而普通类存在是为了实例化对象。
相同: 抽象类和普通类中都可以含有普通成员属性和普通成员方法。
抽象类和普通类都可以继承别的类或者被别的类继承。
抽象类和普通类的属性和方法都可以通过子类来调用。
13.抽象类能使用 final 修饰吗?
当然不能。
抽象类的职责就是用来被继承,但final修饰的类无法被继承,二者矛盾。
14.接口和抽象类有什么区别?
定义接口用interface关键字,定义抽象类用abstract关键字。
实现接口用implements关键字,继承抽象类用extends关键字。
接口是对行为的抽象,抽象类是对类的抽象。
接口可以多实现,而抽象类只能单继承。
接口没有构造方法,而抽象类有构造方法。
接口中只能定义常量,默认修饰符:public static final,而抽象类中可以定义变量或者常量。
当关注一个事物的本质的时候,用抽象类,当关注一个操作的时候,用接口。