美文网首页
java字符串相关知识

java字符串相关知识

作者: 水煮鱼又失败了 | 来源:发表于2020-12-06 09:36 被阅读0次

    本文整理下java中字符串的相关知识,持续更新。

    基于jdk版本:jdk8

    1 基本知识

    1.1 String是否是基本类型?

    String不属于基本类型,String是jdk包中的一个,类路径:java.lang.String

    java中的8种基本数据类型:

    byte(1个字节,8位),short(2个字节,16位),int(4个字节,32位),long(8个字节,64位),float(4个字节,32位),double(8个字节,64位),boolean,char

    1.2 创建String的方式

    (1)使用字面值(双引号)创建

    String str="abc";
    

    采用双引号的方式创建字符串,JVM先去字符串池中查找是否存在abc这个对象。

    如果字符串池中不存在此对象,在字符串池中创建abc这个对象,然后将池中对象abc引用地址传给字符串变量strstr指向字符串池中的对象abc;如字符串池中已存在,则不再创建对象,直接将池中对象abc引用地址传给字符串变量str

    通过这种方式创建string时,如果字符串内容一样,则定义的多个字符串变量,对应的字符串池中的引用地址一致。如下:

    String str = "abc";
    String str1 = "abc";
    System.out.println(str == str1);
    

    输出结果如下:

    true
    

    (2)使用new关键字创建

    String str = new String("abc");
    

    采用new关键字创建字符串abc,jvm先去字符串池中查找是否有abc这个对象,如字符串池中没有,则先在字符串池中创建abc这个对象,然后在堆上创建abc这个对象,将堆上创建的abc这个对象的引用地址传给字符串变量str;如字符串池中已有abc这个对象,则在堆上创建abc这个对象,将堆上创建的abc这个对象的引用地址传给字符串变量str

    采用new创建字符串时,每次都会在堆上创建新的对象,字符串变量均指向堆上新的对象。如下:

    String str = new String("123");
    String str1 = new String("123");
    System.out.println(str == str1);
    

    输出结果如下:

    false
    

    1.3 String、StringBuilder、StringBuffer之间的关系

    String是final修饰的,String对象的值是不可更改,每次对String对象进行更改,都会生成新的String对象。对String对象进行大量操作,将会生成大量的String对象,造成大量的内存空间浪费。

    StringBuilder和StringBuffer内部设有字符数组,适用于对String进行大量更改不会生成新的String对象。

    StringBuilder非线程安全,StringBuffer是线程安全的。StringBuilder比StringBuffer有速度优势,绝大多数情况下建议使用StringBuilder

    2 常用工具类

    开发过程中,对字符串进行相关操作, 建议使用字符串工具类。

    2.1 commons-lang3

    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.11</version>
    </dependency>
    

    工具类:

    org.apache.commons.lang3.StringUtils
    

    (1)判断是否为空

    // 判断字符串不为"",且不为null
    public static boolean isNotEmpty
    // 判断字符串不为"",且不为null,且不为whitespace
    public static boolean isNotBlank
    
    // 判断字符串为"",或不为null
    public static boolean isEmpty
    // 判断字符串不为""或不为null,或为whitespace
    public static boolean isBlank
    

    (2)省略号缩写字符串

    public static String abbreviate(final String str, final int maxWidth)
    public static String abbreviate(final String str, final int offset, final int maxWidth)
    public static String abbreviate(final String str, final String abbrevMarker, final int maxWidth)
    public static String abbreviate(final String str, final String abbrevMarker, int offset, final int maxWidth)
    

    (3)截断字符串

    public static String abbreviateMiddle
    

    (4)字符串的末尾删除一个换行符(若有)

    public static String chomp
    

    (5)比较字符串

    public static int compare(final String str1, final String str2)
    public static int compare(final String str1, final String str2, final boolean nullIsLess)
    public static int compareIgnoreCase(final String str1, final String str2
    

    (6)判断子字符串出现位置

    public static int indexOf(final CharSequence seq, final CharSequence searchSeq)
    public static int indexOf(final CharSequence seq, final CharSequence searchSeq, final int startPos)
    public static int indexOf(final CharSequence seq, final int searchChar)
    public static int indexOf(final CharSequence seq, final int searchChar, final int startPos)
    

    (7)拼接字符串

    public static String join(final byte[] array, final char separator)
    public static String join(final Iterable<?> iterable, final char separator)
    ......
    

    (8)其他

    3 常见面试题

    3.1 判断一个字符串是回文

    (1)手动判断

    public static boolean isPalindrome(String str) {
        if (str == null || "".equals(str)) {
            return false;
        }
        int length = str.length();
        for (int i = 0; i < length / 2; i++) {
            if (str.charAt(i) != str.charAt(length - 1 - i)) {
                return false;
            }
        }
        return true;
    }
    

    (2)StringBuilder判断

    public static boolean isPalindrome(String str) {
        if (str == null) {
            return false;
        }
        StringBuilder builder = new StringBuilder(str);
        builder.reverse();
        return str.equals(builder.toString());
    }
    

    3.2 统计某个在字符串中出现的次数

    public static int getRepeatCharCount(String sourceStr, String queryStr) {
        if (sourceStr != null && queryStr != null) {
            String tmpStr = sourceStr.replaceAll(queryStr, "");
            return sourceStr.length() - tmpStr.length();
        }
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:java字符串相关知识

          本文链接:https://www.haomeiwen.com/subject/azwnbktx.html