Java基础-Collection集合接口(List及Set)

1.Collection接口的常用方法

1.Collection中能存放什么元素
  没有使用泛型之前,collection中可以存储object的所有子类型
  使用了泛型之后,collection中只能存储某个具体的类型
  集合中不能存储基本数据类型,也不能存java对象,只能存储java对象的内存地址。

2.Collection中常用方法:
注意:collection中包含的方法在它的实现类中也有,也可以使用,是公共的。
boolean add(Object e)

//Collection c=new Collection(); //接口是抽象的,无法实例化
boolean add(Object e) 向集合中添加元素
int size(); 获取集合中元素的个数
void clear(); 清空集合中的所有元素
boolean contains(Object o):判断当前集合中是否包含元素o,包含返回true,不包含返回false
boolean remove(Object o) 删除集合中的某个元素
boolean isEmpty() 判断该集合中的元素个数是否为0
Obect [] toArray() 将集合转换为数组

public static void main(String[] args) {
    
    
    //Collection c=new Collection();      //接口是抽象的,无法实例化
    Collection c=new ArrayList();
    //测试collection接口中的常用方法
    c.add(1200);      //自动装箱,实际上是放进去了一个对象的内存地址。Integer i=new Integer(1200)
    c.add(3.14);      //自动装箱
    c.add(new Object());
    c.add(true);
    //获取集合中元素的个数
    System.out.println("集合中元素的个数"+c.size());
    //清空集合
    c.clear();
    System.out.println("集合中元素的个数"+c.size());
    //再向集合中添加元素
    c.add("hello");
    c.add("world");
    c.add("好客");
    c.add("绿巨人");
    //判断集合中是否包含绿巨人
    boolean flag=c.contains("绿巨人");
    System.out.println(flag);     //true
    boolean flag2=c.contains("绿巨人2");
    System.out.println(flag2);    //false

    System.out.println("集合中元素的个数"+c.size());

    //删除集合中某个元素
    c.remove("绿巨人");
    System.out.println("集合中元素的个数"+c.size());

    //判断集合是否为空
    System.out.println(c.isEmpty());      //false
    c.clear();
    System.out.println(c.isEmpty());      //true
}

输出
集合中元素的个数4
集合中元素的个数0
true
false
集合中元素的个数4
集合中元素的个数3
false
true

2.Collection集合迭代

在这里插入图片描述

public static void main(String[] args) {
    
    
          //注意:以下的遍历方式/迭代方式,是所有collection通用的一种方式
          //在Map集合中不能用,在所有的collection以及子类中使用
          //创建集合对象
          Collection c=new ArrayList();//后面的集合无所谓,主要是看前面的collection接口,怎么遍历/迭代
          //添加元素
          c.add("abc");
          c.add("def");
          c.add(100);
          c.add(new Object());
          //对集合Collection进行遍历/迭代
          //第一步:获取集合对象的迭代器对象Iterator
          //collection为什么能调用这个方法,因为继承了Iterable接口,可使用其父类的方法
          Iterator it=c.iterator();
          //第二步:通过以上获取的迭代器对象,开始迭代遍历集合
/*
 以下两个方法是迭代器Iterator中的方法
 boolean hasNext()如果仍有元素可以迭代,则返回true
 Object next() 返回迭代的下一个元素
 
 void remove() 从迭代器指向的collection中移除迭代器返回的最后一个元素(可选操作)
 * */
          while(it.hasNext()){
    
    
              //不管你当初存进去的是什么,取出来统一都是object
              Object obj=it.next();
              System.out.println(obj);
          }
  }

输出
abc
def
100
java.lang.Object@15db9742

迭代器是一个对象,有两个方法hasnext()和next()。
迭代器是通用的。

public static void main(String[] args) {
    
    
    //HashSet集合。无序不可重复
    //无序:存进去和取出的顺序不一定相同
    //不可重复:存进去100,不能再存100
    Collection c=new HashSet();
    c.add(100);
    c.add(200);
    c.add(90);
    c.add(300);
    c.add(600);
    c.add(30);
    c.add(100);
    Iterator it=c.iterator();
    while(it.hasNext()){
    
    
        System.out.println(it.next());
    }
}

输出
100
200
600
90
300
30

3.contains方法解析

深入collection集合的contains方法
boolean contains(Object o)
判断集合中是否包含某个对象o,如果包含,返回true,如果不包含返回false

contains底层里面调用了equals方法。

Collection c=new ArrayList();
String s1=new String("abc");      //内存地址假设s1=0x1111
c.add(s1);
String s2=new String("def");      //内存地址假设s2=0x2222
c.add(s2);

String x=new String("abc");          //内存地址假设s3=0x3333
//c集合中是否包含x
//contains里面调用了equals方法
System.out.println(c.contains(x));

输出:true
contains方法是用来判断集合中是否包含某个元素的方法
那么它在底层是它在底层中是怎么判断集合中是否包含某个元素的呢?
调用了equals方法进行比对
equals方法返回true,就表示包含这个元素。
对于一些对象类型,则需要重写其equals方法。

