java中創(chuàng)建類和對(duì)象的方式
1.自定義類,然后通過自定義的類創(chuàng)建對(duì)象洪燥。
2.sun提供了很多的類給我使用磕秤,我們只需要認(rèn)識(shí)這些類乳乌,我們就可以通過這些類創(chuàng)建對(duì)象了。
Object類:
Object類是所有類的終極父類市咆。 任何一個(gè)類都繼承了Object類汉操。
Object類常用的方法:
- toString(); 返回該對(duì)象的字符串表示。 返回一個(gè)字符串用于描述該對(duì)象的蒙兰。 重寫toString之后磷瘤,我們直接輸出一個(gè)對(duì)象的時(shí)候,就會(huì)輸出符合我們所需求的格式數(shù)據(jù)癞己。
2.equals(Object obj) 用于比較兩個(gè)對(duì)象的內(nèi)存地址,判斷兩個(gè)對(duì)象是否為同一個(gè)對(duì)象梭伐。
注意:"=="用于比較引用數(shù)據(jù)類型時(shí)痹雅,比較的是兩個(gè)對(duì)象的內(nèi)存地址,equals方法默認(rèn)情況下比較的也是兩個(gè)對(duì)象的內(nèi)存地址, 但是String類重寫了Object的equals方法糊识,方法內(nèi)部是將字符串轉(zhuǎn)換為字符數(shù)組绩社,比較每一個(gè)字符是否相同,一旦不相同就返回flase赂苗,相同就返回true愉耙。所以兩個(gè)字符串比較建議使用equals方法
3.hashCode() 返回該對(duì)象的哈希碼值(大家可以把哈希碼就 理解成是對(duì)象的內(nèi)存地址)
java中的規(guī)范:一般我們重寫了一個(gè)類的equals方法,我們都會(huì)重寫它的hashCode方法拌滋。
java是開源....源代碼公開...
查看源代碼的方式:
1. 按住crt(mac是Command)鍵朴沿,單擊查看源代碼
2.把光標(biāo)移動(dòng)到你需要查看的代碼按住fn + F3
```
Java中toString方法作用
>Object類具有一個(gè)toString()方法,你創(chuàng)建的每個(gè)類都會(huì)繼承該方法败砂。它返回對(duì)象的一個(gè)String表示赌渣,并且對(duì)于調(diào)試非常有幫助。然而對(duì)于默認(rèn)的toString()方法往往不能滿足需求昌犹,需要覆蓋這個(gè)方法坚芜。
toString()方法將對(duì)象轉(zhuǎn)換為字符串
public class Person {
String name;
String address;
int id;
public Person(String name, String address, int id) {
this.name = name;
this.address = address;
this.id = id;
}
/// 重寫toString() 方法
@Override
public String toString() {
return "name ==" + name + "address ==" + address + "id == " + id;
}
}
/// 打印person對(duì)象
public static void main(String[] args) {
Person person = new Person("sey", "北京", 11111);
System.out.println(person);
}
/// 重寫toString()方法后,打印結(jié)果: name ==seyaddress ==北京id == 11111
/// 未重寫toString()方法斜姥,打印結(jié)果為: Person@15db9742
Java中toString()方法和Objective-C中的description方法作用相同鸿竖,比如oc中重寫description方法,在打印對(duì)象時(shí)铸敏,可以將對(duì)象的屬性打印出來
-
(NSString *)description {
return [NSString stringWithFormat:@"name==%@, address==%@", self.name, self.address];
}
- ###String類:
>String類是一個(gè)常量缚忧,是不可改變的對(duì)象,這也就是說每次對(duì) String 類型進(jìn)行改變的時(shí)候其實(shí)都等同于生成了一個(gè)新的 String 對(duì)象杈笔,然后將引用連接到新的對(duì)象
兩種字符串創(chuàng)建方式:
1.```String str2 = "string";```
2.```String str3 = new String("string");```
判斷一下字符串是否相同
public static void main(String[] args) {
String str1 = "string";
String str2 = "string";
String str3 = new String("string");
String str4 = new String("string");
System.out.println("str1是否等于str3?" + (str1 == str2));
System.out.println("str2是否等于str3?" + (str2 == str3));
System.out.println("str3是否等于str4?" + (str3 == str4));
System.out.println("str1是否等于str3?" + (str1.equals(str2)));
}
/// 打印結(jié)果
/*
str1是否等于str3?true
str2是否等于str3?false
str3是否等于str4?false
str1是否等于str3?true
*/
原因(需要先了解下Java中字符串的兩種創(chuàng)建方式):
第一種創(chuàng)建字符串的方式:```String str1 = "string";```這種方式創(chuàng)建字符串時(shí)搔谴,jvm首先檢查```方法區(qū)```的 ```字符串常量池```中是否存在該字符串的對(duì)象,如果存在桩撮,就不會(huì)在字符串常量池中創(chuàng)建了敦第,如果```字符串常量池```中不存在該字符串峰弹,那么就會(huì)在```字符串常量池```中創(chuàng)建該對(duì)象,并返回該對(duì)象的內(nèi)存地址芜果。
第二種創(chuàng)建字符串的方式:通過構(gòu)造方法```String str3 = new String("string");```這種方式創(chuàng)建字符串時(shí)鞠呈,jvm首先檢測(cè)```字符串常量池```中是否存在該字符串的對(duì)象,如果存在右钾,就不再在```字符串常量池```中創(chuàng)建該對(duì)象了蚁吝,如果不存在,那么就會(huì)在```字符串常量池```中創(chuàng)建該字符串的對(duì)象舀射,然后把```字符串常量池```中的該字符串拷貝到```堆內(nèi)存``窘茁,然后返回```堆內(nèi)存```中這個(gè)字符串對(duì)象的內(nèi)存地址
測(cè)試1:
```String str = new String("string");```會(huì)創(chuàng)建多少個(gè)對(duì)象
答案: 2 個(gè),會(huì)在```字符串常量池```創(chuàng)建一個(gè)脆烟,再拷貝到堆內(nèi)存1個(gè)山林,共2個(gè)。
測(cè)試2:
```String str = ""; str = null ```
判斷```str.isEmpty()```放true還是flase
答案:報(bào)空指針錯(cuò)誤```java.lang.NullPointerException```
- 手動(dòng)實(shí)現(xiàn)String類trim()函數(shù) -- 去掉字符串首尾的空格
// 自己實(shí)現(xiàn)trim()函數(shù)邢羔,去除字符串首尾的空格
public static String customTrim(String str) {
// 先將字符串轉(zhuǎn)換為字符數(shù)據(jù)
char[] arr = str.toCharArray();
// 定義兩個(gè)索引驼抹,讓其一開始記錄字符數(shù)組的首位索引,然后遍歷字符數(shù)組記錄字符數(shù)組中的非空格開始的索引和非空格結(jié)尾的索引
int startIndex = 0;
int endIndex = arr.length - 1;
for (int i = 0; i < arr.length; i++) {
if (arr[startIndex] == ' ') {
startIndex++;
} else {
break;
}
if (arr[endIndex] == ' ') {
endIndex--;
} else {
break;
}
}
// 根據(jù)開始和結(jié)束索引截取字符串
return str.substring(startIndex, endIndex + 1);
}
/// 調(diào)用
public static void main(String[] args) {
String string = " 今天天氣 真好啊 ";
string = customTrim(string);
System.out.println(string);
}
// 打印結(jié)果已去除首尾的空格: 今天天氣 真好啊
截取一個(gè)路徑的文件名
// 截取一個(gè)路徑的文件名
public static String getFileName(String path) {
// 取出路徑中最后一個(gè)\的索引值拜鹤,注意: 單\是的意思框冀,通過單\判斷,需要些雙\\
int index = path.lastIndexOf("/");
// 截取字符串
return path.substring(index + 1);
}
public static void main(String[] args) {
String path = "/Users/mofeini/Desktop/subcate.plist";
String fileName = getFileName(path);
System.out.println(fileName);
}
反轉(zhuǎn)字符串中的字符
// 反轉(zhuǎn)字符串
public static String InvertString(String string) {
// 將字符串轉(zhuǎn)換為字符數(shù)組敏簿,遍歷這個(gè)數(shù)組
char[] arr = string.toCharArray();
for (int startIndex = 0, endIndex = arr.length - 1; startIndex<endIndex; startIndex++, endIndex--){
char temp = arr[startIndex];
arr[startIndex] = arr[endIndex];
arr[endIndex] = temp;
}
//將字符數(shù)組轉(zhuǎn)換為字符串
String string2 = new String(arr);
return string2;
}
統(tǒng)計(jì)子字符串在一個(gè)字符串中出現(xiàn)的次數(shù)
// 統(tǒng)計(jì)子字符串在一個(gè)字符串中出現(xiàn)的次數(shù)
public static int getCount(String string, String subStr) {
int count= 0; // 記錄查找到子串的次數(shù)
int fromIndex = 0; // 記錄從什么位置開始查找明也,只要查找到一個(gè),就讓fromIndex+=子串的長(zhǎng)度
// 只有 能找到子串就接著找惯裕,找不到就會(huì)返回-1 結(jié)束語(yǔ)句
while ((fromIndex = string.indexOf(subStr, fromIndex)) != -1) {
count++;
fromIndex += subStr.length();
}
return count;
}
String的特點(diǎn):字符串是常量诡右,一旦創(chuàng)建就不能修改了。
如果要頻繁修改字符串的內(nèi)容轻猖,建議使用字符串緩沖類(StringBuffer)
- ###StringBuffer其實(shí)就是一個(gè)存儲(chǔ)字符的容器帆吻。
StringBuffer 底層依賴一個(gè)字符數(shù)組才能存儲(chǔ)字符數(shù)據(jù)的,該字符數(shù)組默認(rèn)的初始容量為16咙边,如果字符數(shù)組的容量不夠使用猜煮,自動(dòng)增長(zhǎng)1倍+2
StringBuffer添加字符串a(chǎn)ppend()
StringBuffer sBuffer = new StringBuffer();
sBuffer.append("11");
StringBuffer容器的具備 的行為:
String
增加
append(boolean b) 可以添加任意類型 的數(shù)據(jù)到容器中
insert(int offset, boolean b) 指定插入的索引值,插入對(duì)應(yīng) 的內(nèi)容败许。
刪除
delete(int start, int end) 根據(jù)指定的開始與結(jié)束的索引值刪除對(duì)應(yīng)的內(nèi)容王带。
deleteCharAt(int index) 根據(jù)指定 的索引值刪除一個(gè)字符。
修改
replace(int start, int end, String str) 根據(jù)指定 的開始與結(jié)束索引值替代成指定的內(nèi)容市殷。
reverse() 翻轉(zhuǎn)字符串緩沖類的內(nèi)容愕撰。 abc--->cba
setCharAt(int index, char ch) 把指定索引值的字符替換指定的字符。
substring(int start, int end) 根據(jù)指定的索引值截取子串。
ensureCapacity(int minimumCapacity) 指定StringBuffer內(nèi)部的字符數(shù)組長(zhǎng)度的搞挣。
查看
indexOf(String str, int fromIndex) 查找指定的字符串第一次出現(xiàn)的索引值,并且指定開始查找的位置带迟。
lastIndexOf(String str)
capacity() 查看當(dāng)前字符數(shù)組的長(zhǎng)度。
length()
charAt(int index)
toString() 把字符串緩沖類的內(nèi)容轉(zhuǎn)成字符串返回囱桨。
StringBuffer 與 StringBuilder的相同處與不同處:
相同點(diǎn):
1. 兩個(gè)類都是字符串緩沖類仓犬。
2. 兩個(gè)類的方法都是一致的。
不同點(diǎn):
1. StringBuffer是線程安全的,操作效率低 舍肠,StringBuilder是線程非安全的,操作效率高搀继。
2. StringBuffer是jdk1.0出現(xiàn) 的,StringBuilder 是jdk1.5的時(shí)候出現(xiàn)的翠语。
StringBuilder與StringBuffer 叽躯,通常應(yīng)該優(yōu)先用 StringBuilder類,因?yàn)樗С炙邢嗤牟僮骷±ǎ捎谒粓?zhí)行同步点骑,所以速度更快。
在大部分情況下的優(yōu)先級(jí)使用们童,StringBuilder>StringBuffer>String
當(dāng)final用來修飾String和StringBuffer時(shí)的區(qū)別
>要知道畔况,當(dāng)final用來修飾的時(shí)候鲸鹦,變量是不可變的慧库,往細(xì)了說,是變量所連接的內(nèi)存地址是不可變的馋嗜。
因此齐板,當(dāng)String類被修飾時(shí),此時(shí)的string就是一個(gè)常量葛菇,他的地址不可變甘磨,因此值不能改變;
但當(dāng)用來修飾StringBuffer類時(shí)眯停,卻可以調(diào)用它的append方法济舆,究其機(jī)理是StringBuffer類被創(chuàng)造可以改變他的內(nèi)存地址,因此他的地址在每次調(diào)用append時(shí)都可以改變,這個(gè)變量也隨之可變莺债。