资讯专栏INFORMATION COLUMN

Java 11 已发布,String 还能这样玩!

guqiu / 2596人阅读

摘要:在文章正式发布,这个逆天新特性教你写出更牛逼的代码中,我有介绍到的八个新特性,其中关于加强部分,我觉得有点意思,这里多带带再拉出来讲。是不是很好在将来肯定有武之地如批量读取文件内容到一个中,就能很好的识别行结束符了。

在文章《Java 11 正式发布,这 8 个逆天新特性教你写出更牛逼的代码》中,我有介绍到 Java 11 的八个新特性,其中关于 String 加强部分,我觉得有点意思,这里多带带再拉出来讲。

Java 11 增加了一系列的字符串处理方法,如以下所示。

// 判断字符串是否为空白
" ".isBlank();                // true

// 去除首尾空格
" Javastack ".strip();          // "Javastack"

// 去除尾部空格 
" Javastack ".stripTrailing();  // " Javastack"

// 去除首部空格 
" Javastack ".stripLeading();   // "Javastack "

// 复制字符串
"Java".repeat(3);             // "JavaJavaJava"

// 行数统计
"A
B
C".lines().count();    // 3

最有意思的是 repeatlines 方法了,来看下还能怎么玩!

repeat

repeat 方法的作用就是重复一个字符串 N 遍,可以用来代替工具类:org.apache.commons.lang3.StringUtils#repeat(java.lang.String, int),来看下 repeat 的源码。

public String repeat(int count) {
    if (count < 0) {
        throw new IllegalArgumentException("count is negative: " + count);
    }
    if (count == 1) {
        return this;
    }
    final int len = value.length;
    if (len == 0 || count == 0) {
        return "";
    }
    if (len == 1) {
        final byte[] single = new byte[count];
        Arrays.fill(single, value[0]);
        return new String(single, coder);
    }
    if (Integer.MAX_VALUE / count < len) {
        throw new OutOfMemoryError("Repeating " + len + " bytes String " + count +
                " times will produce a String exceeding maximum size.");
    }
    final int limit = len * count;
    final byte[] multiple = new byte[limit];
    System.arraycopy(value, 0, multiple, 0, len);
    int copied = len;
    for (; copied < limit - copied; copied <<= 1) {
        System.arraycopy(multiple, 0, multiple, copied, copied);
    }
    System.arraycopy(multiple, 0, multiple, copied, limit - copied);
    return new String(multiple, coder);
}

来看下更多的用法。

String str = "Java";

// 小于0:java.lang.IllegalArgumentException
System.out.println(str.repeat(-2));

// 等于0:空白串("")
System.out.println(str.repeat(0));

// JavaJavaJava
System.out.println(str.repeat(3));

// java.lang.OutOfMemoryError
System.out.println(str.repeat(Integer.MAX_VALUE));

所以说 repeat 并不是可以无限增长的,有使用限制的,达到一定量就会报内存溢出异常。

lines
public Stream lines() {
    return isLatin1() ? StringLatin1.lines(value)
                      : StringUTF16.lines(value);
}

lines 方法返回一个字符串 Stream, 可以识别 换行符换行。

// 4
System.out.println("A
B
C
D".lines().count());

是不是很好?在将来肯定有武之地!如批量读取文件内容到一个 Stream 中,就能很好的识别行结束符了。

本文原创首发于微信公众号:Java技术栈(id:javastack),关注公众号在后台回复 "新特性" 可获取更多,转载请原样保留本信息。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/72660.html

相关文章

  • Java 12 骚操作, String居然还能这样

    摘要:都快要来了,必须跟栈长学起即将发布,新特性必须抢先看栈长之前在技术栈微信公众号分享过已发布,还能这样玩这篇文章,介绍了的新玩法,让大家耳目一新。更多关于的资讯干货教程以及好消息,请关注微信公众号技术栈,第一时间推送。 Java 13 都快要来了,12必须跟栈长学起! Java 13 即将发布,新特性必须抢先看! 栈长之前在Java技术栈微信公众号分享过《Java 11 已发布,Stri...

    whidy 评论0 收藏0
  • Java多线程可以分组,还能这样

    摘要:如图所示,带有的所有线程构造方法都可以定义线程组的。线程组还能统一设置组内所有线程的最高优先级,线程单独设置的优先级不会高于线程组设置的最大优先级。 前面的文章,栈长和大家分享过多线程创建的3种方式《实现 Java 多线程的 3 种方式》。 但如果线程很多的情况下,你知道如何对它们进行分组吗? 和 Dubbo 的服务分组一样,Java 可以对相同性质的线程进行分组。 来看下线程类 Th...

    biaoxiaoduan 评论0 收藏0
  • 面试问我 Java 逃逸分析,瞬间被秒杀了。。

    摘要:记得几年前有一次栈长去面试,问到了这么一个问题中的对象都是在堆中分配吗说明为什么当时我被问得一脸蒙逼,瞬间被秒杀得体无完肤,当时我压根就不知道他在考什么知识点,难道对象不是在堆中分配吗最后就没然后了,回去等通知了。。 记得几年前有一次栈长去面试,问到了这么一个问题: Java中的对象都是在堆中分配吗?说明为什么! 当时我被问得一脸蒙逼,瞬间被秒杀得体无完肤,当时我压根就不知道他在考什么...

    CastlePeaK 评论0 收藏0
  • 到底什么是重入锁,拜托,一次搞清楚!

    摘要:为什么叫重入锁呢,我们把它拆开来看就明了了。释放锁,每次锁持有者数量递减,直到为止。 相信大家在工作或者面试过程中经常听到重入锁这个概念,或者与关键字 synchrozied 的对比,栈长面试了这么多人,80%的面试者都没有答对或没有答到点上,或者把双重效验锁搞混了,哭笑不得。。 那么你对重入锁了解有多少呢?今天,栈长帮大家撕开重入锁的面纱,来见识下重入锁的真实容颜。。 什么是重入锁 ...

    LiuRhoRamen 评论0 收藏0

发表评论

0条评论

guqiu

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<