集合的基本操作

集合:

在java当中,含有着一些不同的存储数据的相关集合。分为单列集合(Collection)和双列集合(Map)。

Collection

首先学习Collection来进行展示:

以框框为例子,蓝色的代表的是接口,而红色的是代表的接口的实现类!在Collection当中,又分为两种一个是List,一个是Set!

List的特点:元素可以重复,含有索引,有序(在存和取的过程当中是有序的,先存储的时候,在遍历获取时就是先获取的)。

Set的特点和List完全相反:元素不可重复,无索引,无序。

Collection接口是单列集合的祖宗接口,所有的实现类都要实现这个接口。

那么首先来学习的可以是以Collection为例子:

由于Collection是接口,所以在实现代码的时候,要创建一个实现类实现这个接口,才能展现出来这个接口当中的所有方法。

基本方法

add

添加元素到collection当中

java 复制代码
        Collection<String> collection = new ArrayList<>();
        collection.add("he1");
        collection.add("he2");
        collection.add("he3");
        collection.add("he1");
        System.out.println(collection);

可以添加重复的元素

clear

删除元素在collection中:

全部进行清空操作!

java 复制代码
Collection<String> collection = new ArrayList<>();
collection.add("he1");
collection.add("he2");
collection.add("he3");
collection.add("he4");
System.out.println(collection);

collection.clear();
System.out.println(collection);
remove

删除指定的元素:

java 复制代码
Collection<String> collection = new ArrayList<>();
collection.add("he1");
collection.add("he2");
collection.add("he3");
collection.add("he1");
System.out.println(collection);


boolean isNo = collection.remove("he1");
System.out.println(isNo);
System.out.println(collection);

ArrayList的源码删除:

java 复制代码
/*从此列表中删除第一个出现的指定元素(如果存在)。如果列表不包含该元素,则该元素保持不变。更正式地说,删除索引 为 i 的元素,使得 (o==null ? get(i)==null : o.equals(get(i))) (如果存在这样的元素)。如果此列表包含指定的元素(或等效地,如果此列表因调用而更改),则返回 true 。
参数:
o -- 要从此列表中删除的元素(如果存在)
返回:
如果此列表包含指定的元素,则为 true*/
public boolean remove(Object o) {
    if (o == null) {
        for (int index = 0; index < size; index++)
            if (elementData[index] == null) {
                fastRemove(index);
                //找到一个就直接返回了,直接就删除了!
                return true;
            }
    } else {
        for (int index = 0; index < size; index++)
            if (o.equals(elementData[index])) {
                fastRemove(index);
                return true;
            }
    }
    return false;
}

这个是只会删除一个的情况的。

contains

处理包含的情况:

java 复制代码
        collection.add("he1");
        collection.add("he2");
        collection.add("he3");
        System.out.println(collection);


//        boolean isNo = collection.remove("he1");
//        System.out.println(isNo);
//        System.out.println(collection);


        System.out.println(collection.contains("he1"));

查看是否含有h1的元素。

具体的源码是怎么进行查找的呢?

java 复制代码
public int indexOf(Object o) {
    if (o == null) {
        for (int i = 0; i < size; i++)
            if (elementData[i]==null)
                return i;
    } else {
        for (int i = 0; i < size; i++)
            if (o.equals(elementData[i]))
                return i;
    }
    return -1;
}

根据对象所继承Object.equals进行判断的。是判断的是对象是否为同一个对象。

java 复制代码
public boolean equals(Object obj) {
    return (this == obj);
}

如果String缓冲池内不存在与其指定值相同的String对象,那么此时虚拟机将为此创建新的String对象,并存放在String缓冲池内。

如果String缓冲池内存在与其指定值相同的String对象,那么此时虚拟机将不为此创建新的String对象,而直接返回已存在的String对象的引用。

java 复制代码
 //接着System.out.println(s1.equals(s2));这里的equals在String类中被重写过,用来比较两个字符串的实际内容是否相等,即每一个字符是否相等,重写方法末尾会另做说明!!!因为比较的是字符串内容,s1,s2内容都是hello当然是相等的。 
 
		String ss1 = "aaa";
		//在池子里面又创建了一个!
         String ss2 = new String("aaa");
         System.out.println(ss1 == ss2);  //false
         System.out.println(ss1.equals(ss2));  // true
 
