一、Object类常用方法
Object类有12个成员方法,分别是clone()、finalize()、getClass() 、hashCode()、equals(Object)、toString()、notify()、notifyAll()、wait()、wait(long)、wait(long,int)及其构造函数。
1.clone()
b2就是b1的克隆体,但是地址值不一样。
public class A {
public static void main(String[] args) throws CloneNotSupportedException {
B b1=new B();
Object obj=b1.clone();
B b2=(B)obj;
System.out.println(b1==b2); //输出:false
}
}
class B implements Cloneable{
public Object clone()throws CloneNotSupportedException{
return super.clone();
}
}
2.finalize()
当对象的内存不再被使用时,GC在收集垃圾时就会调用finalize()这个方法.
public class A {
public static void main(String[] args) throws CloneNotSupportedException {
new B();
System.gc(); //强制进行垃圾回收
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
static class B extends Object{
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println("该对象以回收"); //此处正常输出,证明对象已被回收
}
}
}
3.getClass()
返回此 Object 的运行时类。用的是谁的构造函数,返回的就是谁的类型。
public class A {
public static void main(String[] args) throws CloneNotSupportedException {
B b = new B();
Class cls = b.getClass();
System.out.println(cls); //输出:class B
}
}
class B{}
4.hashCode()
返回该对象的哈希码值
hashCode的契约如下:
- 每当在Java应用程序的执行过程中多次调用这个方法时,hashCode方法必须返回相同的整数。在对象的equals比较中没有提供任何信息被修改。在一个应用程序的执行过程到相同程序的另一个执行过程中,这个整数不需要保持一致。
- 如果两个对象通过equals(Object)方法比较结果相等,那么在两个对象上调用hashCode方法生成的哈希码必须相同。
- 如果两个对象通过equals(Object)方法比较结果不相等,那么在两个对象上调用hashCode方法生成的哈希码也没有必要相同。但是,程序员应该知道,为不相等的对象生成不同的整数结果可以提高哈希表的性能。
只要是合理可行的,通过Object类定义的hashCode方法会为不同的对象生成不同的哈希码。(这通常通过把一个对象的内存地址转换成一个哈希码来实现,但是这种实现技术并不需要是由Java语言来实现)
public class A {
public static void main(String[] args) throws CloneNotSupportedException {
Object o = new Object();
int hashCode =o.hashCode();
System.out.println(hashCode); //输出:366712642
}
}
5.equals()
指示其他对象是否等同于这个对象。
equals方法在非空对象引用上实现等价关系:
- 自反性:对于任意非空引用值x,x.equals(x)会返回true
- 对称性:对于任意非空引用值x和y, x.equals(y)返回true, y.equals(x)也返回true
- 传递性:对于任意非空引用值x,y和z,如果x.equals(y)返回true, 且y.equals(z)返回true, 那么x.equals(z)也返回true
- 一致性:对于任意非空引用值x和y, 多次调用x.equals(y),要么一致的返回true,要么一致的返回false
- 对于任意非空引用值x,x.equals(null)返回false。
Object类的equals()方法在对象比较上实现最为可能性的等同关系。即,对于任意对于任意非空引用值x和y,当且仅当x和y引用同一个对象时(x == y返回true)返回true。
注意,每当equals()被重写时,hashCode()方法也需要被重写。所以为了维护hashCode()方法的契约,以equals()方法声明的相同对象必须拥有相同的哈希码(散列值)
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Person) {
Person p = (Person) obj;
return (this.name == name && this.age == age);
}
return false;
}
public static void main(String[] args) {
Person p1 = new Person("Danny", 21);
Person p2 = new Person("Danny", 21);
System.out.println(p1.equals(p2)); //输出:true,若equals和hashCode没有被重写,则会输出false
}
}
6.toString()
在Object类中定义toString()方法的时候返回对象的hashCode。若要将对象的属性格式化输出,则需要对该方法进行重写。
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person [age=" + age + ", name=" + name + "]";
}
public static void main(String[] args) {
Person p1 = new Person("Danny", 21);
System.out.println(p1); //输出:Person [age=21, name=Danny],若不重写toString方法,则会输出返回该对象的hashCode(Person@15db9742)
}
}
7.notify()、notifyAll()、wait()、wait(long)、wait(long,int)
都是与多线程相关的方法,具体可以参考文章 如何使用wait(), notify() 和 notifyAll()
- wait:释放同步锁,让线程进入等待阻塞状态;没有时间参数时,一直等待,直到其他线程调用notify唤醒它进入就绪状态继续执行;带有时间参数时,一直没有在该对象调用notify唤醒,当超过指定的时间量时自动进入就绪状态;必现拥有对象的同步锁才能调用wait方法,即wait方法只能在synchronized代码块中调用;wait释放锁之后其他线程有机会执行该对象的同步方法。
- notify:通知一个等待该对象的同步锁的线程,进入可就绪状态
- notifyall:通知所有等待该对象的同步时线程,进入可就绪状态
- notify,notifyall并不释放锁,synchronized 方法执行完自动释放锁。
二、String类的常用方法
1.valueOf() 基本类型转换为字符串
String s1 = String.valueOf(99.99);
System.out.println(s1); //double类型转string类型
2.length() 获取字符串的长度。
String str = new String("abc");
int len = str.length();
System.out.println(len); //3
3.charAt(int index) 获取字符串某一位置的字符
String str = new String("abcde");
char ch = str.charAt(3);
System.out.println(ch); //d
4.substring() 获取字符串的子串
public String substring(int beginIndex)
该方法从beginIndex位置起, 从当前字符串中取出剩余的字符作为一个新的字符串返回。public String substring(int beginIndex, intendIndex)
该方法从beginIndex位置起,从当前字符串中取出到endIndex-1位置的字符作为一个新的字符串返回。
String str1 = newString("asdfzxc");
String str2 = str1.substring(2);//str2 ="dfzxc"
String str3 = str1.substring(2,5);//str3 ="dfz"
5.compareTo() 字符串的比较
-
public int compareTo(String str)
该方法是对字符串内容按字典顺序进行大小比较,通过返回的整数值指明当前字符串与参数字符串的大小关系。 若当前对象比参数大则返回正整数,反之返回负整数,相等返回0。 -
public int compareToIgnoreCase (String str)
与compareTo方法相似,但忽略大小写。 -
public boolean equals(Object obj)
比较当前字符串和参数字符串,在两个字符串相等的时候返回true,否则返回false。 -
public boolean equalsIgnoreCase(String str)
与equals方法相似,但忽略大小写。
String str1 = new String("abc");
String str2 = new String("ABC");
int a = str1.compareTo(str2); //a=32
int b = str1.compareToIgnoreCase(str2); //b=0
boolean c = str1.equals(str2); //c=false
boolean d =str1.equalsIgnoreCase(str2); //d=true
6.split(String str)将字符串分割成字符串数组
String str = "ab cd ef g";
String[] str1 = str.split(" ");
for (int i = 0; i < str1.length; i++) {
System.out.println(str1[i]); //依次输出ab cd ef g
}
7.replace 字符串替换
-
public String replace(char oldChar, char newChar)
用字符newChar替换当前字符串中所有的oldChar字符, 并返回一个新的字符串。 -
public String replaceFirst(String regex,String replacement)
该方法用字符replacement的内容替换当前字符串中遇到的 第一个和字符串regex相匹配的子串,应将新的字符串返回。 -
public String replaceAll(String regex,String replacement)
该方法用字符replacement的内容替换当前字符串中遇到的所有和字符串regex相匹配的子串,应将新的字符串返回。
String str = "112233114";
String str1 =str.replace("1","0");
String str2 =str.replaceFirst("11","88");
String str3 =str.replaceAll("11","88");
System.out.println(str1); //002233004
System.out.println(str2); //882233114
System.out.println(str3); //882233884
8.indexOf() 查找子串在字符串中的位置
-
indexOf(int ch)
返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。 -
indexOf(int ch, int fromIndex)
返回从 fromIndex 位置开始查找指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。 -
indexOf(String str)
返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。 -
indexOf(String str, int fromIndex)
返回从 fromIndex 位置开始查找指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
String string = "aaa456ac";
//查找指定字符是在字符串中的下标。在则返回所在字符串下标;不在则返回-1.
System.out.println(string.indexOf("b")); // 返回结果:-1,"b"不存在
// 从第四个字符位置开始往后继续查找,包含当前位置
System.out.println(string.indexOf("a",3));//返回结果:6
// 从头开始查找是否存在指定的字符
System.out.println(string.indexOf(99));//返回结果:7
System.out.println(string.indexOf('c'));//返回结果:7
//从fromIndex查找ch,这个是字符型变量,不是字符串。字符a对应的数字就是97。
System.out.println(string.indexOf(97,3));/返回结果:6
System.out.println(string.indexOf('a',3));//返回结果:6
9.trim() 字符串两端去空格
10.toLowerCase() 和toUpperCase() 字符串中字符的大小写转换