数据结构之串—字符串而不是羊肉串

简介: 数据结构之串—字符串而不是羊肉串

1 串的介绍

概念:串是由零个或多个字符串组成的有限序列,又名叫字符串。

例如:str = “abc”,当字符串由零个字符组成时,被称为空串,即 str = null

2 字符串的比较

说到字符串的比较,想到的只有“==”,其实字符串也可以使用"<","<=",">=",">"等符号来比较,当然使用这些符号来比较时主要是根据字符串中每个字符的ASCII来比较,再举个例子:

String str1 = "abc";
String str2 = "abcd";
String str3 = "abb";
// str1对应的ASCII是 97+98+99
// str2对应的ASCII是 97+98+99+100
// str3对应的ASCII是 97+98+98
//因此,三个字符串比较时结果为 str2 > str1 > str3

3 Java中字符串(String)的理解和使用

3.1 数据结构

3.2 String类
public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    ......
}

首先String是一个带有final修饰的类,因此它不可以被继承,一旦实例化就是不可变的

3.3 构造方法
//空构造方法,默认为 “”
public String() {
    this.value = "".value;
}
//实例化String,包括值和哈希值
public String(String original) {
    this.value = original.value;
    this.hash = original.hash;
}
//将char数组转为字符串
public String(char value[]) {
    this.value = Arrays.copyOf(value, value.length);
}
//将char数组以索引形式转为String
public String(char value[], int offset, int count) {
    if (offset < 0) {
        throw new StringIndexOutOfBoundsException(offset);
    }
    if (count <= 0) {
        if (count < 0) {
            throw new StringIndexOutOfBoundsException(count);
        }
        if (offset <= value.length) {
            this.value = "".value;
            return;
        }
    }
    // Note: offset or count might be near -1>>>1.
    if (offset > value.length - count) {
        throw new StringIndexOutOfBoundsException(offset + count);
    }
    this.value = Arrays.copyOfRange(value, offset, offset+count);
}
//将byte数组转为字符串
public String(byte bytes[]) {
    this(bytes, 0, bytes.length);
}
//将StringBuffer转为String(线程安全)
public String(StringBuffer buffer) {
    synchronized(buffer) {
        this.value = Arrays.copyOf(buffer.getValue(), buffer.length());
    }
}
//将StringBuffer转为String
public String(StringBuilder builder) {
    this.value = Arrays.copyOf(builder.getValue(), builder.length());
}
//还有几个构造方法在这里就不做讲解啦......
3.4 常用方法
3.4.1 length()

返回字符串长度,包括空格

public int length() {
    return value.length;
}
3.4.2 isEmpty()

判断字符串是否为空

public boolean isEmpty() {
    return value.length == 0;
}
3.4.3 getBytes()

将字符串转换为byte数组

public byte[] getBytes() {
    return StringCoding.encode(value, 0, value.length);
}
3.4.4 equals(Object)

将字符串和任意类型作比较

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = value.length;
        if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}
3.4.5 equalsIgnoreCase(String)

将两个字符串忽略大小写比较

public boolean equalsIgnoreCase(String anotherString) {
    return (this == anotherString) ? true
            : (anotherString != null)
            && (anotherString.value.length == value.length)
            && regionMatches(true, 0, anotherString, 0, value.length);
}
3.4.6 indexOf(int)

根据索引查看字符串中单个字符

public int indexOf(String str) {
    return indexOf(str, 0);
}
3.4.7 substring(int,int)

根据索引范围截取字符串

public String substring(int beginIndex, int endIndex) {
    if (beginIndex < 0) {
        throw new StringIndexOutOfBoundsException(beginIndex);
    }
    if (endIndex > value.length) {
        throw new StringIndexOutOfBoundsException(endIndex);
    }
    int subLen = endIndex - beginIndex;
    if (subLen < 0) {
        throw new StringIndexOutOfBoundsException(subLen);
    }
    return ((beginIndex == 0) && (endIndex == value.length)) ? this
            : new String(value, beginIndex, subLen);
}
3.4.8 split(String)

根据某个字符串将该字符串变分为字符串数组

public String[] split(String regex) {
    return split(regex, 0);
}
3.4.9 toLowerCase()和toUpperCase()

将字符串全部变为小写或大写