ss2是new出来的,所以重新分配内存地址,当用==判断时,返回false,但是两个字符串的内容相同,所以用equals方法时,返回true。

对于含有自己创建的引用数据类型的情况!

java 复制代码
        Collection<Student> students = new ArrayList<>();
        students.add(new Student("yyy" , 111));
        students.add(new Student("yyy" , 112));
        students.add(new Student("yy" , 111));
        System.out.println(students);
java 复制代码
Collection<Student> students = new ArrayList<>();
students.add(new Student("yyy" , 111));
students.add(new Student("yyy" , 112));
students.add(new Student("yy" , 111));
System.out.println(students);
System.out.println(students.contains(new Student("yyy" , 111)));

返回的没有的信息,对于自己创建Students的类是直接使用equals进行判断,判断的是地址!

想要进行数据的判断是要进行方法的重写操作的。

在Students的类当中重写其方法!

java 复制代码
@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Student student = (Student) o;
    return age == student.age && Objects.equals(name, student.name);
}

这样就是可以直接根据对象的属性值进行判断了!

size()和isEmpty()
java 复制代码
Collection<Student> students = new ArrayList<>();
students.add(new Student("yyy" , 111));
students.add(new Student("yyy" , 112));
students.add(new Student("yy" , 111));
System.out.println(students);
System.out.println(students.contains(new Student("yyy" , 111)));
System.out.println(collection.size());
System.out.println(collection.isEmpty());

集合的遍历方式

由于使用的是Collection的集合来进行处理操作的。那么想要对集合当中的元素进行遍历操作,就不能使用普通的for循环来进行遍历的。

原因是:在使用for循环的时候要进行索引的获取操作,但是在Collection的Set下面的接口是没有索引的。故不能直接使用for循环来进行遍历操作。

含有下面的方式来进行的遍历操作:

Iterator
java 复制代码
public class Collection_test2 {
    public static void main(String[] args) {
        Collection<String> collection = new ArrayList<>();
        collection.add("he1");
        collection.add("he2");
        collection.add("he3");
        System.out.println(collection);
        
        Iterator<String> iterator = collection.iterator();
        //含有三个元素he1   he2   he3
        while (iterator.hasNext()) {
            String string = iterator.next();
            System.out.println(string);
        }
    }
}

直接进行遍历操作。使用的是指针来进行遍历的。

首先指向的是元素的第一个位置,使用hasNext的方法判断当前位置是否含有元素,若含有元素就直接进行返回true,使用iterator.next()是来进行先获取元素的,在进行指针的移动操作。不断的进行的移动最终使得将全部的元素都进行了遍历操作。

指向一个空指针的情况:抛出
java 复制代码
package myCollection;

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

/**
 * @program: 集合
 * @description
 * @author: YangTao
 * @create: 2024-04-30 11:57
 **/
public class Collection_test2 {
    public static void main(String[] args) {
        Collection<String> collection = new ArrayList<>();
        collection.add("he1");
        collection.add("he2");
        collection.add("he3");
        System.out.println(collection);

        Iterator<String> iterator = collection.iterator();
        while (iterator.hasNext()) {
            String string = iterator.next();
            System.out.println(string);
        }

         System.out.println(iterator.next());
    }
}

当迭代器当中的指针进行移动操作之后,会使得指针指向一个空的情况。造成一个异常的抛出!

java 复制代码
/**
返回迭代中的下一个元素。
返回:
迭代中的下一个元素
抛出:
NoSuchElementException -- 如果迭代没有更多元素
 */
E next();
在指针的遍历结束的时候,指针不会进行复位
java 复制代码
Collection<String> collection = new ArrayList<>();
collection.add("he1");
collection.add("he2");
collection.add("he3");
System.out.println(collection);

Iterator<String> iterator = collection.iterator();
while (iterator.hasNext()) {
    String string = iterator.next();
    System.out.println(string);
}

