Java集合框架

     集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。任何集合框架都包含三大内容:对外的接口、接口的实现和对集合运算的算法。

va的集合框架最全详解(图)http://davidisok.iteye.com/blog/2106563

下图是简化的集合框架关系图:

  • Collection接口

       Collection 接口是 java 集合框架里的一个根接口,也是 List、Set 和 Queue 接口的父接口。Collection 接口中定义了操作 List、Set 和 Queue 的方法——增删改查。

  • Map接口

       Map 接口也是一个非常重要的集合接口,用于存储键/值对。Map 中的元素都是成对出现的,键值对就像数组的索引与数组的内容的关系一样,将一个键映射到一个值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。Map中的键值对以Entry类型的对象实例形式存在。

  • List接口和ArrayList类

List是接口,不能实例化,需要具体的类来实例化。

List集合中的对象(元素)是按顺序存储的,内容可以重复。

List实现的接口有:ArrayList(实现动态数组),Vector(实现动态数组),LinkedList(实现链表),Stack(实现堆栈)。

ArrayList擅长于随机访问,但插入和删除较慢(数组,有序)

LinkedList擅长于插入删除,但随机访问比较慢(链表,无序)

ArrayList类实现一个动态增长的数组,可以存储不同类型的对象,而数组只能存储特定数据类型的值。

package collectionTest;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.Iterator;

import java.util.List;

public class ListTest {

      //泛型规定了集合元素的类型

      public List<Student> students;

      public ListTest(){

            this.students = new ArrayList<Student>();

      }

      //添加

      public void testAdd(){

            Student student = new Student("1", "tom");

            students.add(student);

            

            Student temp = students.get(0);

            System.out.println(temp.id+" "+temp.name);

            //System.out.println(temp.getId()+" "+temp.getName());

            System.out.println("-----");

            

            Student st2 = new Student("2", "李四");

            students.add(1, st2);

            Student temp2 = students.get(0);

            Student temp0 = students.get(1);

            System.out.println(temp2.id+" "+temp2.name);

            System.out.println(temp0.id+" "+temp0.name);

            //对象数组的形式

             Student[] studentArr = { new Student("3", "王五"), new Student("4", "马六") };

             //Array类操作数组,asList返回 一个受指定数组支持的固定大小的List

            students.addAll(Arrays.asList(studentArr));

          Student temp3 = students.get(2);

        Student temp4 = students.get(3);

        System.out.println("添加了学生:" + temp3.id + ":" + temp3.name);

        System.out.println("添加了学生:" + temp4.id + ":" + temp4.name);

        Student[] student2 = { new Student("5", "周七"), new Student("6", "赵八") };

        students.addAll(2, Arrays.asList(student2));

        Student temp5 = students.get(2);

        Student temp6 = students.get(3);

        System.out.println("添加了学生:" + temp5.id + ":" + temp5.name);

        System.out.println("添加了学生:" + temp6.id + ":" + temp6.name);

        System.out.println("-----");

      }
      //获取List中的元素

      public void testGet(){

            int size = students.size();

            for(int i = 0;i < size;i++){

                  Student st = students.get(i);

                   System.out.println("get学生:" + st.id + ":" + st.name);

            }

             System.out.println("-----");

      }

      //通过迭代器来遍历并选择List中的对象

      public void testIterator(){

            Iterator<Student> it = students.iterator();

              System.out.println("有如下学生(通过迭代器访问):");

              while(it.hasNext()){

                    Student st = it.next();

                    System.out.println("学生:" + st.id + ":" + st.name);

              }

              System.out.println("-----");

      }

      //通过Foreach来访问集合元素

      public void testForeach(){

             System.out.println("有如下学生(通过foreach访问):");

             for(Student obj : students){

                   System.out.println("学生:" + obj.id + ":" + obj.name);

             }

             System.out.println("-----");

      }

      //修改集合元素

      public void testModify(){

            students.set(3, new Student("3", "wang jiu"));

      }
      //删除集合元素

         public void testRemove() {

              Student st = students.get(4);

              System.out.println("我是学生:" + st.id + ":" + st.name + ",我即将被删除");

              students.remove(st);

              System.out.println("成功删除学生!");

              testForeach();

          }

      /**

       * @param args

       */

      public static void main(String[] args) {

            // TODO Auto-generated method stub

            ListTest lt = new ListTest();

            lt.testAdd();

            lt.testGet();

            lt.testIterator();

            lt.testForeach();

            lt.testModify();

            lt.testRemove();

      }

}
  • Set接口和HashSet类

Set集合里面的元素是无序的,并且元素不重复,被称为集。

HashSet 由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。

package collectionTest;

import java.util.HashSet;

import java.util.Set;


public class PD {

    public String id;

    public String name;

    //泛型是规定了集合元素的类型

    public Set<Student> students;

    public PD(String id, String name){

        this.id = id;

        this.name = name;

        this.students = new HashSet<Student>();

    }

}
package collectionTest;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.List;

import java.util.Scanner;

public class SetTest {

    public List<Student> students;

    public SetTest() {

        students = new ArrayList<Student>();

    }

    /*

     * 用于往students中添加学生

     */

    public void testAdd() {

        //创建一个学生对象,并通过调用add方法,添加到学生管理List中

        Student st1 = new Student("1", "张三");

        students.add(st1);

        //添加到List中的类型均为Object,所以取出时还需要强转

        Student st2 = new Student("2","李四");

        students.add(st2);

        Student[] student = {new Student("3", "王五"),new Student("4", "马六")};

        students.addAll(Arrays.asList(student));

        Student[] student2 = {new Student("5", "周七"),new Student("6", "赵八")};

        students.addAll(Arrays.asList(student2));

    }

