数据结构(java)之串

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+传入字符串长度。

猜你喜欢

转载自www.cnblogs.com/hsiaolung/p/9371104.html