Object类
-
public int hashCode() : 返回该对象的哈希码值
注意: 哈希值是根据哈希算法计算出来的一个值,这个值和地址有关,但不是地址。可以暂时理解为地址
public getClass() 返回对应的类的名字 同一个类是同一个
-
public String toString() : 返回该对象的字符串表示 (最好子类重写)
通常默认情况下,返回的字符串,由类名(对象是该类的一个实例),at标记符“@”,和对此对象的哈希码的无符号十六进制表示组成。即它的值等于:
getClass().getName() + “@” + Integer.toHexString(hashCode())
Integer.toHexString(int i) 把一个整数转成一个十六进制表示的字符串
- 建议所有子类重写该方法
-
public boolean equals(Object obj) : 默认情况下指示两个对象是否指向是同一个对象(在同一个地址) 注意:有些子类会重写,可以比较值是否相同
== 基本类型:比较值是否相等; 引用类型:比较地址值是否相等
euals() : 只能比较引用类型
源码
public boolean equals(Object obj) { return (this == obj); }
比较地址一般意义不大,所以经常需要重写。
经常重写为比较成员变量值。
重写方法内部,注意成员变量值的引用,如果参数是Object,需要先向下转型
优化: 先判断对象是否是同一个 if ( this == obj ) { return true; }
-
优化: 先判断是否是对应的类 if ( !(obj instanceof *** ) ) { return false; }
或者 getClass()方法判断 if ( this.getClass() != obj.getClass() ) { return false; }
注意:String类的值比较不能用==来比较,而是equals()方法。已经被重写比较字符串值是否相同。
String类
特点:
- 字符值是一个实例,一个常量,一旦被创建就不能改变。拼接或者其他操作只是创建新对象,然后改变引用变量引用的位置。(不改变只是指对象实例不变,引用变量可变)
- 字符串直接赋值的方式是先到字符串常量池里面去找。如果有就直接返回,如果没有,就创建在常量池中再返回。
- 比较时需要用equals()方法(已经被重写)
- 判断功能,获取功能,转换功能,替换、比较、去除功能。
构造方法:
public String()
public String(byte[ ] bytes)
public String(byte[ ] bytes, int index, int length)
public String(char[ ] chars)
public String(char[ ] chars, int index, int length)
-
public String(original String)
-
String 构造时,构造方法与直接字面量赋值的区别:
String s1 = new String("Hello"); // s1指向堆内存的构造器地址,堆中构造器再指向字符串常量池地址(两个指针) String s2 = "Hello"; // s2直接指向字符串常量池的地址 String s3 = "Hello"; System.out.println(s3 == s1); //false System.out.println(s3 == s2); //true // s3 竟然直接指向s2指向的同一对象 String s4 = "world"; String s4 = "Helloworld"; s3 == s1 + s2; //false s3 == "Hello" + "world"; //true
- String引用变量来进行拼接+:先在字符串常量池创建空间,再拼接出新对象
- String字面常量来进行拼接+:先常量拼接起来,看看有没有这样的常量,如果有直接返回,否则就创建
-
常用方法:
一. String判断功能
- boolean equals(Object obj) 已经重写,可以比较字符串内容是否相同(区分大小写)
- boolean equalsIgnoreCase(String str) 比较字符串的内容是否相同,忽略大小写
- boolean contains(String str) 判断大字符串中包含小字符串
- boolean startsWith(String str) 判断字符串是否以某个指定的字符串结尾
- boolean isEmpty() 判断字符串是否为空字符串(对象存在,只是值为空)
二. String获取功能
- int length() 获取长度(字符个数)
- char charAt(int index) 获取指定位置的字符 //类似python索引
- int indexOf(int ch) 返回指定字符在字符串中第一次出现的索引
- int indexOf(String str) 返回指定字符串第一次出现的索引
- int indexOf(int ch,int fromIndex)
- int indexOf(String str, int fromIndex)
- int lastIndexOf(String str) 返回最后一次出现的索引
- String substring(int start) 从指定位置开始截取字符串,默认到末尾 //类似python切片
- String substring(int start,int end) 注意endIndex,不包含下边界end(包start不包end)
- 3,4,5,6 若找不到index,返回-1,不报错
三. String转换功能
byte[ ] getBytes() : 把字符串转换成字节数组
char[ ] toCharArray() : 把字符串转换成字符数组 (可以用来遍历字符串)
static String valueOf(char[ ] chs) : 把字符数组转成字符串
-
static String valueOf(int i) : 把int类型转换为字符串
注意:static String valueOf() 可以把任意类型的数据转换成字符串
String toLowerCase() : 返回转成小写的字符串 (产生新串,原字符串不变)
String toUpperCase():返回转成大写的字符串
四. 其他功能
1. 替换:把原字符串中的old全部转换为new,返回新的字符串
- String replace(char old, char new)
- String replace(String old, String new)
2. 去除字符串两端空格、回车、换行
- String trim()
3. 分割功能:
public String[ ] split(String str) :将此字符串按照给定的str分割成字符串数组
3. 按字典顺序比较两个字符串
- int compareTo(String str)
- int compareToIgnoreCasse(String str)
// 字符串自动转换成一个字符数组
// private final char value[]
public int compareTo(String anotherString) {
int len1 = value.length;
int len2 = anotherString.value.length;
int lim = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value;
int k = 0;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2; //若某个值不同,返回差值
}
k++;
}
return len1 - len2; // 若到末尾均相同,返回长度的差
}