当前位置 博文首页 > 立志欲坚不欲锐,成功在久不在速度:Java 集合 Collection的使用

    立志欲坚不欲锐,成功在久不在速度:Java 集合 Collection的使用

    作者:[db:作者] 时间:2021-07-31 12:11

    在上一篇博客中介绍了关于集合框架的一个简单的组成,和分布,可以从中发现 Collection接口是Java集合类的顶级接口之一,

    Collection 接口分为List 和 Set, 常用的是ArrayList、LinkedList、HashSet、TreeSet

    Collection接口有几个比较重要并且常用的方法:?

    boolean add(object element)向集合中添加元素 element
    void clear()清空集合
    boolean contains(Object o)判断指定集合是否包含对象 o
    boolean remove(Object o)删除集合中的对象o
    int size()获取集合中元素的个数
    Object[] toArray()将集合转换成数组
    Iterator iterator()获取集合所依赖的迭代器对象

    ?一、方法: add()? ? clear()? ? size()的例子(知识点都在代码注释中,一定得仔细看啊!):

    public class CollectionTest{
        public static void main(String[] args){
    
            //1.创建一个集合
            Collection c=new ArrayList();//这里用到了多态,但是c在不强制类型转换的前提下只
    能调用父类的对象,不能使用子类特有的对象
            //2.添加元素
            c.add(1);//在JDK5.0之前集合是不能存放基本数据类型的,但是之后基本类型有了自动拆装箱
    的功能就可以直接使用了
            c.add(new Integer(100));//开辟一个int类型的空间并且给该空间赋值100;
            
            Object o=new Object();
            c.add(o);
            //3.获取元素的个数
            System.out.println(c.size()); // 结果为3
            System.out.println(c.isEmpty()); //false
            //4.clear集合
            c.clear();
            System.out.println(c.clear());
            System.out.println(c.isEmpty());//true
    }
    
    
    }

    二、方法: boolean contains() 判断集合中是否包含某个元素? ? ?? ? ? ?

    import java.util.*
    public class CollectionTest{
        public static void main(String[] args)
    
        //创建集合
        Collection c=new ArrayList();
        Integer i1=new Integer(10);
        c.add(i1);
        //判断集合中是否包含i1;
        System.out.println(c.contains(i1)); //true;
            
        //创建 integer类型对象
        Integer i2=new Integer(10);
        System.out.println(c.contains(i2));//true
    
    }

    上面的代码解释了 contains方法的使用,但是大家注意里面的代码,我们先创建了i1对象,然后把i1添加到了集合中,但是随后又创建了值相同的i2对象,但是没有把i2通过add()方法加入到集合 中,但是通过contains方法,发现结果返回的是true,也就是说集合中有i2,这是为什么?

    ? ? ? 按理说i1和i2的内存地址不同,他们并不是同一个对象啊

    ? ? ? 原因:? ?integer在java源代码底层中重写了equals()方法,比较的不是内存地址,而是值是否相同,因为这里i1,i2的值都是10所以他们的结果是相同的

    ?既然这样,我们使用一个自定义的类,来验证

    import java.util.*
    public class CollectionTest{
        public static void main(String[] args)
    
        //创建集合
        Collection c=new ArrayList();
        Integer i1=new Integer(10);
        c.add(i1);
        //判断集合中是否包含i1;
        System.out.println(c.contains(i1)); //true;
            
        //创建 integer类型对象
        Integer i2=new Integer(10);
        System.out.println(c.contains(i2));//true
    
        Manager m1=new Manager(100,"java");
        c.add(m1);
        System.out.println(c.contains(m1));true;
        Manager m2=new Manager(100,"java");
        System.out.println(c.contains(m2));//在manager方法中若重写了equals方法,那么返回true
    若没有重写equals方法,则返回false
    
    }
    
    
    
    //未重写equals方法的manager类
    
    class Manager{
    	int no;
    	string name;
    	Manager(int no;String name){
    		this.no=no;
    		this.name=name;
    	}
    	
    }
    
    重写了equals方法的manager类
    
    class Manager{
    	int no;
    	string name;
    	Manager(int no;String name){
    		this.no=no;
    		this.name=name;
    	}
    	
    	public boolean equals(Object o){
    		if(this==o) return true; //等号两边比的是内容
    		if(o instanceof Manager){
    			Manager m=(Manager) o;//强制类型转换
    			if(m.no==this.no && m.name.equals(this.name)){
    			return true;
    			}
    		}
    		return false;
    	}
    
    
    }

    三、boolean remove()删除集合中某个元素

    */
     import java.util.*;
     public class CollectionTest{
    	public static void main(String[] args){
    		//创建集合对象
    		Collection c=new ArrayList();
    		//创建一个对象
    		Integer c1=new Integer(10);
    		//添加元素
    		c.add(i1);
    		//删除
    		Integer c2=new Integer(10);
    		c.remove(i1);
    		
    		System.out.println(c.size());//0
    		
    		Manager m1=new Manager(100,"smith");
    		c.add(m1);
    		Manager m2=new Manager(100,"smith");
    		c.remove(m2);
    		System.out.println(c.size())//0
    
    	}
    
    }
    
    重写了equals方法的manager类
    
    class Manager{
    	int no;
    	string name;
    	Manager(int no;String name){
    		this.no=no;
    		this.name=name;
    	}
    	
    	public boolean equals(Object o){
    		if(this==o) return true; //等号两边比的是内容
    		if(o instanceof Manager){
    			Manager m=(Manager) o;//强制类型转换
    			if(m.no==this.no && m.name.equals(this.name)){
    			return true;
    			}
    		}
    		return false;
    	}
    
    
    }

    注意:remove() contains()方法都需要集合中的元素重写equals方法,因为Object中的equals方法比较的是内存地址,但是在现实业务逻辑中不能比较内存地址,应该比较的是值

    ?

    四、迭代方法:Iterator iterator()的使用

    public class CollectionTest{
        public static void main(String[] args){
            //创建集合对象
            Collection c=new ArrayList();
            //添加元素
            c.add(100);//自动装箱
    		c.add(3.14);//自动装箱
    		c.add(false);//自动装箱
    
            //迭代,遍历
            //获取迭代器对象
            Iterator it=c.iterator();//迭代器是面向接口变成 it 是引用,保存了内存地址
    指向堆中的“迭代器对象”
        //注意:不需要关心底层集合的具体类型,所有集合依赖的迭代器都实现了java.util.Iterator;接口
    
            //2.开始调用方法,完成遍历迭代 用while循环
            while(it.hasNext()){
    
                Object element=it.next();
                System.out.println(element);//100 3.14. false
    
            //调用的原则: 在调用it.next()之前必须调用it.hasNext()
            }
            //除了使用while循环,还可以利用for循环
            for(Iterator it=c.iterator();it.hasNext();){
                    Object element=it.next();
                    System.out.println(element);//100 3.14,false 结果是一样的
                }
        }
    
    
    }

    上面这些都是介绍的关于Collection的使用方法,欢迎大家共同学习!

    ?

    cs