目录
No4 StudyPoint: java.lang.String
4、[int] lastIndexOf(String str):
5、[String] substring(int beginIndex):
6、[boolean] startsWith(String str):
7、[boolean] endsWith(String str):
12、 [String] concat(String str):
13、 [boolean] contains(String str):
15、 [String] replace(char oldChar,char newChar):
17、[boolean] matches(String regex):
18、[String] split(String regex):
19、[String] replaceAll(String regex,String str):
关于String的StringBuilder和StringBuffer:
No1 StudyPoint: Object
java.lang.Object是所有类的父类,也就是说java中所有类都继承了Object,都可以使用Object的方法
Object类中有12个方法,但是有一个是private修饰的方法,还有3个是重载的wait()方法
所以实际上子类使用的只有9个方法。
常用方法:
① [String] toString():返回该对象的字符串表示,即地址值
② [int] hashCode():返回对象的哈希码值
③ [boolean] equals(Object o):判断其他某个对象与此对象是否相当,即地址值是否相同
---
Object clone():创建并返回此对象的一个副本
void finalize():当垃圾回收器不确定存在该对象的更多应用时,由对象的垃圾回收器调用此方法
---
线程相关:wait()、notify()、notifyAll();
反射相关:getClass();
No2 StudyPoint: toString()的重写
直接输出对象,默认调用Object的toString方法,展示对象的地址值
如果想要输出对象中的内容,可以重写
如果想看对象的属性值,不想看对象的地址值就重写toString()
否则可以不重写。重写后的字符串内容和格式都可以自定义
No3 StudyPoint: equals的使用
Object类中提供的equals方法比较的是两个对象的地址值,如果想要使用属性进行比较,则需要重写equals()。通常情况下,equals()会和hashCode()进行成对书写,因为在比较时需要计算属性的哈希码值。
equals()和==的区别?
① ==可以比较基本类型,也可以比较引用类型;equals只能比较引用类型。
② ==比较基本类型时比较的是值本身,比较引用类型比较的是地址值;
Object类中的equals()使用的是“==”,比较的是引用类型的地址值;
如果重写以后,按照重写时定义的规则进行比较。
No4 StudyPoint: java.lang.String
String是不可变的字符串对象。
String对象一旦被创建,内容不可修改,若改变则必须创建新对象;因为String内部维护的是一个被final修饰的char类型数组,用来保存字符串的所有字符。
String类重写了equals()方法,可以直接用来比较简单字符串是否相等。
【s1、s2】
采用字面值的方式创建字符串时,JVM首先会到字符串常量池中查找是否u才能在该字符串对象。
如果不存在,则在字符串常量值中创建这个对象,然后这个对象的地址返回给这个对象的引用(例如s1); 如果存在,则不创建新对象,直接将常量池中已经存在的对象地址返回,赋值给新的引用(例如s2)。
因此,s1和s2指向的是字符串常量值中的同一个对象,所以==比较的结果为true
String s1 = "123abc";
String s2 = "123abc";
System.out.println(s1 == s2);//true
System.out.println(s1.equals(s2));//true
【s3】
编译器有一个特点:
在编译的时候如果遇到一个计算表达式在编译期间就可以确定结果,那么编译器就会直接进行计算并编译到.class文件中, (比如 1+2 -> 3;"123"+"abc" -> 123abc),虚拟机在运行时会重用之前的123abc,不会创建新的对象。
String s3 = "123"+"abc";//编译器优化,直接拼接,不创建对象
System.out.println(s1 == s3);//true
【s5、s6】
当涉及到变量拼接时,编译器无法确定结果,所以不存在优化操作,直接创建新对象。
String s4 = "123";
String s5 = s4 + "abc";
System.out.println(s1 == s5);//false
String s6 = s1 +"!";
System.out.println(s1 == s6);//false
【s7】
使用new关键字创建字符串对象时, jvm会先在字符串常量值中查找是否有对应的字符串,如果有,则直接使用;如果没有,会在字符串常量池中创建一个,然后将这个字符串对象的地址值交付给堆中的String对象。
s7这个引用保存的是在堆中new出来的对象的地址值,而不是直接保存字符串常量池中的地址值,所以false。
String s7 = new String("123abc");
System.out.println(s1 == s7);//false
【汇总】
No5 StudyPoint: String中的方法
1、[int] length():
获取当前字符串的长度,即字符个数
问:数组有没有length方法?字符串有没有length属性?
答:数组有的是length属性,数组名.length表示数组的长度; 字符串有的是length()方法,字符串.length()表示获取当前字符串长度,返回一个int类型的值
String s = "BaoYang";
System.out.println(s.length());//输出:7
2、[char] charAt(int index):
获取指定索引处的字符
String s = "BaoYang";
System.out.println(s.charAt(3));//输出:Y
System.out.println(s.charAt(9));//数组下标越界异常
练习:判断字符串是否是回文串串:
String line = "上海自来水来自海上";
int count = 0;//定义计数器
for(int i = 0;i<line.length()/2;i++){
if(line.charAt(i) =