数据结构(java)之串
Posted hsiaolung
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构(java)之串相关的知识,希望对你有一定的参考价值。
1. 串的逻辑结构
a) 定义:由0到多个字符组成的有限序列,使数据元素为单个字符的特殊线性表,串中连续的子序列叫子串,子串的位置为字串的第一个字符在串中的位置
b) 串的抽象数据类型
i. 数据元素:字符
ii. 数据结构:线性关系,除第一个字符外每个字符都有前驱,除最后一个字符外,每个字符都有后继
iii. 数据操作:求串长,串连接,串比较,求子串,串定位,串附加,穿插入,传删除
2. Java中的String类
a) 存储结构:String类采用顺序存储结构,源码中存储字符串内容的数组使final的,(private final char[] value)Java在创建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中的StringBuilder和StringBuffer
由于String字符串都是常量,不便于插入和删除,因此,当我们对字符串进行删除和插入时一般使用StringBuilder或StringBuffer,他们都是继承自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[] value)Java在创建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中的StringBuilder和StringBuffer
由于String字符串都是常量,不便于插入和删除,因此,当我们对字符串进行删除和插入时一般使用StringBuilder或StringBuffer,他们都是继承自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)之串的主要内容,如果未能解决你的问题,请参考以下文章