性能方面parseInt等等比其他解决方案要糟糕得多,因为至少需要异常处理。

我已经运行了jmh测试并且发现使用charAt迭代字符串并且将字符与边界字符进行比较是测试字符串是否仅包含数字的最快方法。

JMH测试

测试结果比较charAt对比IntStream对比Long.parseLong和检查char值的性能。

这些方法可以为非ascii字符串和包含+/-符号的字符串产生不同的结果。

测试在吞吐量模式下运行(越大越好),有5次预热迭代和5次测试迭代。

结果

请注意,对于第一次测试负载,charAt几乎比IntStream慢100倍。

## Test load with 25% valid strings (75% strings contain non-digit symbols)

Benchmark Mode Cnt Score Error Units

testIsDigit thrpt 5 9.275 ± 2.348 ops/s

testPattern thrpt 5 2.135 ± 0.697 ops/s

testParseLong thrpt 5 0.166 ± 0.021 ops/s

## Test load with 50% valid strings (50% strings contain non-digit symbols)

Benchmark Mode Cnt Score Error Units

testCharBetween thrpt 5 16.773 ± 0.401 ops/s

testCharAtIsDigit thrpt 5 8.917 ± 0.767 ops/s

testCharArrayIsDigit thrpt 5 6.553 ± 0.425 ops/s

testPattern thrpt 5 1.287 ± 0.057 ops/s

testIntStreamCodes thrpt 5 0.966 ± 0.051 ops/s

testParseLong thrpt 5 0.174 ± 0.013 ops/s

testParseInt thrpt 5 0.078 ± 0.001 ops/s

测试套件

@State(Scope.Benchmark)

public class StringIsNumberBenchmark {

private static final long CYCLES = 1_000_000L;

private static final String[] STRINGS = {"12345678901","98765432177","58745896328","35741596328", "123456789a1", "1a345678901", "1234567890 "};

private static final Pattern PATTERN = Pattern.compile("\\d+");

@Benchmark

public void testPattern() {

for (int i = 0; i < CYCLES; i++) {

for (String s : STRINGS) {

boolean b = false;

b = PATTERN.matcher(s).matches();

}

}

}

@Benchmark

public void testParseLong() {

for (int i = 0; i < CYCLES; i++) {

for (String s : STRINGS) {

boolean b = false;

try {

Long.parseLong(s);

b = true;

} catch (NumberFormatException e) {

// no-op

}

}

}

}

@Benchmark

public void testCharArrayIsDigit() {

for (int i = 0; i < CYCLES; i++) {

for (String s : STRINGS) {

boolean b = false;

for (char c : s.toCharArray()) {

b = Character.isDigit(c);

if (!b) {

break;

}

}

}

}

}

@Benchmark

public void testCharAtIsDigit() {

for (int i = 0; i < CYCLES; i++) {

for (String s : STRINGS) {

boolean b = false;

for (int j = 0; j < s.length(); j++) {

b = Character.isDigit(s.charAt(j));

if (!b) {

break;

}

}

}

}

}

@Benchmark

public void testIntStreamCodes() {

for (int i = 0; i < CYCLES; i++) {

for (String s : STRINGS) {

boolean b = false;

b = s.chars().allMatch(c -> c > 47 && c < 58);

}

}

}

@Benchmark

public void testCharBetween() {

for (int i = 0; i < CYCLES; i++) {

for (String s : STRINGS) {

boolean b = false;

for (int j = 0; j < s.length(); j++) {

char charr = s.charAt(j);

b = '0' <= charr && charr <= '9';

if (!b) {

break;

}

}

}

}

}

}

更新于2018年2月23日

再添两个案例 - 一个使用charAt而不是创建额外的数组而另一个使用IntStream的char代码

如果找到循环测试用例的非数字,则添加立即中断

对于循环测试用例,返回空字符串的false

更新于2018年2月23日

再添加一个测试用例(最快的!),它不使用流来比较char值

