zoukankan      html  css  js  c++  java
  • 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();
          }
    }
    
  • 相关阅读:
    mySQL 规格严格
    单点登录JASIG研究分析
    Liferay 5.1.1 安装与整合CAS
    使用 CAS 在 Tomcat 中实现单点登录
    单点登录JASIG研究分析
    Liferay 5.1.1 安装与整合CAS
    SSO(Single Signon) in Action
    使用 CAS 在 Tomcat 中实现单点登录
    Netbeans 插件模块(Plugin Module)的开发
    NetBeans 时事通讯(刊号 # 22 Aug 18, 2008)
  • 原文地址:https://www.cnblogs.com/lingqinyu/p/8877762.html
Copyright © 2011-2022 走看看