System.out.println(iterator.next());
System.out.println(iterator.next());
System.out.println(iterator.next());
System.out.println(iterator.next());
每一个循环当中是只能调用一个next的方法的。一次指针的移动,一次判断获取元素的操作。
java 复制代码
package myCollection;

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

/**
 * @program: 集合
 * @description
 * @author: YangTao
 * @create: 2024-04-30 11:57
 **/
public class Collection_test2 {
    public static void main(String[] args) {
        Collection<String> collection = new ArrayList<>();
        collection.add("he1");
        collection.add("he2");
        collection.add("he3");
        collection.add("he1");
        collection.add("he2");
        collection.add("he3");
        System.out.println(collection);

        Iterator<String> iterator = collection.iterator();
        while (iterator.hasNext()) {
            String string1 = iterator.next();
            String string2 = iterator.next();
            System.out.println(string1);
            System.out.println(string2);

        }



    }
}

两次移动好像也是没有问题的,但是当含有的元素为奇数个情况就直接报错。

java 复制代码
public class Collection_test2 {
    public static void main(String[] args) {
        Collection<String> collection = new ArrayList<>();
        collection.add("he1");
        collection.add("he2");
        collection.add("he3");
        collection.add("he1");
        collection.add("he2");
        System.out.println(collection);

        Iterator<String> iterator = collection.iterator();
        while (iterator.hasNext()) {
            String string1 = iterator.next();
            System.out.println(string1);
            String string2 = iterator.next();
            System.out.println(string2);

        }



    }
}

指针移动两次,但是元素是只有奇数个的情况,在指向最后一个元素的next的时候会直接找不到那一个元素的。直接就抛异常了。

不能使用集合当中的方法进行添加元素和删除元素
java 复制代码
package myCollection;

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

/**
 * @program: 集合
 * @description
 * @author: YangTao
 * @create: 2024-04-30 11:57
 **/
public class Collection_test2 {
    public static void main(String[] args) {
        Collection<String> collection = new ArrayList<>();
        collection.add("he1");
        collection.add("he2");
        collection.add("he3");
        collection.add("he1");
        collection.add("he2");
        System.out.println(collection);

        Iterator<String> iterator = collection.iterator();
        while (iterator.hasNext()) {

            String string2 = iterator.next();
            System.out.println(string2);
            if(string2.equals("he3")){
                //进行修改
                System.out.println(collection.remove(string2));
            }
        }
    }
}

但是可以使用Iterator当中的remove方法进行删除操作,直接删除的Collection当中的方法。

java 复制代码
package myCollection;

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

/**
 * @program: 集合
 * @description
 * @author: YangTao
 * @create: 2024-04-30 11:57
 **/
public class Collection_test2 {
    public static void main(String[] args) {
        Collection<String> collection = new ArrayList<>();
        collection.add("he1");
        collection.add("he2");
        collection.add("he3");
        collection.add("he1");
        collection.add("he2");
        System.out.println(collection);

        Iterator<String> iterator = collection.iterator();
        while (iterator.hasNext()) {

            String string2 = iterator.next();
            System.out.println(string2);
            if(string2.equals("he3")){
                //进行修改
                iterator.remove();
            }
        }
        System.out.println(collection);


    }
}
相关推荐
小灰灰__16 分钟前
IDEA加载通义灵码插件及使用指南
java·ide·intellij-idea
夜雨翦春韭20 分钟前
Java中的动态代理
java·开发语言·aop·动态代理
程序媛小果40 分钟前
基于java+SpringBoot+Vue的宠物咖啡馆平台设计与实现
java·vue.js·spring boot
追风林1 小时前
mac m1 docker本地部署canal 监听mysql的binglog日志
java·docker·mac
芒果披萨1 小时前
El表达式和JSTL
java·el
duration~2 小时前
Maven随笔
java·maven
zmgst2 小时前
canal1.1.7使用canal-adapter进行mysql同步数据
java·数据库·mysql
跃ZHD2 小时前
前后端分离,Jackson,Long精度丢失
java
blammmp2 小时前
Java:数据结构-枚举
java·开发语言·数据结构
暗黑起源喵3 小时前
设计模式-工厂设计模式
java·开发语言·设计模式