1 Star 0 Fork 0

王浩天 / MyNote

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
集合.md 42.30 KB
一键复制 编辑 原始数据 按行查看 历史
王浩天 提交于 2021-10-14 00:00 . postgre

集合

1、集合类&容器

为什么出现集合类?

​ 面向对象语言对事物的体现都是以对象的形式,所以为了方便多个对象的操作,就要对对象进行存储,集合就是存储对象最长用的一种方式。

数组和集合类都是容器,有何不同?

​ 数组虽然也可以存储对象,但是长度是固定的;集合长度是可变的。数组中可以存储任意数据类型,集合只能存储对象。

集合类的特点?

​ 集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。

集合框架的构成及分类

img

两大接口

​ Java集合类主要由两个接口派生出来:

  • Collection

    Set :不能存放重复对象

    List :可存放重复对象

    Queue :队列

    SortedSet :可对集合数据排序

  • Map

    SortedMap :可对集合数据排序

2、Collection接口

方法:

boolean add(Object o):该方法用于向集合里面添加一个元素,若集合对象被添加操作改变了,返回 true.

boolean addAll(Collection c):把集合 c 里面的所有元素添加到指定集合里面去,如果集合对象被添加操作改变了返回 true

void clear():清除集合里面的所有元素,将集合长度变为 0。

boolean contains(Object o):返回集合里是否包含指定的元素。

boolean containsAll(Collection c):返回集合里是否包含集合 c 内所有的元素。

boolean isEmpty():返回集合是否为空(长度是否为 0)。

Iterator iterator():返回一个 Iterator 对象,用于遍历集合里的元素。

boolean remove(Object o):删除集合中指定元素 o。

boolean removeAll(Collection c):从集合中删除集合 c 里面的元素。若删除一个或以上返回true。

boolean retainAll(Collection c):从集合中删除集合 c 里不包含的元素。

int size():得到集合元素的个数。

Object[] toArray():把集合转成一个数组,所有集合元素编程数组元素。

3、Iterator接口

​ Iterator主要遍历Collection集合中的元素,也称为迭代器或迭代精灵。

boolean hasNext():若被迭代的集合元素还没有被遍历,返回 true ​ Object next():返回集合的下一个元素. ​ void remove():删除集合上一次 next()方法返回的元素。(若集合中有多个相同的元素,都可以删掉)

​ iterator 对于集合才能用,for 不同,只要是循环都可用。

​ 迭代是取出集合中元素的一种方式。 ​ 因为Collection中有iterator方法,所以每一个子类集合对象都具备迭代器。 ​ 迭代器在Collection接口中是通用的,它代替了Vector类中Enumeration(枚举)。迭代器的next方法是自动向下取元素,要避免出现NoSuchElementException。

​ 迭代器的next方法返回值类型是Object,所以要记得类型转换。(学到泛型就可以消除强转!)

4、集合遍历输出方式

​ Iterator:迭代输出,一旦操作集合的遍历输出,首选Iterator接口;

​ ListIterator:Iterator子接口,专门输出List中的元素;

​ Enumeration:古老的输出方式,迭代 Vector 元素,被 Iterator 取代;

​ foreach:可输出数组和Iterator对象。

Eg:

public class Demo1 {
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    
    public static void main(String[] args){
        List<String> l = new ArrayList();
        l.add("1");
        l.add("2");
        l.add("3");
        l.add("4");
        System.out.println(l);
        
        /**
        *遍历输出:四种方式
        */
        //1、推荐使用的Iterator对象,迭代输出!
        Iterator it = l.iterator();
        while(it.hasNext()){
            System.out.println("迭代输出:"+it.next());
        }
        
        //2、对集合进行for循环!
        for(String str : l){
            System.out.println("for集合迭代输出:"+str);
        }
        
		// 3、for循环迭代,在for方法体内部实例化Iterator对象!
		int i = 0;// for方法体内定义项不能出现多种不同类型
		for (Iterator iter = l.iterator(); i < l.size(); i++) {
			System.out.println("for循环迭代实例化输出:" + iter.next());
		}

		// 4、先将集合转换为数组,再利用数组的遍历输出;
		Object[] o = l.toArray();
		for (Object object : o) {
			System.out.println("转换数组迭代输出:" + object);
		}
    }
}

5、Set接口

​ Set 是 Collection 子接口;

