前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java String &StringUtils

Java String &StringUtils

作者头像
邹志全
发布2019-10-13 15:15:10
4240
发布2019-10-13 15:15:10
举报
文章被收录于专栏:EffectiveCodingEffectiveCoding

以下代码的测试环境 为Java 10:

String

代码语言:javascript
复制
public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    @Stable
    private final byte[] value;

1、首先String 是一个final类(不能被继承,可以理解为最终的,防止继承使用),里面维护了一个字节数组。 我们经常使用String 一般都是 String str1 = "2333”; 这种的叫做字面量,还有一种是String str2 = new String(“2333”); 然后还有配合Builder 及 Buffer使用的。 这些方式存在什么差异呢:可以试着去运行这个例子

代码语言:javascript
复制
class Test1 {
    public static void main(String[] args) {
        String str1 = "2333";
        String str2 = "2333";
        String str3 = new String("2333");
        String str4 = new String("2333");
        String str5 = str1 + str2;
        String str6 = "23332333";
        String str7 = "23332333";
        String str8 = str2 + str1;
        System.out.println(str1 == str2); // true
        System.out.println(str1 == str3); // false
        System.out.println(str3 == str4); // false
        System.out.println(str5 == str6); // false
        System.out.println(str6 == str7); // true
        System.out.println(str7 == str5); // false
        System.out.println(str8 == str5); // false
    }
}

这里可以显然看出,使用new 的时候是产生了新的String对象,而直接给一个字面量实际上是一个对象。Java 中是这样实现的,如果常量池中存在该字面量,则直接使用。如果没有的话创建一个新的字面量,然后投入常量池。当对于字面量进行操作时,实际上是创建一个新的对象,而不是从常量池里面复用。其实这样设计也是更加符合String字面量的概念,更像是一种基础类型。 public native String intern(); // 这是加入常量池的方法 然后String 还提供了一些相关的便捷方法,但是为了避免NPE 还是直接使用StringUtils吧 StringBuffer & StringBuilder 这两个放到一块说,功能是类似的,buffer提供同步策略,builder不保证。

