首先第1个代码中的clas2中的元素其实与clas中的第3,4个元素只是值相同,他们的引用地址是不同的。因为clas2中的元素是重新申请内存空间,创建了"Joker"、“Li”。也就是说clas和clas2中只是有两个值相同的元素。
第2个代码成功的原因,其实由上述1可以知道。通过clas2.add(clas.get(2));添加的元素是与clas中元素的引用地址相同,因此能够通过clas2删除clas中的元素。
因为,已经定义了这个数组为Course类,例子:
Course[] shuzu1 = {
new Course("5" , "高等数学") , new Course("6" , "大学英语")
};
这是我的理解,希望能帮到你,如有错误欢迎指出,一起交流学习
java API
在同类方法中可以直接调用,这里其实是this.testForEach() 隐示省略this
等他把泛型讲了就好了, 加了泛型之后 你把鼠标放在 coursesToSelect.get(i); 这个上的时候他就会提示你 你得到的这个元素是什么类型的了
这页ADD好像没什么问题 是不是其他类设置出了问题
跟你添加到集合中的元素有关。
如果你是这样添加的,Course c1 = new ("1","数据结构"); courseofselect.add(c1);courseofselect.add(c1);这样的话你删除就会把你所添加到集合中的值为数据结构这个Course对象都删除。因为你添加的是相同内存地址的对象,也就是一个对象。
如果你是这样添加的,Course c1 = new ("1","数据结构");Course c2 = new ("1","数据结构"); courseofselect.add(c1);courseofselect.add(c2);这样你删除的话就只会删除你指定位置的元素。
原因是,ArrayList对象的removeall方法删除元素,它内部调用的是batchRemove方法,利用的是元素的内存地址比较去删除元素。
注释掉已写出的代码:1,选中需要注释掉的代码,按ctrl+/键就会加上//注释。2,物选中需要注释的代码,按shift+ctrl+/会加上/* */注释。
注释/*
*
*/这个快捷键是alt+shift+j。
如果弹不出来,你直接按Ctrl点进去看啊
我也是新手,个人见解,如有错误请见谅。
Course[] crToRemove = {(Course)coursesToSelect.get(1),(Course)coursesToSelect.get(2)};
就相当于根据索引get到了两个值,放在了数组中。然后直接移除两个值。
Course[] crToRemove = {new Course(2, "C语言"),new Course(3, "数学")};
这一步做添加操作的时候就会做,是新声明两个元素,然后add到集合中。 这里要注意的是 2,3 并不是集合的索引,而是你添加的元素,替换成“任意值”也是一个性质。 所以你remove的时候没有得到索引,根本无法执行删除操作。
不用强制转换吗
通过位置和元素名的方法,一次只能删除一个元素,而后面这种方法可以一次删除多个
在java中对象是一个很抽象的概念!对象是以它的实例的形式存在的。
声明了一个类型的变量也就是声明了一个该类型的对象。但是这个对象只是一个抽象的概念,并不会在内
存中存在,只有实例化这个对象之后,才会在内存中分配空间。
可以这么理解 :声明了一个int a 但并没有初始化它,它就不会具有值。只有a=0这样初试化a之后,a才
具有0这个值。
实例化对象时就会产生一个指向该对象的这个实例的句柄。
以此为例:
class value{
int i;
}
public class EqualsMethod{
public static void main(string[] args){
value v1=new value();
value v2=new value();
vl.i=v2.i=100;
}
}
在class EqualsMethod 中value v1=new value();
value v2=new value();
这2行首先value v1 value v2
声明了v1,v2 2个value类型的对象。
然后用new运算符实例化了v1,v2两个对象。
而v1,v2这两个标识符,代表的分别是两个指向对象实例的句柄。
然而当v1.i时我使用的v1这个标识符,并不是对象,我们无法直接操纵对象实例
v1是指向这个对象的句柄,v2也是一样。我们通过句柄访问对象实例。
所以在这里v1,v2是句柄,它们所指向的对象我们是看不见的。
xx.removeAll()括号里的要是xx包含的元素子集(可以不连续),不可以是其他的。xx.get()传入下标即可只要不越界
是这样子的。比如List有十个元素,所以下标是0-9。
假如调用remove()方法删除了下标为4的的元素,也就是第五个元素,那么第五个元素就被删除了,
此时List有9个元素,所以下标是0-8。
后面的元素下标(5-9)自动减一,也就是原来下标是5的元素现在下标是4,原来最后一个元素下标9变成8。
应该是看不了,只能看课程有多少人学习
public String toString(){
return name+"\t"+sex+"\t"+age+"\t"+address;
}
这里是重写了toSrting()方法,你可以试着把这代码注释掉,那打印出来的就是User对象的地址,当你用上这代码时,打印出的就是重写toString()方法里的内容。
你目前用的是List接口,元素可以重复。首先你在第三个位置上添加的是 5:数学。所以当你重复添加 1:数据结构 时获取到的是当前位置上的数据 即 5:数学
而实际你添加的是1:数据结构。
coursesToSelect.removeAll(Arrays.asList(courses));
上面这句代码就是把courses数组转化成集合,作为参数传入removeAll方法了,所以就能删除集合中的两个数据对象了啊。
试试查看java官方API文档
可以的,同一个类中可以访问
方法名称的意思已经表明,contains是包含关系,equals是等于关系,两种关系不一样
就是两种remove方法,一个参数是object,另一个参数是int。
Course [] courses={(Course) coursesToSelect.get(4),(Course) coursesToSelect.get(6),(Course) coursesToSelect.get(8)};
coursesToSelect.removeAll(Arrays.asList(courses));
就行了啊
代码贴出来啊。
因为testForEach()方法是静态方法,静态方法属于类,所以可以不用创建对象,直接调用就行