Object類
java.lang.Object類是Java語言中的根類,每個類都使用 Object 作為超類, 所有的類都直接或間接繼承自 Object 類,所有物件(包括陣列)都實作這個類的方法,
native 本地方法
在Object類的原始碼中定義了native修飾的方法,native修飾的方法稱為本地方法,
特點
- 被native修飾的方法,非Java語言撰寫,是由C++語言撰寫,
- 本地方法在運行時期進入本地方法堆疊記憶體,本地方法堆疊是一塊獨立記憶體的區域,
- 本地方法的意義是和作業系統進行互動,
private static native void registerNatives();
static {
registerNatives();
}
當程式運行的時候,Object類會最先被加載到記憶體中,類進入記憶體后首先加載自己的靜態成員,static代碼塊中呼叫了本地方法registerNatives(),和作業系統進行互動,
toString方法
方法宣告:public String toString():回傳該物件的字串表示,
Object類toString()方法原始碼:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
原始碼分析:
getClass().getName()回傳類的全限定名字,hashCode()方法回傳int值,可以暫時理解為物件的記憶體地址,Integer.toHexString()將int型別的值轉成十六進制,- 因此呼叫物件的toString()方法將看到記憶體的地址值,
創建Person類,并呼叫方法toString()
public static void main(String[] args){
Person person = new Person();
String str = person.toString();
System.out.println(str);
System.out.println(person);
}
通程序式運行,得到結論,在輸出陳述句中列印物件,就是在呼叫物件的toString()方法,
重寫toString方法
由于toString方法回傳的結果是記憶體地址,而在開發中,記憶體地址并沒有實際的應用價值,經常需要按照物件的屬性得到相應的字串表現形式,因此也需要重寫它,
public class Person {
private String name;
private int age;
@Override
public String toString() {
return "Person"+name+":"+age;
}
// 省略構造器與Getter Setter
}
equals方法
方法宣告:public boolean equals(Object obj):指示其他某個物件是否與此物件“相等”,
Object類equals()方法原始碼:
public boolean equals(Object obj) {
return (this == obj);
}
原始碼分析:
- this是當前物件,哪個物件呼叫的equals方法就表示哪個物件,
- obj表述傳遞的引數,引數型別Object,可以傳遞任意型別物件,
- this==obj 比較兩個物件的記憶體地址是否相同
equals方法默認比較兩個物件的記憶體地址是否相同,相同則回傳true,
重寫equals方法
實際應用中,比較記憶體地址是否相同并沒有意義,我們可以定義物件自己的比較方式,比較物件中成員變數的值是否相同,需要對方法進行重寫,
需求:重寫equals()方法,比較兩個物件中姓名和年齡是否相同,如果姓名和年齡都相同回傳true,否則回傳false,
public class Person {
private String name;
private int age;
public boolean equals(Object obj){
//判斷兩個物件地址弱相同,即為同一個物件
if(this == obj)
return true;
//obj物件為空,無需比較,回傳false
if(obj == null)
return false;
//obj如果是Person型別物件,則強制轉換
if(obj instanceof Person){
Person person = (Person)obj;
//比較兩個物件的name屬性和age屬性,如果相等,回傳true
return this.name.equals(person.name) && this.age == person.age;
}
return false;
}
}
hashCode方法
方法宣告 public native int hashCode();
回傳一個哈希值
哈希值: 可以理解為一個唯一值 或 邏輯地址
呼叫hashCode, 比較兩物件的哈希, 相當于比較兩個物件的地址值
重寫hashCode, 比較兩物件的內容
若想確定內容是否真的相同 先比較兩物件的hashCode(因為比較數字較容易)
- 不同 說明兩物件內容一定不同
- 相同 不能說明兩物件一定相同 需要繼續比較 equals, 比較其內容
重寫hashCode方法
public int hashCode() {
// 成員變數是參考型別, 直接呼叫hashCode方法得到一個int值
// 成員變數是基本型別, 直接使用對應的值
int result = name != null ? name.hashCode() : 0;
result = 31 * result + age;
return result;
}
String類
java.lang.String 類代表字串,Java程式中所有的字串文字(例如"abc" )都可以被看作是實作此類的實體,
特點
1.字串不變:字串的值在創建后不能被更改,
String s1 = "abc";
s1 += "d";
System.out.println(s1); // "abcd"
// 記憶體中有"abc","abcd"兩個物件,s1從指向"abc",改變指向,指向了"abcd",
2.因為String物件是不可變的,所以它們可以被共享,
String s1 = "abc";
String s2 = "abc";
// 記憶體中只有一個"abc"物件被創建,同時被s1和s2共享,
3."abc" 等效于 char[] data=https://www.cnblogs.com/paopaoT/archive/2023/04/04/{'a' , 'b' , 'c' },但是底層原理是位元組陣列( byte[] )
例如:
String str = "abc";
相當于:
char data[] = {'a', 'b', 'c'};
String str = new String(data);
// String底層是靠字符陣列實作的,
構造方法
-
public String():初始化新創建的 String物件,以使其表示空字符序列, -
public String(char[] value):通過當前引數中的字符陣列來構造新的String, -
public String(byte[] bytes):通過使用平臺的默認字符集解碼當前引數中的位元組陣列來構造新的String, -
直接賦值的方式創建字串物件
構造舉例,代碼如下:
public class StringDemo01 {
public static void main(String[] args) {
//public String():創建一個空白字串物件,不含有任何內容
String s1 = new String();
System.out.println("s1:" + s1);
//public String(char[] chs):根據字符陣列的內容,來創建字串物件
char[] chs = {'a', 'b', 'c'};
String s2 = new String(chs);
System.out.println("s2:" + s2);
//public String(byte[] bys):根據位元組陣列的內容,來創建字串物件
byte[] bys = {97, 98, 99};
String s3 = new String(bys);
System.out.println("s3:" + s3);
//String s = “abc”; 直接賦值的方式創建字串物件,內容就是abc
String s4 = "abc";
System.out.println("s4:" + s4);
}
}
常用方法
獲取字串的長度
public int length () : 回傳此字串的長度
字串拼接
public String concat (String str) :將指定的字串連接到該字串的末尾,
String s12 = "abc".concat("bcd");
System.out.println("concat拼接后: " + s12);
字串 轉換為 字符陣列
public char[] toCharArray()
char[] strToChar = s4.toCharArray();
for (int i = 0; i < strToChar.length; i++) {
System.out.print(strToChar[i] + " ");
}
System.out.println();
字串 轉換為 位元組陣列
public byte[] getBytes()
byte[] strToByte = s2.getBytes();
for (int i = 0; i < strToByte.length; i++) {
System.out.print(strToByte[i] + " ");
}
獲取指定索引位置的元素
public char charAt (int index) :回傳指定索引處的 char值,
// 根據索引找字符, 若索引不存在, 拋出StringIndexOutOfBoundsException(字串索引越界例外)
String s = "I Love Java";
char c = s.charAt(0);
System.out.println(c);
for (int i = 0; i < s.length(); i++) {
System.out.print(s.charAt(i));
}
System.out.println();
獲取指定字符索引
public int indexOf (String str) :回傳指定子字串第一次出現在該字串內的索引,
int indexOf(String str, int fromIndex): 從指定索引位置開始查找
lastIndexOf(String str): 查找字符(串)最后一次出現的位置的索引
引數可以是char, int 或 String 型別
int index = s.indexOf('a');
System.out.println("字符a第一次出現的索引位置: " + index);
System.out.println("97對應的字符第一次出現的位置: " + s.indexOf(97) );
// 字符a第二次出現的索引位置
System.out.println("字符a第二次出現的索引位置: " + s.indexOf('a', index + 1) );
s1 = "abcaaaabcaab";
int abIndex = s1.indexOf("ab");
System.out.println("字串ab第一次出現的索引位置: " + abIndex);
int abIndex2 = s1.indexOf("ab", abIndex + 1);
// int abIndex2 = s1.indexOf("ab", abIndex + "ab".length());
System.out.println("字串ab第二次出現的索引位置: " + abIndex2);
System.out.println("字串ab第三次出現的索引位置: " + s1.indexOf("ab", abIndex2 + 1));
String path = "d:\\work\\abc\\1.txt";
// 查詢字符'\'最后一次出現的位置
System.out.println(path.lastIndexOf('\\'));
字串截取
substring(int startIndex): 從開始索引截取到末尾
substring(int startIndex, int endIndex): 截取字串中 [start, end)的字串
因為字串不可改變, 所以回傳一個新的字串
// 截取Love
String subLove = s.substring(2, 6);
System.out.println(subLove);
// 截取檔案名
int lastIndex = path.lastIndexOf('\\');
String fileName = path.substring(lastIndex + 1);
System.out.println(fileName);
去除字串兩端空格
public String trim()
String s13 = " ab c ";
System.out.println("原字串: " + s13);
System.out.println("去除兩端空格: " + s13.trim());
字串替換
public String replace (CharSequence target, CharSequence replacement) : 將與target匹配的字串使用replacement字串替換
public String replaceAll(String regex, String replacement): 將與regex(正則)匹配的字串使用replacement字串替換
區別: replaceAll支持正則運算式, 而replace不支持
String s14 = "張三-李四-王五-趙六";
String s15 = s14.replace("-", " ");
System.out.println("replace替換: " + s15);
s14 = "張三--------李四---王五--趙六";
String s16 = s14.replaceAll("-+", " ");
System.out.println("replaceAll替換: " + s16);
切割字串
public String[] split(String regex) :將此字串按照給定的regex(正則)拆分為字串陣列
String[] strArr = s14.split("-+");
for (String s : strArr) {
System.out.print(s + " ");
}
System.out.println();
// 以'.'分割ip地址
String myIp = "192.168.1.1";
// '.'在正則中表示匹配任意字符, '\'為轉義符, java要拿到'\', 需要對'\'轉義, 即'\\'
strArr = myIp.split("\\.");
for (String s: strArr) {
System.out.print(s + " ");
}
System.out.println();
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/549129.html
標籤:其他
上一篇:【踩坑系列】發送微信模板訊息回傳40165 invalid weapp pagepath
下一篇:一個簡單SpringMVC的實作
