JAVA笔记十:集合类

Java.util包中提供了一些集合类,这些集合类又被称为容器。集合类与数组不同之处是:数组长度是固定的,集合长度是可变的;数组存放基本的数据类型,集合来存放对象的引用。

常用的集合有List集合、Set集合、Map集合,其中List集合与Set集合继承了Collection接口。上述集合类的继承关系如下:

 一、Collection接口

Collection接口是层次结构中的根接口,构成Collection的单位称为元素。Collection接口通常不直接使用,但该接口提供了添加、删除、管理数据的方法,由于List与Set接口都继承Collection接口,所以这些方法对于List集合与Set集合是通用的。

Collection接口常用的方法如下:

 对于集合的遍历,都通过迭代器(Iterator)来实现。

例1、使用Collection接口创建一个集合对象,并添加元素

package cn;
import java.util.*;

public class Collection {
    public static void main(String args[])
    {
        //实例化集合对象Collection
        java.util.Collection<String> list = new ArrayList<>();
        list.add("aa");
        list.add("bb");
        list.add("cc");
        //创建迭代器
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext())
        {
            String str = (String)iterator.next();
            System.out.println(str);
        }

    }
}

这里使用Collection接口创建对象,并通过迭代器访问集合元素,需要注意的是。这与之前(继承2)中的泛型数据类型很相似,但不同点是该例子中创建的是Collection接口对象,访问只能通过蝶迭代器,而泛型数据类型所创建的对象是ArraysList,访问可以通过get访问。

二、List集合

(1)、List接口

List集合中的元素允许重复,可以通过索引访问集合中的元素。

List接口继承了Collection接口,因此包含Collection接口中的所有方法。

(2)、List接口实现类

List接口实现类有ArrayList类、LinkedList类

  • ArrayList类实现了可变数组,允许保存所有元素,包括null,可以通过索引位置来对集合的快速访问,缺点是执行效率慢
  • LinkedList类采用链表保存对象,优点是便于向集合插入和删除元素,但对于随机访问,使用LinkedList效率要比List集合低

语法格式:

        List<E>  list = new ArrayList<>();

        List<E>  list = new LinkedList<>();

其中E为对象

 例1、使用List创建一个ArrayList集合对象,并添加元素

public static void List()
    {
        List<String> list = new ArrayList<>();
        String str[] = {"aa","bb","cc"};
        for (String element:str)
            list.add(element);
        for (String element:list)
            System.out.println(element);
        for (int i = 0;i< list.size();i++)
            System.out.println(list.get(i));
    }

三、Set集合

Set集合中的对象不按特定的方式排序,Set集合中不能包含重复对象。Set集合由Set接口和Set接口的实现类组成,Set接口继承了Collection接口,故包含Collection接口中的所有方法。

(2)、Set接口实现类

Set接口实现类有HashSet类与TreeSet类。

  • HashSet类实现了Set接口,由哈希表支持。它不保证Set集合的迭代顺序,特别的它不保证该顺序恒久不变。此类允许使用null元素
  • TreeSet类不仅实现了Set接口,还实现了java.util.SortedSet接口,所以TreeSet类实现的Set集合在遍历结合时按照自然方式递增排序。 

 例1、使用TreeSet类创建一个Set类对象,并用迭代器遍历输出

package cn;
import java.util.TreeSet;

public class Set {
    public static void main(String[] args)
    {
        java.util.Set<Integer> set = new TreeSet<>();
        set.add(1);
        set.add(-1);
        set.add(3);
        java.util.Iterator<Integer> iterator = set.iterator();
        while(iterator.hasNext())
            System.out.println(iterator.next());

    }
}

//result: -1 1 3

例2、使用TreeSet类创建TreeSet对象,并测试TreeSet类中的方法

四、Map集合

Map集合没有继承Collection接口,其提供的是“键值对”的映射,Map集合中不能包含相同的key,每个key只能映射一个value。key决定了存储对象在映射中的存储位置,但不是由key本身所决定,而通过散列码所决定,散列码通常作为一个偏移量,该偏移量对应分配给内存空间的起始位置。

Map集合类包括Map接口与Map接口的所有实现类。每个key最多映射一个value值。

(2)、Map接口实现类

例1、

import java.time.chrono.IsoChronology;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;

public class Map {
    public static void main(String args[])
    {
        HashMap<Integer,String> hashMap = new HashMap<>();
        hashMap.put(1,"a");
        hashMap.put(2,"b");
        hashMap.put(3,"c");
        //利用hashMap.keySet()生成一个Set集合,后利用Set迭代器返回所有的key值
        Set<Integer> set = hashMap.keySet();
        Iterator<Integer>iterator = set.iterator();
        //利用hashMap.values生成一个对象为values的Collection集合,后利用Collection迭代器返回所有的values值
        Collection<String> collection = hashMap.values();
        Iterator<String>stringIterator = collection.iterator();
        System.out.println("key值:");
        for (Integer element:set)
            System.out.print("  "+element+"  ");
        System.out.print("\n"+"value值:"+"\n");
        while (stringIterator.hasNext())
        {
            String element = stringIterator.next();
            System.out.print("  "+element+"  ");
        }
    }
}

需要注意的是key、value的值分别要通过hashMap中的keySet方法、values方法转化为Set集合、Collection集合通过迭代器获取或foreach获取。

1、如果直接打印输出Map

System.out.printfln(hashMap)

输出结果:

2、containsKey(Object key)方法,来判断此映射是否包含指定的Key

 if (hashMap.containsKey(1))
           System.out.println("1存在于hashMap中");
//result  ture

 3、containsValues(Object values)方法,来判断此映射是否包含指定的values

hashMap.containsValue("b")
//result ture

4、利用以下代码可以判断输入的key、values其是否为一个特定的键值对(在hashMap中)

 System.out.println(hashMap);
        Scanner Str = new Scanner(System.in);
        Scanner anInt = new Scanner(System.in);
        String str = Str.nextLine();
        int i = anInt.nextInt();
       if (hashMap.containsValue(str))
       {
           if (hashMap.get(i).equals(str))
               System.out.println("{"+i+"="+str+"}"+"存在且为一个键值对");
           else
               System.out.println("{"+i+"="+str+"}"+"该键值对不存在");
       }
       else
           System.out.println("{"+i+"="+str+"}"+"该键值对不存在");

 

       

                                                                                                      笔记参考《Java从入门到精通》

猜你喜欢

转载自blog.csdn.net/m0_61598337/article/details/128627343