java 不包含 字母和数字_Java String - 查看字符串是否仅包含数字而不包含字母相关推荐

  1. java 正则 连续数字_Java - 正则表达式匹配字符串中的连续数字或字符

    下面是一个快速,肮脏,未优化(可能是越野车),但你想要实现什么样的独立示例. public static void main(String[] args) { // should not allow ...

  2. java 如何将数值型字符转换为数字_Java 如何将字符串转换为数字 专家详解

    在编程中我们经常需要进行各种数据类型之间的转换操作,下面将为您介绍如何将字符串转换为数字.首先我们需要了解各种数据类型的表示,String在java中为字符串类型,int在java中为整数类型,大小在 ...

  3. java用 拼接字符串的原理_Java String 拼接字符串原理详解

    首先来一道思考题: String str1 = "111111"; String str2 = "222222"; String str = str1 + st ...

  4. java字符串比较配置_Java String类字符串比较

    Java String类字符串比较 以下实例中我们通过字符串函数 compareTo (string) ,compareToIgnoreCase(String) 及 compareTo(object ...

  5. 1、如何进行字符串常量中的字符定位_Java String:字符串常量池,我相信会有很多朋友不很理解这部分...

    作为最基础的引用数据类型,Java 设计者为 String 提供了字符串常量池以提高其性能,那么字符串常量池的具体原理是什么,我们带着以下三个问题,去理解字符串常量池: 字符串常量池的设计意图是什么? ...

  6. python判断合法整数数字_C# 判断一字符串是否为合法数字(正则表达式)

    判断一个字符串是否为合法整数(不限制长度) public static bool IsInteger(string s) { string pattern = @"^\d*$"; ...

  7. C# 使用正则表达式去掉字符串中的数字,或者去掉字符串中的非数字

    /// 去掉字符串中的数字 public static string RemoveNumber(string key)           {               return Regex.R ...

  8. java 字符串驻留_java String 以及字符串直接量 与 字符串驻留池 ...

    结果输出 :fancydeepin这是怎么回事?不是说 String 是不可变的字符串吗?怎么这里又变了?是这样的,在这里 name 只是一个引用类型变量,并不是一个 String 对象,@1中创建了 ...

  9. java同时输出多个数字_java从命令行接收多个数字,求和之后输出结果

    设计思想:获取输入数的个数,然后将要相加的数字转换成为浮点型进行相加,最后进行输出 源代码: package Add; import java.util.Scanner; // 严羽卿   2015. ...

最新文章

  1. Mac-ios下JDK的安装路径(java)
  2. java SWT Browser实现浏览器功能并运行JavaScript代码
  3. 老牌开源Office操作组件NPOI现已支持.NET Core
  4. STM32F1笔记(十一)ADC
  5. QT中循环显示图片和简单的显示图片
  6. 微信出拳:狠起来,连自己人都不放过!
  7. ubuntu安装teamviewer教程 linux安装teamviewer教程
  8. kafka 消费者组 消费者订阅不同主题_深入了解kafka系列-消费者
  9. 例3.5 二叉排序树 - 九度教程第35题(二叉排序树)
  10. 4个免费代码自动生成神器
  11. 数据挖掘之apriori算法(python实现详细注释)
  12. latex生成的pdf论文在打印时页码混乱的解决方法
  13. python3 爬虫 爬取美女图片
  14. Gradle入门教程学习笔记
  15. 功能丰富强大的开源HEVC分析软件 “ Gitl HEVC Analyzer ”
  16. Java Promblem/Demand And Solution
  17. 厦门大学计算机科学夏令营过程,厦门大学信息学院计算机系夏令营学生见面会如期召开-厦门大学计算机科学系...
  18. 推荐几个做自媒体好用的电影素材网站
  19. 郭霖老师的组合模式讲解
  20. csol c语言运行错误,CSOL非常卡之控制台优化.doc

热门文章

  1. php yat grpc,Laravel 5 使用 Grpc 构建的微服务
  2. power指令集 mysql_PowerPC汇编指令集简析
  3. maven项目转成web项目
  4. 不可思议!乌克兰国防军队的系统账密居然是 admin 和 123456...
  5. 皮一皮:越是拥有越不会炫耀...
  6. 赠书:一本书带你吃透Nginx应用与运维
  7. 以为是行废代码,原来有这作用!
  8. Spring Boot 项目设置网站图标
  9. 百万年薪挖了个P8程序员,难道是“水货”?
  10. 19条效率至少提高3倍的MySQL技巧