常用API-2(字符串与数组)
1.字符串的生命與初始化主要有一下兩種情況:
s1:在常量區(qū)存放了一個(gè)“abc”字符串對(duì)象;
s2:引用常量區(qū)的對(duì)象,不創(chuàng)建新對(duì)象;
s3:在堆中創(chuàng)建新的對(duì)象;引用常量區(qū)的“abc”字符串對(duì)象。
s4:在堆中創(chuàng)建新的對(duì)象;引用常量區(qū)的“abc”字符串對(duì)象。
String的實(shí)現(xiàn)采用了Flyweight的設(shè)計(jì)模式。
String類是不可變類。一旦創(chuàng)建好了就不可修改,所以String對(duì)象可以被共享而且不會(huì)導(dǎo)致程序混亂。
String s=null; s是一個(gè)字符串引用,不知想任何一個(gè)字符串;
String s=" "; s是一個(gè)字符串類型的引用,指向另外一個(gè)字符串(空串)
?
new String("abc");創(chuàng)建了幾個(gè)對(duì)象?
一個(gè)或兩個(gè)。如果常量池原來(lái)有“abc”,那么只創(chuàng)建一個(gè)。如果沒(méi)有,那么就會(huì)創(chuàng)建兩個(gè)。
2.==、equals和hashCode()
1)==
用來(lái)比較兩個(gè)變量的值是否相等。
比較變量對(duì)應(yīng)的內(nèi)存中所存儲(chǔ)的數(shù)值是否相同。
比較兩個(gè)基本類型的數(shù)據(jù)或者兩個(gè)引用變量是否相等,只能用==。
- 基本類型:直接使用==比較;
- 引用類型:涉及兩塊內(nèi)存,對(duì)象本身(s)占用一個(gè)堆內(nèi)存,變量(new String())占用一塊內(nèi)存。變量s所對(duì)應(yīng)內(nèi)存中存儲(chǔ)的數(shù)值就是對(duì)象占用的那塊內(nèi)存的首地址。如果要比較兩個(gè)變量是否指向同一個(gè)對(duì)象,就要看這兩個(gè)變量所對(duì)應(yīng)內(nèi)存中的數(shù)值是否相等(這兩個(gè)變量是否指向同一個(gè)對(duì)象)。但是==無(wú)法實(shí)現(xiàn)對(duì)象內(nèi)容的比較。
2)equals
Object提供的方法之一。
Object中的equals(Object)直接使用==運(yùn)算符比較兩個(gè)對(duì)象。
在沒(méi)有覆蓋equals(Object)時(shí),它與==一樣,比較的是引用。
==不能被覆蓋,但是equals(Object)可以,可以通過(guò)覆蓋的方法讓它比較數(shù)據(jù)內(nèi)容。
String中的equals(Object)是用于比較兩個(gè)獨(dú)立對(duì)象內(nèi)容是否相同。
3)hashCode()
繼承于Object,用于鑒定兩個(gè)對(duì)象是否相等。
Object類總的hashCode()返回對(duì)象在內(nèi)存中地址轉(zhuǎn)換成的一個(gè)int值。
若沒(méi)有重寫(xiě)hashCode()則任何對(duì)象的hashCode()都是不相等的。
一般在覆蓋equals方法時(shí)也要覆蓋hashCode方法。否則就會(huì)違反Object.hashCode約定。
3.可對(duì)字符串操作的類String、StringBuffer、StringBuilder和StringTokenizer
| Character | 處理單個(gè)字符 | ? | ? | ? |
| String | 處理字符串 | 不可變 | 適合共享 | ? |
| StringBuffer | 處理字符串 | 可變 | 適合頻繁修改 | 多線程 |
| StringBuilder | 處理字符串 | 可變 | 頻繁修改 | 單線程 |
| StringTokenizer | 分割字符串 | 根據(jù)“ \t\n\r\f”分割(5種,有空格) | ? | ? |
實(shí)例化String時(shí),可利用構(gòu)造函數(shù)(String s1=new String("world");)進(jìn)行初始化,也可用賦值(String s="Hello";)初始化。
實(shí)例化StringBuffer時(shí),只能用構(gòu)造函數(shù)(StringBuffer s=new StringBuffer("Hello");)進(jìn)行初始化。
String字符串的修改原理:
- 首先創(chuàng)建一個(gè)StringBuffer;
- 其次調(diào)用StringBuffer的append();
- 最后調(diào)用StringBuffer的toString()返回結(jié)果。
以上代碼等價(jià)于
StringBuffer sb=new StringBuffer("Hello"); sb.append("World"); s=sb.toString();執(zhí)行效率低。
執(zhí)行效率方面:
StringBuilder最高,StringBuffer次之,String最低。
- 操作數(shù)據(jù)量比較小,用String;
- 單線程操作大量數(shù)據(jù),用StringBuffer;
- 多線程操作大量數(shù)據(jù),用StringBuilder.
由于?StringBuilder 相較于 StringBuffer 有速度優(yōu)勢(shì),所以多數(shù)情況下建議使用?StringBuilder 類。
然而由于 StringBuilder 的方法不是線程安全的(不能同步訪問(wèn)),在應(yīng)用程序要求線程安全的情況下,則必須使用?StringBuffer 類。
4.數(shù)組
具有相同類型的數(shù)據(jù)的集合,一般具有固定的長(zhǎng)度,并且在內(nèi)存中占據(jù)連續(xù)的空間。
(ArrayList就是動(dòng)態(tài)數(shù)組,也是一個(gè)對(duì)象。創(chuàng)建一個(gè)ArrayList對(duì)象,該對(duì)象存放在堆內(nèi)存中,且是一個(gè)內(nèi)存連續(xù)的內(nèi)存區(qū)域。)
一維數(shù)組的聲明方式:
type arrayName[] type[] arrayName- type既可以是基本的數(shù)據(jù)類型,也可以是類。
- 數(shù)組被創(chuàng)建后會(huì)根據(jù)數(shù)組存放的數(shù)據(jù)類型初始化成對(duì)應(yīng)的初始值。
- Java數(shù)組在定義時(shí),并不會(huì)給數(shù)組袁術(shù)分配存儲(chǔ)空間,因此[ ]中不需要指定數(shù)組的長(zhǎng)度。
定義數(shù)組且必須分配空間的方法為:
arrayName=new type[arraysize]數(shù)組初始化方法:
1.int[] a=new int[5];//默認(rèn)初始化為0 2.int[] a={1,2,3,4,5};使用時(shí)可以將數(shù)組的生命和初始化分開(kāi)寫(xiě)。
二維數(shù)組的聲明方法:
1) type arrayName[][]; 2) type[][] arrayName; 3) type[] arrayName[];注:聲明二維數(shù)組時(shí),其中的[ ]必須為空。
二維數(shù)組的初始化:
type arranName[][]={{c11,c12,c13,...}.{c21,c22,c23,...},{...}...};type arrayName[][]-new type[行數(shù)][列數(shù)]其中,二維數(shù)組的第二維長(zhǎng)度可以不同。
二維數(shù)組的訪問(wèn):
arrayName[行號(hào)][列號(hào)]原生類:未被實(shí)例化的類。
數(shù)組一般指實(shí)例化、被分配空間的類,不是原生類。
5.length屬性和length()
length屬性:數(shù)組的
length():字符串的
size():計(jì)算對(duì)象大小的。查看泛型中有多少個(gè)元素。
泛型:對(duì)Java語(yǔ)言的類型系統(tǒng)的一種擴(kuò)展,一直創(chuàng)建可以按類型進(jìn)行參數(shù)化的類,可以把類型參數(shù)看做是使用參數(shù)化類型時(shí)執(zhí)行的類型的一個(gè)占位符,就像方法的形式參數(shù)是運(yùn)行時(shí)傳遞的值的占位符一樣。
?
?
?
?
?
?
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的常用API-2(字符串与数组)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 常用API-1(Object类、Stri
- 下一篇: 常用API-3(System类、Math