3.4.10 trim()

将字符串两侧的空格删除

public String trim() {
    int len = value.length;
    int st = 0;
    char[] val = value;    /* avoid getfield opcode */
    while ((st < len) && (val[st] <= ' ')) {
        st++;
    }
    while ((st < len) && (val[len - 1] <= ' ')) {
        len--;
    }
    return ((st > 0) || (len < value.length)) ? substring(st, len) : this;
}

4 传统的字符串模式匹配方法

/**
 * 经典字符串模式匹配
 *
 * @return
 */
public static int strcmp1() {
    final String source = "ABCDEFG";
    final String pattern = "BCD";
    char[] s = source.toCharArray();
    char[] p = pattern.toCharArray();
    int i = 0;
    int j = 0;
    if (source.length() < pattern.length()) {
        //如果主串长度小于模式串,直接返回-1,匹配失败
        return -1;
    } else {
        while (i < source.length() && j < pattern.length()) {
            //如果i,j位置上的字符匹配成功就继续向后匹配
            if (s[i] == p[j]) {
                ++i;
                ++j;
            } else {
                //i回到主串上一次开始匹配下一个位置
                i = i - (j - 1);
                //j重置 模式串重新进行匹配
                j = 0;
            }
        }
        if (j == pattern.length()) {
            //匹配成功
            return i - j;
        } else {
            //匹配失败
            return -1;
        }                
    }
}

5 KMP算法进行字符串模式匹配

/**
 * KMP算法模式匹配
 *
 * @return
 */
public static int strcmp2() {
    final String source = "ABCDEFG";
    final String pattern = "BCD";
    int i = 0;
    int j = 0;
    char[] s = source.toCharArray();
    char[] p = pattern.toCharArray();
    int[] next = getNext(p);
    while (i < s.length && j < p.length) {
        if (j == -1 || s[i] == p[j]) {
            ++i;
            ++j;
        } else {
            //如果j != -1且当前字符匹配失败,则令i不变,
            //j = next[j],即让pattern模式串右移j - next[j]个单位
            j = next[j];
        }
    }
    if (j == p.length) {
        return i - j;
    } else {
        return -1;
    }
}
private static int[] getNext(char[] p) {
    int[] next = new int[p.length];
    int k = -1;
    int j = 0;
    next[0] = -1;
    while (j < p.length - 1) {
        if (k == -1 || p[j] == p[k]) {
            ++k;
            ++j;
            next[j] = k;
        } else {
            k = next[k];
        }
    }
    return next;
}

完~

相关文章
|
6月前
|
XML JSON NoSQL
Redis的常用数据结构之字符串类型
Redis的常用数据结构之字符串类型
56 0
|
3月前
|
存储 缓存 NoSQL
redis数据结构-字符串
redis数据结构-字符串
35 1
|
8天前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
29 6
|
5月前
|
存储 NoSQL Redis
Redis系列学习文章分享---第十六篇(Redis原理1篇--Redis数据结构-动态字符串,insert,Dict,ZipList,QuickList,SkipList,RedisObject)
Redis系列学习文章分享---第十六篇(Redis原理1篇--Redis数据结构-动态字符串,insert,Dict,ZipList,QuickList,SkipList,RedisObject)
83 1
|
5月前
|
存储 JavaScript 前端开发
JavaScript中的对象是数据结构,存储键值对,键为字符串,值可为任意类型,包括函数(作为方法)
【6月更文挑战第25天】JavaScript中的对象是数据结构,存储键值对,键为字符串,值可为任意类型,包括函数(作为方法)。
40 2
|
5月前
数据结构 字符串 (第6天)
数据结构 字符串 (第6天)
|
5月前
|
存储 算法 Java
Java数据结构与算法:用于高效地存储和检索字符串数据集
Java数据结构与算法:用于高效地存储和检索字符串数据集
|
6月前
题目----数据结构线性表----字符串逆序
题目----数据结构线性表----字符串逆序
33 1
|
5月前
|
算法 Java
Java数据结构与算法:字符串匹配算法之暴力匹配
Java数据结构与算法:字符串匹配算法之暴力匹配
|
5月前
|
算法 Java
Java数据结构与算法:字符串匹配算法之KMP算法
Java数据结构与算法:字符串匹配算法之KMP算法