4.集合中元素的删除

public static void main(String[] args) {
    
    
    //创建集合
    Collection c=new ArrayList();
    //注意:此时获取的迭代器,指向的是那是集合中没有元素状态下的迭代器 
    //一定要注意:集合结构只要发生改变,迭代器必须重新获取
    Iterator it=c.iterator();
    //添加元素
    c.add(1);
    c.add(2);
    c.add(3);
    while(it.hasNext()){
    
    
        Object obj=it.next();
        System.out.println(obj);
    }
}

当集合结构发生了改变,迭代器没有重新获取时,调用next()方法,会发生异常
在这里插入图片描述
重点:
当集合结构发生改变时,迭代器必须重新获取,如果还是用以前的迭代器,会出现异常
删除元素之后,集合的结构发生变化,应该重新获取迭代器,但是循环下一次的时候,并没有重新获取迭代器,所以会出现异常

public static void main(String[] args) {
    
    
    //创建集合
    Collection c=new ArrayList();

    //添加元素
    c.add("abc");
    c.add("def");
    c.add("ghi");
    Iterator it=c.iterator();
    while(it.hasNext()){
    
    
        Object obj=it.next();
        //删除元素之后,集合的结构发生变化,应该重新获取迭代器,但是循环下一次的时候,并没有重新获取迭代器,所以会出现异常
        c.remove(obj);
        System.out.println(obj);
    }
}

在迭代集合元素的过程中,不能调用集合对象的remove方法,否则会出现异常。
可以使用迭代器的remove方法

//创建集合
Collection c=new ArrayList();

//添加元素
c.add("abc");
c.add("def");
c.add("ghi");
Iterator it=c.iterator();
while(it.hasNext()){
    
    
    Object obj=it.next();
    it.remove();
    //c.remove(obj);
    System.out.println(obj);
}
System.out.println(c.size());

输出0;

5.List接口的特有方法

测试list接口的常用方法
1.list集合存储元素特点:有序且重复
有序:list集合中的元素有下标,从0开始,以1递增。
可重复:存储一个1,还可以继续存储1
2.list既然是collection接口的子接口,那么肯定list接口中有自己“特色”的方法
以下只列举出list接口特有的常用方法
void add(int index,E element);
E get(int index);
E remove(int index);
E set(int index,E element);
void add(int index,E element);在列表的指定位置插入指定元素(第一个参数是下标)

public static void main(String[] args) {
    
    
    //创建list类型的集合
    List myList=new ArrayList();
    //添加元素
    myList.add("A");      //默认是向集合末尾添加元素
    myList.add("B");
    myList.add("C");
    myList.add("D");
    //在列表的指定位置插入指定元素(第一个参数是下标)
    //效率有点低。
    myList.add(1,"king");
    //迭代
    Iterator it=myList.iterator();
    while(it.hasNext()){
    
    
        Object et1=it.next();
        System.out.println(et1);
    }
}

E get(int index);根据下标获取元素

//根据下标获取元素
Object firstObj = myList.get(0);
System.out.println(firstObj);
//因为有下标,所以List集合有自己比较特殊的遍历方式
//通过下标遍历,list集合特有的方式,set没有
for(int i=0;i<myList.size();i++){
    
    
    Object obj = myList.get(i);
    System.out.println(obj);
}

E remove(int index);
删除指定下标位置的元素

//删除指定下标位置的元素
//删除下标为0的元素
System.out.println(myList.size());
myList.remove(0);
System.out.println(myList.size());

//修改指定位置的元素
myList.set(2, "soft");

以上几个方法不需要死记硬背,理解一下,找帮助文档。

6.Set接口

HashSet的特点:无序且不可重复

//演示HashSset的特点
Set<String> strs=new HashSet<>();
//添加元素
strs.add("hello3");
strs.add("hello4");
strs.add("hello1");
strs.add("hello2");
strs.add("hello3");
strs.add("hello3");
//遍历
for(String s:strs){
    
    
    System.out.println(s);
}

输出
hello1
hello4
hello2
hello3
1.存储时顺序和取出的顺序不同
2.不可重复
3.放到hashSet集合的元素实际上是放到HashMap集合的key部分了。
TreeSet集合存储元素的特点
无序不可重复的,但是存储的元素可以自动按照大小顺序排序,称为可排序集合

//创建集合对象
Set<String> strs=new TreeSet<>();
//添加元素
strs.add("A");
strs.add("B");
strs.add("Z");
strs.add("Y");
strs.add("Z");
strs.add("K");
strs.add("M");
//遍历set集合
//从小到大自动排序
for(String s:strs){
    
    
    System.out.println(s);
}

输出
A
B
K
M
Y
Z

无序指的是存进去的顺序和取出来的顺序不同,元素没有下标
排序是按照从小到大的顺序排序

猜你喜欢

转载自blog.csdn.net/qq_39736597/article/details/112055767