美文网首页
java系列16:集合

java系列16:集合

作者: 3e1094b2ef7b | 来源:发表于2017-06-18 14:41 被阅读0次

    一、集合

    1、什么是集合?

    集合是将多个元素组成一个单元的对象。
    是一种操作批量数据的工具。

    为了满足不同场合的需要,java.util包中包含有一系列集合类;
    如:ArrayList类、LinkedList类、Vector类、HashMap类等等。

    集合类中只能存放对象,而不能存放原始数据类型的元素,所以当有原始数据类型需要存放时,只能将其转换成相应的包装类对象。

    Java集合框架,为我们提供了一套性能优良、使用方便的接口和类,我们不必再重新发明轮子,只需学会如何使用它们,就可以处理实际应用中出现的问题了。

    Java集合框架的内容

    任何对象加入集合类后,自动转变为Object类型;取出时,需要进行强制类型转换,恢复为特定的类型。

    使用集合框架的注意事项

    2、集合与数组的区别

    数组:

    • 长度是固定的(一经创建,就不可再改变)
    • 只能存放相同数据类型的元素
    • 数组本身提供相应的工具操作数据

    集合:

    • 集合的长度没有限制,可以存放任意多的元素
    • 元素的数据类型也可以不同
    • 集合还提供一系列操纵数据的方法,如存储、检索等等;可以使用工具Collections自由操作集合中数据

    二、ArrayList

    ArrayList是长度可变的对象引用数组,称为动态数组。
    随着元素的添加,元素数目的增大,数组容量也会随之自动扩展。

    ArrayList

    访问和遍历数组元素时,ArrayList的性能优越。

    ArrayList类继承了AbstractList类并实现了List接口。

    3种构造方法 常用方法

    例1:

    package test;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class TestArrayList {
        public static void main(String[] args) {
            List l = new ArrayList();
            l.add(12); //int
            l.add(3.56f); //float
            l.add(4.13636215d); //double
            l.add("abc"); //String
    
            System.out.println("集合大小:"+l.size());
    
            Object o = l.get(1);
            String a = o.toString();
            System.out.println("编号为1的数据:"+a);
    
            l.remove(2);
            l.add("cde"); //String
            //显示删除编号为2的数据后,集合中余下的所有内容。
            for (int i = 0; i < l.size(); i++) {
                Object o1 = l.get(i);
                System.out.println("所有数据:"+o1.toString());
            }
    
            System.out.println("判断集合中数据是否为空:"+l.isEmpty());
    
            System.out.println("判断集合中指定数据 12 是否存在:"+l.contains(12));
            if(l.indexOf(12) < 0) {
                System.out.println("12在集合中不存在");
            } else {
                System.out.println("12在集合中存在,索引为:" + l.indexOf(12));
            }
        }
    }
    
    运行结果

    例2:

    package test;
    
    import java.util.ArrayList;
    
    public class TestArrayList {
        public static void main(String[] args) {
            ArrayList al = new ArrayList<>();
            for (int i = 0; i < 10; i++) {
                Integer num = new Integer(i);
                al.add(num);
            }
            System.out.println("数组中的元素:");
            for (int i = 0; i < al.size(); i++) {
                // System.out.println(al.get(i));
                Integer temp = (Integer) al.get(i);
                System.out.println(temp);
            }
        
            System.out.println("********************");
            al.clear();
            System.out.println("数组被清空后的情况:");
            System.out.println("数组长度:"+al.size());
            if(al.isEmpty()) {
                System.out.println("数组现在为空");
            } else {
                System.out.println("数组现在不为空");
            }
        }
    }
    
    运行结果

    例3:

    开发一套小型的新闻管理系统,要求如下:
    1、可以存储各类新闻标题(包含ID、名称、创建者、创建时间)
    2、可以获取新闻标题的总数
    3、可以逐条打印每条新闻标题的名称

    解题思路
    // NewsTitle.java
    package test;
    
    import java.util.Date;
    
    public class NewsTitle {
        private int id; // 新闻id
        private String titleName; // 新闻名称
        private String creater; // 新闻创建者
        private Date createTime; // 创建时间
        public NewsTitle(int id, String titleName, String creater, Date createTime) {
            super();
            this.id = id;
            this.titleName = titleName;
            this.creater = creater;
            this.createTime = createTime;
        }
        public String getTitleName() {
            return titleName;
        }
        public void setTitleName(String titleName) {
            this.titleName = titleName;
        }
    }
    
    // TestNewsTitle.java
    package test;
    
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    
    public class TestNewsTitle {
        public static void main(String[] args) {
            NewsTitle car = new NewsTitle(1, "汽车", "管理员", new Date());
            NewsTitle people = new NewsTitle(2, "人", "管理员", new Date());
        
            List newsTitleList = new ArrayList();
            newsTitleList.add(car);
            newsTitleList.add(people);
            System.out.println("新闻数目:" + newsTitleList.size());
            print(newsTitleList);
        }
    
        private static void print(List newsTitleList) {
            for (int i = 0; i < newsTitleList.size(); i++) {
                NewsTitle newsTitle = (NewsTitle) newsTitleList.get(i);
                System.out.println((i+1) + ":" + newsTitle.getTitleName());
            }
        }
    }
    
    运行结果

    三、LinkedList

    1、LinkedList类继承了AbstractSequentialList类,并实现了List接口
    2、LinkedList 类用于创建链表数据结构
    3、插入或者删除元素时,它提供更好的性能。与ArrayList相比,如果需要频繁地添加和删除元素,LinkedList的性能更加优越。
    4、链表中元素的数量不受任何限制,可以随意地添加和删除。

    构造方法 常用方法1 常用方法2

    例1:

    升级这套小型的新闻管理系统,要求如下:
    1、可以添加头条新闻标题
    2、可以删除末条新闻标题

    分析思路
    // NewsTitle.java
    package test;
    
    import java.util.Date;
    
    public class NewsTitle {
        private int id; // 新闻id
        private String titleName; // 新闻名称
        private String creater; // 新闻创建者
        private Date createTime; // 创建时间
        public NewsTitle(int id, String titleName, String creater, Date createTime) {
            super();
            this.id = id;
            this.titleName = titleName;
            this.creater = creater;
            this.createTime = createTime;
        }
        public String getTitleName() {
            return titleName;
        }
        public void setTitleName(String titleName) {
            this.titleName = titleName;
        }
    }
    
    // TestNewsTitle.java
    package test;
    
    import java.util.Date;
    import java.util.LinkedList;
    
    public class TestNewsTitle {
        public static void main(String[] args) {
            NewsTitle car = new NewsTitle(1, "汽车", "管理员", new Date());
            NewsTitle people = new NewsTitle(2, "人", "管理员", new Date());
        
            // List newsTitleList = new LinkedList(); 这样写,无法调用LinkedList的方法
            LinkedList newsTitleList = new LinkedList();
            newsTitleList.addFirst(car);
            newsTitleList.addLast(people);
    
            NewsTitle firstNews = (NewsTitle) newsTitleList.getFirst();
            System.out.println("头条新闻标题是:" + firstNews.getTitleName());
            NewsTitle lastNews = (NewsTitle) newsTitleList.getLast();
            System.out.println("末条新闻标题是:" + lastNews.getTitleName());
        
            newsTitleList.removeFirst();
            newsTitleList.removeLast();
        }
    }
    
    运行结果

    例2:

    package test;
    
    import java.util.LinkedList;
    
    public class TestLinkedList {
        public static void main(String[] args) {
            LinkedList ll = new LinkedList();
            for (int i = 0; i < 10; i++) {
                Double temp = new Double(Math.sqrt(i));
                ll.add(temp);
            }
            System.out.println("链表中的元素:");
            for (int i = 0; i < ll.size(); i++) {
                System.out.println(ll.get(i));
            }
            System.out.println("******************");
            ll.removeFirst();
            ll.removeLast();
            System.out.println("删除第1个元素和最后1个元素后的链表:");
            for (int i = 0; i < ll.size(); i++) {
                System.out.println(ll.get(i));
            }
        }
    }
    
    运行结果

    四、vector

    Vector类与ArrayList类和LinkedList类很相似,最大的区别在于Vector是线程同步的。
    如果在多线程的程序中要使用到集合框架,并且不希望线程与线程之间相互干扰,那么Vector是不错的选择。

    Vector类继承于AbstractList类,并实现了List接口。

    构造方法 常用方法1 常用方法2

    例:

    package test;
    
    import java.util.Vector;
    
    public class TestVector {
        public static void main(String[] args) {
            Vector v = new Vector();
        
            v.addElement("C");
            v.addElement("Java");
            v.addElement("Python");
            System.out.println(v.toString());
        
            v.removeElement("Java");
            System.out.println(v.toString());
        }
    }
    
    运行结果

    五、Map和HashMap

    Map接口用于维护“键-值对”的关联性,可以通过键查找值;HashMap是Map接口的一个具体实现类。

    对于HashMap来说,不存在索引,也就是说不可以通过索引来访问元素,只能通过键去访问值。
    由于没有索引,所以HashMap中元素的存放是没有顺序的。

    如要快速检索元素的话,HashMap性能优越。

    HashMap类继承了AbstractMap类,并实现了Map接口。

    HashMap构造方法 HashMap常用方法

    例:

    package test;
    
    import java.util.HashMap;
    
    public class TestHashMap {
        public static void main(String[] args) {
            HashMap hm = new HashMap();
        
            hm.put("93-07", "张三");
            hm.put("84-12", "李四");
            hm.put("94-02", "王五");
            System.out.println(hm.toString());
        
            System.out.println("学号是84-12的学生是:" + hm.get("84-12"));
        
            hm.remove("93-07");
            System.out.println(hm.toString());
        }
    }
    
    运行结果

    五、Set和HashSet

    HashSet:对象不能相同。

    HashSet如何判断2个对象是否相同?
    答:在内部比较的时候,会调用这个对象的2个方法:equals和hashcode。

    相关文章

      网友评论

          本文标题:java系列16:集合

          本文链接:https://www.haomeiwen.com/subject/omiiqxtx.html