1. 程式人生 > >數據結構(java)之串

數據結構(java)之串

new 數據 -h har 3.0 數組復制 保存 元素 list

1. 串的邏輯結構

a) 定義:由0到多個字符組成的有限序列,使數據元素為單個字符的特殊線性表,串中連續的子序列叫子串,子串的位置為字串的第一個字符在串中的位置

b) 串的抽象數據類型

i. 數據元素:字符

ii. 數據結構:線性關系,除第一個字符外每個字符都有前驅,除最後一個字符外,每個字符都有後繼

iii. 數據操作:求串長,串連接,串比較,求子串,串定位,串附加,穿插入,傳刪除

2. Java中的String

a) 存儲結構:String類采用順序存儲結構,源碼中存儲字符串內容的數組使final的,(private final char[] valueJava在創建String對象時,采用不同的創建方式。這裏需要理解內存分配的三個術語:

i. 棧:由java虛擬機分配的用於保存線程執行的動作和數據引用的內存區域,一個線程會有一個對應的線程棧與之對應

ii. 堆:由java虛擬機分配的用於存儲對象的內存區域

iii. 常量池:在編譯的階段,在堆中分配出來一塊內存區域,用來存放常量和顯示聲明的字符串對象。

因此,java中的字符串引用存放在棧中,如果在編譯期已經定義好,則存放在常量池中,如果在運行期間出來的對象則存儲在堆中,對於通過equals方法比較相等的字符串在字符常量池中只有一個,在堆中可能有多個。

b) 構造方法

i. public String(char values[]) {

this.value=Arrays.copyOf(values, values.length);

}

該構造方法通過Arrays.copy()方法將傳入的字符數組復制到String類的字符數組中,當使用String str=”abc”;時會首先將”abc”拆分為字符數組傳入該構造方法中。

ii. public String(String original) {

this.value=original.value;

this.hash=original.hash;

}

當使用String str=new String(“abc”):時用到該構造方法,將str指向堆內存中字符串對象。

iii. public String(char value[],int offset,int count) {

if(offset<0||count<0||offset>value.length-count)

thrownew StringIndexOutOfBoundsException;

this.value=Arrays.copyOfRange(value, offset,offset+count);

}

該構造方法在String類的基本操作中用到,如求子串。

3. Java中的StringBuilderStringBuffer

由於String字符串都是常量,不便於插入和刪除,因此,當我們對字符串進行刪除和插入時一般使用StringBuilderStringBuffer,他們都是繼承自AbstractStringBuilder類,所以有相同的屬性和方法,區別主要是StringBuffer對方法加了同步鎖,是線程安全的。

a) 存儲結構:存儲的數組是可變的(private char[] value

b) 構造函數

i. public StringBuilder();無參構造函數會調用父類構造函數生成一個大小為16的字符數組,在使用過程中,如果字符數組長度超過16則重新分配內存,創建一個更大的字符數組,並將之前的數組拷貝過去

ii. public StringBuilder(int capacity);構造一個初始容量為capacity的空字符串

iii. public StringBuilder(String str);構造一個字符串並將傳入的String字符串內容復制過來,構造的字符串長度為16+傳入字符串長度。

1. 串的邏輯結構

a) 定義:由0到多個字符組成的有限序列,使數據元素為單個字符的特殊線性表,串中連續的子序列叫子串,子串的位置為字串的第一個字符在串中的位置

b) 串的抽象數據類型

i. 數據元素:字符

ii. 數據結構:線性關系,除第一個字符外每個字符都有前驅,除最後一個字符外,每個字符都有後繼

iii. 數據操作:求串長,串連接,串比較,求子串,串定位,串附加,穿插入,傳刪除

2. Java中的String

a) 存儲結構:String類采用順序存儲結構,源碼中存儲字符串內容的數組使final的,(private final char[] valueJava在創建String對象時,采用不同的創建方式。這裏需要理解內存分配的三個術語:

i. 棧:由java虛擬機分配的用於保存線程執行的動作和數據引用的內存區域,一個線程會有一個對應的線程棧與之對應

ii. 堆:由java虛擬機分配的用於存儲對象的內存區域

iii. 常量池:在編譯的階段,在堆中分配出來一塊內存區域,用來存放常量和顯示聲明的字符串對象。

因此,java中的字符串引用存放在棧中,如果在編譯期已經定義好,則存放在常量池中,如果在運行期間出來的對象則存儲在堆中,對於通過equals方法比較相等的字符串在字符常量池中只有一個,在堆中可能有多個。

b) 構造方法

i. public String(char values[]) {

this.value=Arrays.copyOf(values, values.length);

}

該構造方法通過Arrays.copy()方法將傳入的字符數組復制到String類的字符數組中,當使用String str=”abc”;時會首先將”abc”拆分為字符數組傳入該構造方法中。

ii. public String(String original) {

this.value=original.value;

this.hash=original.hash;

}

當使用String str=new String(“abc”):時用到該構造方法,將str指向堆內存中字符串對象。

iii. public String(char value[],int offset,int count) {

if(offset<0||count<0||offset>value.length-count)

thrownew StringIndexOutOfBoundsException;

this.value=Arrays.copyOfRange(value, offset,offset+count);

}

該構造方法在String類的基本操作中用到,如求子串。

3. Java中的StringBuilderStringBuffer

由於String字符串都是常量,不便於插入和刪除,因此,當我們對字符串進行刪除和插入時一般使用StringBuilderStringBuffer,他們都是繼承自AbstractStringBuilder類,所以有相同的屬性和方法,區別主要是StringBuffer對方法加了同步鎖,是線程安全的。

a) 存儲結構:存儲的數組是可變的(private char[] value

b) 構造函數

i. public StringBuilder();無參構造函數會調用父類構造函數生成一個大小為16的字符數組,在使用過程中,如果字符數組長度超過16則重新分配內存,創建一個更大的字符數組,並將之前的數組拷貝過去

ii. public StringBuilder(int capacity);構造一個初始容量為capacity的空字符串

iii. public StringBuilder(String str);構造一個字符串並將傳入的String字符串內容復制過來,構造的字符串長度為16+傳入字符串長度。

數據結構(java)之串