    /**

     * 通过for each 方法访问集合元素

     * @param args

     */

    public void testForEach() {

        System.out.println("有如下学生(通过for each):");

        for(Object obj:students){

            Student st = (Student)obj;

            System.out.println("学生:" + st.id + ":" + st.name);

        }

    }

    public static void main(String[] args){

        SetTest st = new SetTest();

        st.testAdd();

        st.testForEach();

        PD pd = new PD("1","张老师");

        System.out.println("请:" + pd.name + "选择小组成员!");

        //创建一个 Scanner 对象,用来接收从键盘输入的学生 ID

        Scanner console = new Scanner(System.in);

        for(int i = 0;i < 3; i++){

            System.out.println("请输入学生 ID");

            String studentID = console.next();

            for(Student s:st.students){

                if(s.id.equals(studentID)){

                    pd.students.add(s);

                }

            }

        }

        st.testForEachForSer(pd);

        // 关闭 Scanner 对象

        console.close();

    }

    //打印输出,老师所选的学生!Set里遍历元素只能用foreach 和 iterator

    //不能使用 get() 方法,因为它是无序的,不能想 List 一样查询具体索引的元素

    public void testForEachForSer(PD pd){

        for(Student s: pd.students) {

        System.out.println("选择了学生:" + s.id + ":" + s.name);

        }

    }

}
  • HashMap类

HashMap 是基于哈希表的 Map 接口的一个重要实现类。HashMap 中的 Entry 对象是无序排列的,Key 值和 value 值都可以为 null,但是一个 HashMap 只能有一个 key 值为 null 的映射(key 值不可重复)

package collectionTest;

public class Course {

    public String id;

    public String name;

    public Course(String id, String name){

        this.id = id;

        this.name = name;

    }

}

package collectionTest;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;
public class MapTest {
      //用来承装课程类型对象
      public Map<String,Course> courses;
      
      //初始化courses
       public MapTest(){
             this.courses = new HashMap<String, Course>();
       }
       /**
           * 测试添加:输入课程 ID,判断是否被占用
           * 若未被占用,输入课程名称,创建新课程对象
           * 并且添加到 courses 中
           * @param args
           */
       public void testPut(){
             //创建一个Scanner对象
             Scanner console = new Scanner(System.in);
              for(int i = 0 ; i < 3;i++){
                    System.out.println("请输入课程ID:");
                    String ID = console.next();
                    //判断该ID是否被占用
                    Course cr = courses.get(ID);
                    if(cr == null){
                          System.out.println("请输入课程name:");
                          String name = console.next();
                          //创建新课程
                          Course newCourse = new Course(ID,name);
                          //添加课程到Map
                          courses.put(ID, newCourse);
                          System.out.println("添加了课程:"+courses.get(ID).id+" "+courses.get(ID).name);
                    }else{
                          System.out.println("该课程已经被占用!");
                          continue;
                    }
              }
              System.out.println("--------");
       }
      
       //查出课程
       public void testKeySet(){
             //ketSet()方法返回map中所有键的set集合
             Set<String> keySet = courses.keySet();
             //遍历keySet中的每个键,通过get方法取得每个键对应的Value
             for(String crID : keySet){
                   Course cr = courses.get(crID);
                   System.out.println("课程是:"+cr.id+cr.name);
             }
             System.out.println("--------");
       }
      //删除map中的映射
       public void TestRemove(){
             Scanner console = new Scanner(System.in);
             while(true){
                   System.out.println("请输入要删除的课程的ID:");
                   String ID = console.next();
                   Course cr = courses.get(ID);
                   //判断该ID是否存在对应的课程对象
                   if(cr == null){
                         System.out.println("该ID不存在!");
                         continue;
                   }
                   //删除映射
                   courses.remove(ID);
                   System.out.println("删除了课程:"+cr.id+cr.name);
                   break;
             }
             System.out.println("--------");
       }
      
       //通过entrySet()来遍历map
       public void testEntrySet(){
             //entrySet()返回map中的所有键值对
             Set<Entry<String, Course>> entrySet = courses.entrySet();
             for(Entry<String, Course> entry : entrySet){
                   System.out.print("键:" + entry.getKey());
                   System.out.println(" 值:" + entry.getValue().name);
             }
             System.out.println("--------");
       }
      
       //通过Put()方法来修改Map
       public void testModify(){
             Scanner console = new Scanner(System.in);
             while(true){
                   System.out.println("请输入要修改的课程的ID:");
                   String crID = console.next();
                   Course course = courses.get(crID);
                   if(course == null){
                         System.out.println("该ID不存在,请重新输入:");
                         continue;
                   }
                   System.out.println("要修改的课程是:" + course.name);
                  
                   System.out.println("请输入新课程名字:");
                   String name = console.next();
                   Course newCourse = new Course(crID,name);
                   courses.put(crID, newCourse);
                   System.out.println("成功修改了课程!");
                   break;
             }
             System.out.println("--------");
       }
      
      public static void main(String[] args) {
            MapTest mt = new MapTest();
            mt.testPut();
            mt.testKeySet();
            mt.testKeySet();
            mt.testKeySet();
            mt.TestRemove();
            mt.testKeySet();
            mt.testEntrySet();
            mt.testModify();
            mt.testEntrySet();
      }
}
原文地址:https://www.cnblogs.com/lingqinyu/p/8877762.html