​ Set 和 Collection 基本上一样,一点除外: ​ Set 无法记住添加的顺序,不允许包含重复的元素。

​ 当试图添加两个相同元素进 Set 集合,添加操作失败,add()方法返回 false。 ​ Set 判断两个对象是否相等用 equals,而不是使用==。 ​ 也就是说两个对象 equals 比较返回 true,Set 集合是不会接受这个两个对象的。

​ 常用子类: ​ HashSet:散列存放 ​ TreeSet:有序存放

hashCode方法对HashSet的作用

​ HashSet 类是 Set 接口最常用的实现类,采用 hash 算法存储数据,具有良好的存储和查找功能能。

​ 散列存储:不记录添加顺序;排列顺序时,顺序有可能发生变化;

​ 线程不安全的,多个线程访问一个 HashSet 要使用同步代码;

​ HashSet 集合元素值允许是 null,但是最多只能有一个;//因为 Set 集合就不可以装重复的对象!

​ hash(翻译为哈希,或散列)算法的功能:

保证通过一个对象快速找到另一个对象;

​ 其算法价值体现在速度,可以保证查询快速执行; ​ 当从 HashSet 中访问元素时,HashSet 先计算该元素的 hashCode(也就是该对象的 hashCode 方法返回值),然后直接到该 HashCode 对应的位置取出该元素; ​ 在这里对象的 hashCode 就好比是数组里的索引,但是不是索引;

HashSet元素添加

​ 当向 HashSet 集合中存入一个元素时,HashSet 会调用该对象的 hashCode()方法来得到该对 象的 hashCode 值,判断已经存储在集合中的对象的 hashCode 值是否与添加的对象的hashCode 值一致:若不一致:直接添加进去;若一致,再进行 equals 方法比较,equals 方法如果返回 true,表明对象已经添加进去了,就不会再添加新的对象了,否则添加进去;

​ 如果我们重写了 equals 方法,也要重写 hashCode 方法,反之亦然。

​ HashSet 集合判断两个元素相等的标准是两个对象通过 equals 方法比较相等,并且两个对象的 hashCode 方法返回值也相等。

​ 如果需要某个类的对象保存到 HashSet 集合中,覆写该类的 equals()和 hashCode()方法,应该尽量保证两个对象通过equals 比较返回 true 时,他们的 hashCode 返回也相等。

​ 总结:很重要得一点:往HashSet集合里存入数据,要先后调用两个方法:hashCode方法和equals方法。

6、TreeSet

​ TreeSet 是 SortedSet 接口唯一的实现,与 HashSet 相比额外的方法有:

​ Comparator comparator():返回当前 Set 使用的 Comparator,若返回 null,表示以自然顺序排序。

​ Object first():返回此 set 中当前第一个(最低)元素。 ​ Object last():返回此 set 中当前最后一个(最高)元素。 ​ SortedSet subSet(Object fromElement, E toElement):返回此 set 的部子集,其元素从 ​ fromElement(包括)到 toElement(不包括)。 ​ SortedSet headSet(Object toElement)返回此 set 的部分子集,其元素严格小于toElement。 ​ SortedSet tailSet(Object fromElement)返回此 set 的部分子集 , 其元素大于等于fromElement。

TreeSet排序之自然排序

​ TreeSet 会调用元素的 compareTo(Object o)方法来比较元素之间的大小关系,然后将集合里的元素按升序排列。此时需要排序元素的类 必须实现 Compareble 接口,并覆写其 int compareTo (Object o)方法;

​ 该方法用于比较对象,若:obj1,compareTo(obj2),返回 0,表示两个对象相等,若返回一个正整数,表示 obj1 大于 obj2,若返回一个负整数,表示 obj1 小于 obj2;

​ 对于TreeSet集合而言,判断两个对象相等的标准是:compareTo()方法比较返回0;

import java.util.Set;
import java.util.TreeSet;

public class Demo1{
    public static void main(String[] ards){
        Set<Integer> s = new TreeSet<Integer>();
        s.add(1);
        s.add(192);
        s.add(123);
        s.add(56);
        s.add(13);
        s.add(96);
        System.out.println(s);//[1,13,56,96,123,192]
    }
}
1
https://gitee.com/wanghaotian123/my-no.git
git@gitee.com:wanghaotian123/my-no.git
wanghaotian123
my-no
MyNote
master

搜索帮助