java集合

文章目录

一、java集合的组成

二、Collection接口常用方法

三、List集合

四、Set集合

五、Map集合


前言

首先我们要明白集合也是类,数组也是如此,集合是用来存放一组数据的而不是像数组只是存放某种类型的数据,确切的说java集合不能存放基本数据类型,而只能存放对象,从整体上讲,八大基本数据类型对应八大类,而java集合则是单纯的存放和操作数据而被创造出来的类。


一、java集合的组成

java集合类主要由两个接口派生而出,即Collection和Map接口。Collection和Map是java集合框架的最上层的父接口,这两个接口又包含其他的子接口和实现类。

java集合主要包括三种类型:Set(集),List(列表),Map(映射)。

Collection集合体系的继承树

实线表示继承关系,虚线表示实现关系

Map体系的继承树

Java集合的三种数据类型存储示意图

 

  •  从上图我们可以观察到,实现Set接口的集合不能装有重复元素,而Set集合平常也很少用到
  • 实现list接口的集合可以记录每个元素添加的顺序,且元素之间是可重复的
  • 实现Map接口的集合存放的每项数据都由两个值组成,分别为key和value,key不可以重复,但value可以重复

二、Collection接口常用方法

方法名说明
boolean add(Object obj)向集合中添加一个元素
boolean addAll(Collection c)将集合c的所有元素添加到指定集合中
void clear()清除集合中的所有元素,此时集合长度变为0
boolean contains(Collection c)返回集合中是否包含指定的c集合
Boolean isEmpty()判断集合是否为空。集合长度为0时返回true
Iterator iterator()返回一个Iterator对象,用于遍历集合中的元素
boolean remove(Object obj)删除集合中的指定元素obj
int size()返回集合中元素的个数
Object[] toArray() 将当前集合转换成一个Object[]类型的数组

三、List集合

List的数据结构就是一个序列,存储内容时直接在内存中开辟一块连续的空间,然后将空间地址与索引对应,List最常见的实现类是ArrayList和LinkedList

List的常用方法

方法名说明
void add(int index,Object element)添加对象element到位置index上
boolean addAll(int index,Collection collection)在index位置后添加容器collection中所有的元素
Object get(int index)取出下标为index的位置的元素
int indexOf(Object element)查找对象element在List中最后出现的位置
int lastIndexOf(Object element)查找对象element在List中最后出现的位置
Object remove(int index)删除index位置上的元素,并返回被删除的这个元素
Object set(int index,Object element)将index位置上的所示对象替换为element并返回被替换

ArrayList 

ArrayList是基于数组实现的List类,ArrayList底层是通过一个长度可变的数组实现的。ArrayList允许对元素进行快速的随机访问,但是向ArrayList插入与删除元素的速度较慢。

实例代码:

 public static void main(String[] args) {
        ArrayList abc = new ArrayList();
        abc.add("dd");
        abc.add(new Bank());
        System.out.println("abc集合的大小="+abc.size());
        for (int i=0;i<abc.size();i++){
            Object obj = abc.get(i);
            System.out.println(obj);
        }
        boolean flag = abc.contains("dd");
        System.out.println(flag);
        Object obj = abc.remove("dd");
        boolean flag1 = abc.contains("dd");
        System.out.println(flag1);
    }

}

LinkedList

LinkedList实现类实现时,采用链表数据结构,所以向LinkedList中插入和删除元素的速度较快,随机访问速度则相对较慢。

LinkedList常用方法

方法名说明
void addFirst(Object o)将指定元素o插入到列表起始位置
void addLast(Object o)将指定元素o添加到列表末尾处
Object removeFirst()移除并返回列表的首元素
Object removeLast()移除并返回列表的首末元素

List是一个线性表接口,而ArrayList、LinnkedList又是线性表的两种典型实现,ArrayList是基于数组的线性表,而LinkedList是基于链表的线性表。若对元素需快速删除与添加使用LinkedList更合适,若要对元素进行快速查找使用ArrayList更为合适。

四、Set集合

Set集合中的元素无序,且元素之间不能重复,set元素值可以是null。HashSet是Set接口最常用的实现类。HashSet按Hash算法实现存储集合中的元素,因为其具有良好的存储和查找性能。

实例:添加Cat对象到HashSet集合

