java集合类的方法_Java 集合类常用方法

Collection中的contains()方法和remove()方法。

boolean contains(Object o);该方法是用来判断集合中是否包含某个元素,若包含,返回true,不包含返回false。结合以下代码来看。

import java.util.*;

publicclassCollectionTest03{

publicstaticvoidmain(String[] args){

Collection c=newArrayList();

Integer i1=newInteger(10);

c.add(i1);    //true

System.out.println(c.contains(i1));

Integer i2=newInteger(10);

//contains()方法底层调用的是equals()方法

c.contains(i2);    //true

System.out.println(c.contains(i1));

Manager m1=newManager(100,"张三");

c.add(m1);

System.out.println(c.contains(m1));  //true

Manager m2=newManager(100,"张三");

System.out.println(c.contains(m2));  //false

}

/* 底层源码

public boolean contains(Object i2) {

return indexOf(i2) >= 0;   //indexOf(i2) >= 0; 结果为true or false,即 return true(or false)

}

public int indexOf(Object i2) {

if (i2 == null) {

//i2为空值时与ArrayList中的元素进行比较

for (int i = 0; i < size; i++)

if (elementData[i]==null)

return i;    //此时i>=0

} else {  //i2不为空值时与ArrayList中的元素进行比较

for (int i = 0; i < size; i++)

if (o.equals(elementData[i]))

return i;    //i>=0

}

return -1;

}*/

}

classManager{

intno;

String name;

Manager(intno,String name){

this.no=no;

this.name=name;

}

}

运行后输出:

true

true

true

false

上述代码中,

1.创建集合对象c,之后Integer i1=new Integer(10);new出一个Integer类型的对象,使用c.add(i1);将i1添加到集合c中,最后使用c.contains(i1);判断集合c中是否包含i1并将结果打印。

2.Integer i2=new Integer(10);再new出一个Integer类型的对象i2,并且和i1相同,System.out.println(c.contains(i2));判断集合c是否包含i2并将结果打印,注意,这里没有第一步中的c.add()方法,但结果依旧输出true。这是因为contains()方法底层调用的了equals()方法。这里我们打开jdk的帮助文档来看底层的源码。

publicbooleancontains(Object i2){

returnindexOf(i2) >=0;  //indexOf(i2) >= 0; 结果为true or false,即 return true(or false)

}

publicintindexOf(Object i2){

if(i2 ==null) {

//i2为空值时与ArrayList中的元素进行比较

for(inti =0; i < size; i++)

if(elementData[i]==null)

returni;    //此时i>=0

}else{  //i2不为空值时与ArrayList中的元素进行比较

for(inti =0; i < size; i++)

if(i2.equals(elementData[i]))

returni;    //i>=0

}

return-1;

}

从底层源码中可以看出,contains()方法中调用了indexOf()方法,

public boolean contains(Object i2) {

return indexOf(i2) >= 0;

}

indexOf(i2) >= 0; i>=0时,结果为true,否则为false,即 return true(or false)

接下来具体看看indexOf()方法,i2可能为空值,也可能不为空,当i2为空值时,与Arraylist中的元素进行比较,使用for循环对ArrayList中的元素进行遍历,若elementData[i]==null,即在ArrayList中找到了与i2一样都为null的元素,则返回此时ArrayList中的索引,我们知道索引都是>=0的,即contains()方法中return true.当i2不为空值时,仍然使用for循环进行遍历ArrayList()中的元素,如果发现i2与ArrayList中的某个元素相等,则返回ArrayList中该元素的索引下标,同理,contains()方法中return true。如果这两种情况都不满足,也就意味着i2与ArrayList中的元素都不相等,这时return -1,contains()方法中return false。

3.接下来我们自定义一个Manager的类,Manager m1=new Manager(100,"张三");创建一Manager类型的的对象m1,c.add(m1);将m1添加到ArrayList中,使用contains()方法判断集合c中是否包含m1;接着Manager m2=new Manager(100,"张三");new出一个对象m2,添加到集合c中,使用contains()方法进行判断时输出false,这时因为m1和m2都是new出来的对象,它们的内存地址不相同,Manager类中没有重写equals()方法,所以进行判断时比较的还是内存地址,返回结果为false。

4.如果要在Manager类中比较内容而不是内存地址,我们可以这样重写Manager中的equals()方法。

publicbooleanequals(Objecto){

if(this== o)returntrue;

if(oinstanceofManager){

Manager m = (Manager)o;

if(m.no==this.no && m.name==this.name){

returntrue;

}

}

returnfalse;

}

这里要注意:存储在集合中的元素应该重写equals()方法。重写Manager中的equals()方法后System.out.println(c.contains(m2));打印出结果为true。

接下来看remove()方法。

boolean remove(Object o);  删除集合中某个元素

看以下代码:

import java.util.*;

publicclassCollectionTest04{

publicstaticvoidmain(String[] args){

Collection c=newArrayList();

Integer i1=newInteger(10);

c.add(i1);

System.out.println(c.size());  //1

Integer i2=newInteger (10);

c.remove(i2);

System.out.println(c.size());  //0

Manager m1=newManager(100,"张三");

c.add(m1);

Manager m2=newManager(100,"张三");

c.remove(m2);

System.out.println(c.size());  //0

}

}

classManager{

intno;

String name;

Manager(intno,String name){

this.no=no;

this.name=name;

}

publicbooleanequals(Object o){

if(this== o)returntrue;

if(o instanceof Manager){

Manager m = (Manager)o;

if(m.no==this.no && m.name==this.name){

returntrue;

}

}

returnfalse;

}

}

理解了contains()方法中讲的知识点,remove()中的应该很容易就能判断出该输出什么,这里就不详细地再进行讲解了。不过提醒一点,如果数据在[-128~127]之间,Java中引入了一个“整型常量池”,在方法区中。该整型常量池只存储-128~127之间的数据。Integer i5=127;这个程序不会在堆中创建对象,会直接在整型常量池中拿。这是之前讲的内容,忘记了的翻到之前的《Java 包装类详解》再复习一遍。

深入remove()方法。

import java.util.*;

publicclassCollectionTest05{

publicstaticvoidmain(String[] args){

Collection c=newArrayList();

c.add(1);

c.add(2);

c.add(3);

Iterator it=c.iterator();

while(it.hasNext()){

it.next();

it.remove();  //通过迭代器的remove()方法删除元素

}

System.out.println(c.size());  //0

}

}

以上程序为使用迭代器的remove()方法删除,当使用集合的remove()方法删除时,如下:

import java.util.*;

publicclassCollectionTest05{

publicstaticvoidmain(String[] args){

Collection c=newArrayList();

c.add(1);

c.add(2);

c.add(3);

Iterator it=c.iterator();

while(it.hasNext()){

Object element=it.next();

c.remove(element);  //使用集合的remove()方法删除

}

System.out.println(c.size());

}

}

编译通过,运行后报错:

Exceptioninthread"main"java.util.ConcurrentModificationException

at java.util.ArrayList$Itr.checkForComodification(Unknown Source)

at java.util.ArrayList$Itr.next(Unknown Source)

at CollectionTest05.main(CollectionTest05.java:25)

这是因为使用集合Collection的remove()方法进行删除时,c.remove(element);也就是删除一个元素之后,这个集合已经变了,再进行删除元素的动作时,必须重新获取改变之后的集合的迭代器,否则运行后报异常。所以推荐使用迭代器的remove()方法进行元素的删除。

wx搜索“程序员考拉”,专注java领域,一个伴你成长的公众号!

1267092-20200421114105541-264201665.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值