黑马程序员技术交流社区
标题:
关于ArrayList中集合方法remove的探讨
[打印本页]
作者:
rick1991chen
时间:
2015-6-2 22:06
标题:
关于ArrayList中集合方法remove的探讨
本帖最后由 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目录的元素,所以报出了角标越界异常。
现在的问题就是,字符型的变量不是只有在进行计算的时候才进行转型吗?为什么作为参数传递的时候,仍然会进行转型?
希望能有相关经验的人来给与一些解答。
作者:
shao122791159
时间:
2015-6-2 22:18
我不知道答案,来学习学习
作者:
想要那片海
时间:
2015-6-2 22:29
remove ( Object o) 接收的是任意类型的对象,但是char 是基本数据类型,不归属于Object类型,char所对应的包装类是Character ,这也是集合al中存储的是类型的元素,所以你要让这个让方法知道你传入的参数是Object或者其子类,就要对它进行转型 al.remove((Character)c1); 我是这么理解的
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2