public class HashSetTest {
    public static void main(String[] args) {
        HashSet ha = new HashSet();
        ha.add("java");
        ha.add(new Cat("加菲","黄色"));
        ha.add(new Cat("汤姆","蓝色"));
        ha.add(new Cat("加菲","黄色"));
        ha.add("java");
        System.out.println("HashSet对象集合"+ha);
    }
}

 

 这两条猫的名字和颜色一模一样,但他们的equals()返回值为false,hashCode()值也不相等,所以这两条猫不相同。如果两条猫相同的逻辑是他们的名字和颜色相同,则可通过重写Cat类的equals()和hashCode()

 实例:重写Cat的equals()和hashCode()

 @Override
    public boolean equals(Object obj) {
       if (obj==this){
           return true;
       }else {
            if(obj instanceof Cat) {
                Cat cat = (Cat)obj;
                if(this.name.equals(cat.name) && this.color.equals(cat.color)){
                    return true;
                }else {
                    return false;
                }
           }else {
                return false;
            }
       }
    }

    @Override
    public int hashCode() {
        return this.name.hashCode()*this.color.hashCode();
    }

 重写hashCode()方法的一般规则如下:

在程序运行时,同一个对象的hashCode()方法应该返回相同的值。

当两个对象通过equals()方法比较返回true时,这两个对象的hashCode()方法应该返回相等的值。

Iterator迭代器 

Iterator接口隐藏了各种Collection实现类的底层细节,该接口提供了遍历Colletion集合元素的统一编程接口。由于Set集合中存储的是无序的元素,因此无法再循环中按照下标获取Set集合中的元素,所以利用Itearator接口遍历Set集合中的元素尤为方便。

Iterator常用方法

方法名说明
boolean hasNext(Object o)如果被迭代的集合中的元素没有遍历完成,则返回true
Object next()返回集合中的下一个元素
void remove()将迭代器新返回的元素删除

 示例:Iterator迭代器应用案例

public class IteratorTest {
    public static void main(String[] args) {
        HashSet hs = new HashSet();
        hs.add(1);
        hs.add("ANDROID");
        hs.add(new Cat("加菲","粉色"));
        Iterator it = hs.iterator();
        while (it.hasNext()){
            Object obj = it.next();
            System.out.println(obj);
        }
    }
}

  

 五、Map集合

Map用于保存具有映射关系的数据。Map集合中保存着两组值,一组值用于保存Map里的key,另外一组值保存Map的value。key和value可以为null.key和value可以为任意类型的数据。Map的key不允许重复,即同一个Map对象的任何两个key通过equals()方法比较总是返回false。key和value间存在单向一对一关系,即通过指定的key总能找到唯一的,确定的value.从Map中取出数据时,只要给出指定的key,就可以取出对应的value。HashMap是Map接口最为常用的实现类,HashMap通过哈希吗对其内部的映射关系进行快速查找。

Map接口常用方法

方法名说明
put(K key,V value)向映射中添加一对key与value的映射关系
Object get(Object key)返回映射中key对应的value.如果该映射中不包含key,则返回null
putAll(Map map)将映射map所有的键值映射关系添加到当前映射
containsKey(Object key)如果此映射包含指定的键的映射关系,则返回true
containsValue(Obejct value)如果此映射将一个或多个映射到指定的value,则返回true
keySet()将该集合中的所有键对象以Set集合的形式返回
values()将该集合中的所有值对象以Collection集合的形式返回
remove(Object key)如果存在指定的键key,则移除该键的映射关系,并返回与该键对象对应的值对象,否则返回null
clear()从此映射中移除所有映射关系
isEmpty()如果此映射未包含键-值映射关系,则返回true
size()返回此映射中的键-值映射关系的数量

 Map底层是没有Iterator迭代器实现的,keySet()该方法显得尤为重要,可以通过set的Iterator更好地帮组我们迭代Map实现类HashMap

HashMap应用示例:

public class HashMapTest {
    public static void main(String[] args) {
        Map hm = new HashMap();
        hm.put("java","demo");
        hm.put("中国","北京");
        hm.put(1,"one");
        hm.put(true,"正确");
        System.out.println("=======HashMap集合添加元素后=========");
        System.out.println(hm);
        Object value = hm.get("java");
        System.out.println("key值为java对应的value值为"+value);
        System.out.println("HashMap集合的大小="+hm.size());
        System.out.println("遍历HashMap集合==");
        Set set = hm.keySet();
        Iterator it = set.iterator();
        while (it.hasNext()){
            Object key = it.next();
            Object val = hm.get(key);
            System.out.println("键="+key+"\t"+"值="+val);
        }
    }
}

HashMap允许出现空值,空键,线程异步,效率较高,继承自AbstractMap 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值