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