JavaSE---集合

Java–集合

一.集合由来

a.数组长度是固定的,当添加的元素超过了数组的长度时需要对数组重新定义,太麻烦,。
b.java内部给我们提供了集合类,能存储任意对象,长度是可以改变的,随着元素的增加而增加。

二.集合和数组的区别

区别1 :

  • 数组既可以存储基本数据类型,又可以存储引用数据类型
  • 集合只能存储引用数据类型(对象)
  • 集合中也可以存储基本数据类型,但是在存储的时候会自动装箱变成对象
    区别2:
  • 数组长度是固定的,不能自动增长
  • 集合的长度的是可变的,可以根据元素的增加而增长

三.使用场景

  • 如果元素个数是固定的推荐用数组
  • 如果元素个数不是固定的推荐用集合

四.集合继承体系图

**加粗样式
**

五.基本方法演示

注意: 以ArrayList为例进行演示,LinkedList用法完全一致,只是使用场景不一样.

package CSDN;
import java.io.IOException;
import java.util.ArrayList;

public class Entrance {
    public static void main(String[] args) throws IOException {
        //生成集合
        ArrayList<Person> list1 =new ArrayList<>();
        Person p1=new Person();
        Person p2=new Person();
        //添加元素
        list1.add(p1);
        list1.add(p1);
        list1.add(p1);
        //删除元素(如果有相同元素那么会删除第一次添加的元素)
        list1.remove(p1);
        System.out.println(list.size());
        
       ArrayList<Person> list2 =new ArrayList<>();
         list2.add(p2);
         list2.add(p2);
         list2.add(p2);
         
         //boolean addAll(Collection c);
         list1.addAll(list2);    //将list2的元素添加到list1中   list2不变
         
         //boolean removeAll(Collection c);
          list1.removeAll(list2) //删除掉list1中和list2相同的元素,也是通过equals方法比较   list2不变 
          
         //boolean containsAll(Collection c);   
         list1.containsAll(list2);  //判断list1是否包含list2全部的元素
          
         //boolean retainAll(Collection c);
         list1.retainsAll(list2);  //删除掉
    }
    
}

class Person{
    int age=18;
}

1.remove方法在底层是怎样删除元素的?

p2和list集合中的每个元素比较
p2.equals(第一个元素)
p2.equals(第二个元素)。p2会去调用Object中的equals方法和集合中的每个元素进行比较

//假设p2.eaquals();
//每次调用的是p2的equals方法 传入的是集合中的元素
 void equals(Object obj){
 
 return(this==obj)
 
 }
 //==  当连接基本数据类型时候是比较俩个数的大小,但是当它连接俩个对象时是来判断俩个对象的地址是否相同。   
 
 //我们也可以复写equasl方法去达到你的要求。 假如我们希望俩个对象的年龄相同就是同一个对象就可以这样写
 public boolean equals(Object obj){
  Person p=(Person)obj;
  return (this.age==p.age);
}

 

六.集合的遍历

转化为数组进行遍历

代码如下:

import java.util.ArrayList;

public class Entrance {
    public static void main(String[] args) {
        ArrayList<Person> coll=new ArrayList<>();
        coll.add(new Person("张三",24));
        coll.add(new Person("李四",24));
        coll.add(new Person("王五",24));
        coll.add(new Person("赵六",24));
        //JDK中 集合的toArray返回的是一个Object数组
        Object [] arr=coll.toArray();
        for(int i=0;i<arr.length;i++){
            //arr[i]为Object类型所以需要向下转型才可以找到Person的特有方法
             Person s =(Person) arr[i];
             System.out.println(s.getName()+","+s.getAge());
        }
    }
}


class Person{
    int age=18;
    String name;

    Person(String name,int age){
        this.age=age;
        this.name=name;
    }

    public boolean equals(Object obj){
        Person p=(Person)obj;
        return this.age==age;
    }
    String  getName(){
        return name;
    }
    int getAge(){
        return age;
    }
}

迭代器遍历

代码如下:

import java.util.ArrayList;
import java.util.Iterator;

public class Entrance {
    public static void main(String[] args) {
        ArrayList<Person> coll=new ArrayList<>();
        coll.add(new Person("张三",24));
        coll.add(new Person("李四",24));
        coll.add(new Person("王五",24));
        coll.add(new Person("赵六",24));

        //这里需要一个泛型 由于iterator.hasNext返回的是Object导致Person中的方法就会访问不到
        Iterator<Person> iterator=coll.iterator();
            //iterator.hasNext() 返回true就会继续进行打印
        while (iterator.hasNext()){
            System.out.println(iterator.next().getName());
        }

    }
}


class Person{
    int age=18;
    String name;

    Person(String name,int age){
        this.age=age;
        this.name=name;
    }

    public boolean equals(Object obj){
        Person p=(Person)obj;
        return this.age==age;
    }
    String  getName(){
        return name;
    }
    int getAge(){
        return age;
    }
}

注意:如果需要更改集合的结构,要调用迭代器的方法,否则会抛出
ConcurrentModificaitionException异常

for-each遍历

内部的实现也是迭代器,所以也请注意ConcurrentModificationException

import java.util.ArrayList;

public class Entrance {
    public static void main(String[] args) {
        ArrayList<Person> coll=new ArrayList<>();
        coll.add(new Person("张三",24));
        coll.add(new Person("李四",24));
        coll.add(new Person("王五",24));
        coll.add(new Person("赵六",24));

       for(Person unit:coll){
           System.out.println(unit.getName());
       }

    }
}


class Person{
    int age=18;
    String name;

    Person(String name,int age){
        this.age=age;
        this.name=name;
    }

    public boolean equals(Object obj){
        Person p=(Person)obj;
        return this.age==age;
    }
    String  getName(){
        return name;
    }
    int getAge(){
        return age;
    }
}

七.ArrayList和LinkedList场景使用区别

LinkedList经常用在增删操作较多查询操作很少的情况下,ArrayList则相反

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值