本帖最后由 rick1991chen 于 2015-6-11 10:45 编辑
- /**
- * 用集合存放一个字符串的每个字符,计算字符出现的次数
- */
- import java.util.ArrayList;
- import java.util.ListIterator;
- public class Test2 {
- static int count = 0;
- public static void main(String[] args) {
- String str = "hello world";
- ArrayList<Character> al = new ArrayList<Character>();
- for (int x = 0; x < str.length(); x++) {
- al.add(str.charAt(x));
- }
- // System.out.println(al);// 检测是否将字符串存入集合
-
- while (!(al.size()==0)) {
- ListIterator<Character> it = al.listIterator();
- char c1 = al.get(0);
- while (it.hasNext()) {
- char c2 = it.next();
- if (c1 == c2) {
- count++;
- }
- }
- System.out.print(c1);
- System.out.println("出现的次数是:" + count);
-
- //此处若是用remove(c1)就会报错,现在已经知道问题的原因是
- //如果你传入一个字符,进来用remove方法会将字符读取成ASCII码
- //然后如果字符对应的整型数值超过集合长度,就会报出数组越界异常
- al.remove(al.get(0));
- count = 0;
- }
- }
- }
复制代码
其中在34行使用remove()方法的时候 如我已经进行的注释所说的问题,当传入字符型数据的时候,方法会自动将字符型转换为整型进行计算。
查阅API知道了
E remove (int index) 移除此列表中指定位置上的元素
boolean remove ( Object o) 移除此列表中首次出现的指定元素(如果存在)。
这两个方法,不仅可以进行通过元素来删除,还可以通过目录位置删除元素,在我想来,究其原因应该就是字符型的变量 在参与计算的过程中会自动转型成为整型进行计算,但是Java虚拟机并不知道你具体使用的是哪一个方法,所以将你传入的字符型数据,当成了整型进行目录查找,就以上代码可知,我传递的第一个字符是‘h’,在ASCII码表中的对应整型数值是104,但是找不到104目录的元素,所以报出了角标越界异常。
现在的问题就是,字符型的变量不是只有在进行计算的时候才进行转型吗?为什么作为参数传递的时候,仍然会进行转型?
希望能有相关经验的人来给与一些解答。
|