char和int类型相互转换
程序员文章站
2022-03-08 14:36:54
...
今天看到别人使用一个方法 ->String.indexOf(int ch),
然后被Sonar提示说String.indexOf(char) is faster than String.indexOf(String).
我想去测试一下是不是这样, 结果写的时候发现String.indexOf只有两种参数格式,如下:
[img]http://dl2.iteye.com/upload/attachment/0092/0358/c1230c35-8f47-35bf-9efe-e27458b88be2.jpg[/img]
这里没有显示char类型参数。
但是测试了一下确实是可以的。
于是研究了一下,有了以下代码:
这些其实都是JVM自己进行转换的,和JDK无关。 通过debug模式是无法看到这一转换过程的。
至于为什么char比String速度快,原因很简单。
一方面是char类型的东西都被直接存储到了虚拟机的栈内存中,提取很快。
另一方面,String这个东西本质上是一个引用对象,数据应该是在堆内存吧(这块不太清楚)。
它包含了几个元素:
A character array ->一个char数组
An integral offset ->一个整数值表示起始(offset)
An integral character count ->一个整数表示char数量
An integral hash value ->一个整数哈希值
(这个在[url]http://*.com/questions/8190517/why-char-performs-better-than-string-java看到的。 debug模式也可以看到。)
[/url]
这东西操作起来会比char慢是必然的。
然后被Sonar提示说String.indexOf(char) is faster than String.indexOf(String).
我想去测试一下是不是这样, 结果写的时候发现String.indexOf只有两种参数格式,如下:
[img]http://dl2.iteye.com/upload/attachment/0092/0358/c1230c35-8f47-35bf-9efe-e27458b88be2.jpg[/img]
这里没有显示char类型参数。
但是测试了一下确实是可以的。
于是研究了一下,有了以下代码:
char c1='a';
int i1=97;
System.out.println(c1==i1); //true
char c=97;
System.out.println("c= "+c ); //a
System.out.println((int)c); //97
int a='a';
System.out.println((int)a); //97
这些其实都是JVM自己进行转换的,和JDK无关。 通过debug模式是无法看到这一转换过程的。
至于为什么char比String速度快,原因很简单。
一方面是char类型的东西都被直接存储到了虚拟机的栈内存中,提取很快。
另一方面,String这个东西本质上是一个引用对象,数据应该是在堆内存吧(这块不太清楚)。
它包含了几个元素:
A character array ->一个char数组
An integral offset ->一个整数值表示起始(offset)
An integral character count ->一个整数表示char数量
An integral hash value ->一个整数哈希值
(这个在[url]http://*.com/questions/8190517/why-char-performs-better-than-string-java看到的。 debug模式也可以看到。)
[/url]
这东西操作起来会比char慢是必然的。