A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 rick1991chen 于 2015-6-11 10:45 编辑
  1. /**
  2. * 用集合存放一个字符串的每个字符,计算字符出现的次数
  3. */
  4. import java.util.ArrayList;
  5. import java.util.ListIterator;

  6. public class Test2 {
  7.         static int count = 0;

  8.         public static void main(String[] args) {
  9.                 String str = "hello world";

  10.                 ArrayList<Character> al = new ArrayList<Character>();
  11.                 for (int x = 0; x < str.length(); x++) {
  12.                         al.add(str.charAt(x));
  13.                 }
  14.                 // System.out.println(al);// 检测是否将字符串存入集合
  15.                
  16.                 while (!(al.size()==0)) {
  17.                         ListIterator<Character> it = al.listIterator();
  18.                         char c1 = al.get(0);
  19.                         while (it.hasNext()) {
  20.                                 char c2 = it.next();
  21.                                 if (c1 == c2) {
  22.                                         count++;
  23.                                 }
  24.                         }
  25.                         System.out.print(c1);
  26.                         System.out.println("出现的次数是:" + count);
  27.                
  28.                         //此处若是用remove(c1)就会报错,现在已经知道问题的原因是
  29.                         //如果你传入一个字符,进来用remove方法会将字符读取成ASCII码
  30.                         //然后如果字符对应的整型数值超过集合长度,就会报出数组越界异常
  31.                         al.remove(al.get(0));
  32.                         count = 0;
  33.                 }

  34.         }
  35. }
复制代码

        其中在34行使用remove()方法的时候 如我已经进行的注释所说的问题,当传入字符型数据的时候,方法会自动将字符型转换为整型进行计算。
        查阅API知道了
        E remove (int index)   移除此列表中指定位置上的元素
        boolean remove ( Object o)  移除此列表中首次出现的指定元素(如果存在)。

        这两个方法,不仅可以进行通过元素来删除,还可以通过目录位置删除元素,在我想来,究其原因应该就是字符型的变量 在参与计算的过程中会自动转型成为整型进行计算,但是Java虚拟机并不知道你具体使用的是哪一个方法,所以将你传入的字符型数据,当成了整型进行目录查找,就以上代码可知,我传递的第一个字符是‘h’,在ASCII码表中的对应整型数值是104,但是找不到104目录的元素,所以报出了角标越界异常。
        现在的问题就是,字符型的变量不是只有在进行计算的时候才进行转型吗?为什么作为参数传递的时候,仍然会进行转型?
        希望能有相关经验的人来给与一些解答。


评分

参与人数 1技术分 +1 收起 理由
lwj123 + 1

查看全部评分

2 个回复

倒序浏览
我不知道答案,来学习学习
回复 使用道具 举报
remove ( Object o)  接收的是任意类型的对象,但是char 是基本数据类型,不归属于Object类型,char所对应的包装类是Character ,这也是集合al中存储的是类型的元素,所以你要让这个让方法知道你传入的参数是Object或者其子类,就要对它进行转型 al.remove((Character)c1); 我是这么理解的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马