代码语言:javascript
复制
 public final class StringBuffer
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence {
public final class StringBuilder
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence {

两个类都继承自AbstractStringBuilder,然后StringBuffer、StringBuilder都默认实现一个长度为16的byte[]。 StringBuffer中都是这样的清一色的synchronized方法,相对于Builder而言效率要低一些。但在并发环境中除非自己额外同步要不还是使用StringBuffer吧,

代码语言:javascript
复制
public synchronized StringBuffer append(String str) {
    toStringCache = null;
    super.append(str);
    return this;
}

就性能而言,buffer、builder在少量的操作时是差异不大的,但操作次数上升之后Builder就显得有优势了。除此之外,两者比String字面量操作是快非常多的(原因正是上文说的String 字面量的特性)

代码语言:javascript
复制
class Test1 {
    public static void main(String[] args) {
        String str1="2333";
        StringBuilder str2 = new StringBuilder("2333");
        StringBuffer str3 = new StringBuffer("2333");
        long startTime = System.currentTimeMillis();
        for(int i = 0; i < 10000; i++){
            str1 += "2333";
        }
        long endTime = System.currentTimeMillis();
        System.out.println("字面量操作:" + (endTime-startTime));
        startTime = System.currentTimeMillis();
        for(int i = 0; i < 10000; i++){
            str2.append("2333");
        }
        endTime = System.currentTimeMillis();
        System.out.println("builder操作:" + (endTime-startTime));
        startTime = System.currentTimeMillis();
        for(int i = 0; i < 10000; i++){
            str3.append("2333");
        }
        endTime = System.currentTimeMillis();
        System.out.println("buffer操作:" + (endTime-startTime));
    }
}

执行结果:

代码语言:javascript
复制
字面量操作:114
builder操作:1
buffer操作:2
Process finished with exit code 0

StringUtils

StringUtils是针对与String对象的提供了一系列建议的判别方法,下面是它的API(总结来自网络) isEmpty(String str) 是否为空,空格字符为false isNotEmpty(String str) 是否为非空,空格字符为true isBlank(String str) 是否为空,空格字符为true isNotBlank(String str) 是否为非空,空格字符为false trim(String str)去除字符串两端的控制符,空字符串、null 返回 null trimToEmpty(String str) 去除字符串两端的控制符,空字符串、null 返回"" stripToNull(String str) 去除字符串两端的空白符,空字符串、null 返回null stripToEmpty(String str) 去除字符串两端的空白符,空字符串、null 返回"" strip(String str, String stripChars) 去掉str两端的在stripChars中的字符 strip("000000134_76539000","0")="134_76539" stripStart (String str,String stripChars) 去除str 前端在stripChars中的字符 stripEnd (String str,String stripChars) 去除str 后端在stripChars中的字符 equals(String str1,String str2) 比较两个字符串是否相等,如果两个均为空则认为相等 indexOf(String str,char searchChar) 返回searchChar 在字符串中第一次出现的位置,如果没找到则返回 -1,如果str 为null 或者 "",也返回-1 indexOf(String str,char searchChar,int startPos) 返回字符searchChar从startPos开始在字符串str中第一次出现的位置。 contains(String str,char searchChar) str中是否包含字符searchChar,str为null 或者 searchChar为null,返回false 。 contains("", "") = true contains("dfg", "") = true containsIgnoreCase(String str,String searchStr) str中是否包含字符searchChar,不区分大小写 int indexOfAny(String str, char[] searchChars) 找出字符数组searchChars中的字符第一次出现在字符串str中的位置。 如果字符数组中的字符都不在字符串中,则返回-1 ,如果字符串为null或"",则返回-1 subString(String str,int start) 从start 开始,包含start 那个字符,得到字符串str 的子串,如果start为负数,则从后面开始数起。如果str 为null 或者 "" 则返回其本身 subStringBefore(String str,String separator) 得到字符串separator第一次出现前的子串。不包含那个字符,如果str 为null 或者 "" 则返回其本身。 subStringAfter(String str,String separator) 得到字符串separator第一次出现后的子串,不包含那个字符,如果 str 为null,或者"",则返回其本身 subString(String str,int start,int end) 同上 left(String str,int len) 得到字符串str从左边数len长度的子串,如果str 为null 或者 "",则返回其本身,如果len小于0,则返回"" right(String str,int len)得到字符串str从右边数len长度的子串 mid(String str,int pos,int len) 得到字符串str从pos开始len长度的子串,pos小于0,则设为0。 split(String str) 把字符串拆分成一个字符串数组,用空白符 作为分隔符,字符串为null 返回null,字符串为"",返回空数组{} split(String str,char c) 按照 char c 拆分字符串 join(Object[] arrey)把数组中的元素连接成一个字符串返回 join(Object[] arrey,char c) 把数组中的元素拼接成一个字符串返回,把分隔符 c 也带上 deleteWhitespace(String str) 删除字符串中的所有空白符,包括转义字符 removeStart(String str,String remove) 如果字符串str是以remove开始,则去掉这个开始,然后返回,否则返回原来的串 removeEnd(String str,String remove) 如果字符串str是以字符串remove结尾,则去掉这个结尾,然后返回,否则返回原来的串。 remove(String str,char remove) 去掉字符串str中所有包含remove的部分,然后返回 replace(String str,String reql,String with) 在字符串text中用with代替repl,替换所有 replaceChars(String str,char old,char new) 在字符串中 new 字符代替 old 字符 public static String replaceChars(String str, String searchChars, String replaceChars) StringUtils.replaceChars("asssdf","s","yyy")) = "ayyydf" StringUtils.replaceChars("asdf","sd","y")) = "ayf" StringUtils.replaceChars("assssddddf","sd","y"))= "ayyyyf" overlay(String str,String new,int start,int end) 用字符串new 覆盖字符串str从start 到 end 之间的串 chop(String str) 去掉字符串的最后一个字符,比如/r/n repeat(String str,int repart) 重复字符串repeat次 rightPad(String str,int size,String padStr) size长度的字符串,如果不够用padStr补齐 leftPad(String str,int size,String padStr)同上 center(String str,int size)产生一个字符串,长度等于size,str位于新串的中心 swapCase(String str) 字符串中的大写转小写,小写转换为大写

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.10.03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • String
  • StringUtils
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档