Java集合框架初步认识

Java 集合框架

一:集合类简介

Java集合就像一种容器,可以把多个对象(实际上是对象的引用)“丢进”该容器中。从Java 5增加了泛型以后,Java集合可以记住容器中对象的数据类型,使得编码更加简洁、健壮。所有集合类都位java.util包下,但支持多线程的集合类位于java.util.concurrent包下。

如图(图片从别的博文摘取,谢谢您的精心绘制)(图片含义:黄色:接口,绿色:抽象接口,蓝色:实现类):
在这里插入图片描述在这里插入图片描述

如图可以看出:java集合框架主要包含两种类型的容器,一种是集合(collection),存储一个元素的集合。一种是图(map),存储键值对映射。collection集合有3种子类型(List,Queue,Set),再往下是抽象类,最后实现类,常用的有:ArrayList,LinkedArrayList,HashSet,LinkedHashSet,HashMap,LinkedHashMap
集合框架是一个用来代表和操纵集合的同一款框架,所有集合框架包含如下内容:
1 接口 :代表集合的抽象数据类型,如collection,list,set,map,定义为接口,方便以不同的方式操作集合对象。
2 实现类:集合接口的具体实现,是可重复使用的数据结构。如Arraylist,linedlist,hashmap,hashset。
3 算法: 实现集合接口对象中的算法。如搜索排序,这些算法多为多态,在相似的接口上有着不同的实现。

二 java集合常见接口及实现类

1 collections接口常见方法(来源于java API)

在这里插入图片描述
1) collections实现接口及子类
集合的顶级接口collections
下面主要有三个接口,分别是:list,set,queue。

① list 的主要实现类:arraylist,linkedlist,vector
       特点:有序,有下标,可重复。
       ArrayList底层通过数组实现,LikedList底层通过链表实现。
② set的主要实现类:HashSet,LinkedHashSet,TreeSet
	 特点:无序(LinkedHashSet除外),无下标,不可重复
	 HashSet底层通过哈希表实现,LinkedHashSet底层通过哈希表+链表实现(链式哈希级)Treeset底层
	 通过树结构实现
③ Queue(队列Queue是一个队列集合,队列通常是指“先进先出”(FIFO)的容器。新元素插入(offer)到队列
的尾部,访问元素(poll)操作会返回队列头部的元素。通常,队列不允许随机访问队列中的元素。
		主要实现类:ArrayDeque、LinkedList、PriorityQueue。

三 Map集合

Map接口采用键值对Map<K,V>的存储方式,保存具有映射关系的数据,因此,Map集合里保存两组值,一组值用于保存Map里的key,另外一组值用于保存Map里的value,key和value可以是任意引用类型的数据。key值不允许重复,可以为null。如果添加key-value对时Map中已经有重复的key,则新添加的value会覆盖该key原来对应的value。常用实现类有HashMap、LinkedHashMap、TreeMap等。

Map常见方法(来源于API)如下:
在这里插入图片描述

1)HashMap和HashTable
HashMap与Hashtable是Map接口的两个典型实现,它们之间的关系完全类似于ArrayList与Vertor。HashTable是一个古老的Map实现类,它提供的方法比较繁琐,目前基本不用了。

区别:1 HashMap是线程不安全,HashTable是线程安全的。
     2 HashMap可以使用null值最为key或value;Hashtable不允许使用null值作为key和value,如果把
     null放进HashTable中,将会发生空指针异常。

四遍历集合中的数据

1 遍历ArrayList


import java.util.*;
 
public class Test{
 public static void main(String[] args) {
     List<String> list=new ArrayList<String>();
     list.add("Hello");
     list.add("World");
     list.add("HAHAHAHA");
     //第一种遍历方法使用 For-Each 遍历 List
     for (String str : list) {            //也可以改写 for(int i=0;i<list.size();i++) 这种形式
        System.out.println(str);
     }
 
     //第二种遍历,把链表变为数组相关的内容进行遍历
     String[] strArray=new String[list.size()];
     list.toArray(strArray);
     for(int i=0;i<strArray.length;i++) //这里也可以改写为  for(String str:strArray) 这种形式
     {
        System.out.println(strArray[i]);
     }
     
    //第三种遍历 使用迭代器进行相关遍历
     
     Iterator<String> ite=list.iterator();
     while(ite.hasNext())//判断下一个元素之后有值
     {
         System.out.println(ite.next());
     }
 }
}

2 遍历Map


import java.util.*;
 
public class Test{
     public static void main(String[] args) {
      Map<String, String> map = new HashMap<String, String>();
      map.put("1", "value1");
      map.put("2", "value2");
      map.put("3", "value3");
      
      //第一种:普遍使用,二次取值
      System.out.println("通过Map.keySet遍历key和value:");
      for (String key : map.keySet()) {
       System.out.println("key= "+ key + " and value= " + map.get(key));
      }
      
      //第二种
      System.out.println("通过Map.entrySet使用iterator遍历key和value:");
      Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();
      while (it.hasNext()) {
       Map.Entry<String, String> entry = it.next();
       System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
      }
      
      //第三种:推荐,尤其是容量大时
      System.out.println("通过Map.entrySet遍历key和value");
      for (Map.Entry<String, String> entry : map.entrySet()) {
       System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
      }
    
      //第四种
      System.out.println("通过Map.values()遍历所有的value,但不能遍历key");
      for (String v : map.values()) {
       System.out.println("value= " + v);
      }
     }
}

参考
1 https://blog.csdn.net/wangwei_620/article/details/82049502
2 https://www.cnblogs.com/dxflqm/p/11867611.html
3 https://www.runoob.com/java/java-collections.html
4 https://www.cnblogs.com/bingyimeiling/p/10255037.html

猜你喜欢

转载自blog.csdn.net/weixin_46089066/article/details/105542819