Java集合框架部分体系结构

集合框架图

Java集合框架提供了一套性能优良、使用方便的接口和类,它们位于java.util包中。

java 知乎 集合框架 java中集合框架的层次结构_List


Java的集合类主要由两个接口派生而出:Collection和Map,Collection和Map是Java集合框架的根接口,这两个接口又包含了一些子接口或实现类。

其中,Collection 是一组无序、可重复的数据,Map接口是键-值对象,实现一一对应。

Collection接口包含了List和Set两大分支,其中:

1、List集合是有序集合,集合中的元素可以重复,访问集合中的元素可以根据元素的索引来访问。

2、Set集合是无序集合,集合中的元素不可以重复,访问集合中的元素只能根据元素本身来访问。

Map

Map集合中保存Key-value对形式的元素,访问时只能根据每项元素的key来访问其value。

Collection接口

Collection接口中的方法如下:
1、add()方法是添加一个元素到集合中;
2、addAll()方法将指定集合中的所有元素添加到集合中;
3、contains()方法检测集合中是否包含指定的元素;
4、toArray()方法返回一个表示集合的数组。

Iterator()函数:主要作用是返回一个Iterator接口。通常,我们通过Iterator迭代器来遍历集合

Iterator itr=newsLIst.iterator();
        while(itr.hasNext()){
            System.out.println(itr.next());
        }

List接口:

实现List接口的集合主要有:ArrayList、LinkedList
(1)ArrayList接口
ArrayList是一个动态数组,它的特点是内部元素的随机访问速度快。

每一个ArrayList都有一个初始容量,该容量代表了数组的大小。随着容器中的元素不断增加,容器的大小也会随着增加。在每次向容器中增加元素的同时都会进行容量检查,当快溢出时,就会进行扩容操作。

ArrayList常用方法

java 知乎 集合框架 java中集合框架的层次结构_集合框架_02

示例:

public class TestNews {
    News[] allNews=new News[10];
    //一旦超过了,就需要数组扩容
    //一旦过少,就需要截取多于的部分
    public static void main(String[] args) {
        ArrayList newsLIst=new ArrayList();
        News news1=new News(1,"我好困","sam");
        News news2=new News(2,"我好饿","sam");
        News news3=new News(3,"我好渴","sam");
        News news4=new News(4,"我好累","sam");
        newsLIst.add(news);//在集合中增加元素
        System.out.println(newsLIst.size());
        newsLIst.remove(news);//从集合中删除元素
        newsLIst.add(news);
        System.out.println(newsLIst.get(0));//根据下标查找元素
        newsLIst.set(0,1);//根据下标修改元素
        System.out.println(newsLIst.get(0));
        newsLIst.add(news1);
        newsLIst.add(news2);
        newsLIst.add(news3);
        newsLIst.add(news4);
        System.out.println(newsLIst.size());
    }
}
//for方法
        for (int i = 0; i < newsLIst.size(); i++) {
            System.out.println(newsLIst.get(i));
        }
        //增强for
        int i=1;
        for (Object obj:newsLIst){
            System.out.println("第"+i+++"条"+obj);
        }
        //迭代器遍历
        Iterator itr=newsLIst.iterator();
        while(itr.hasNext()){
            System.out.println(itr.next()+"!!!");
        }

(2)LinkedList
LinkedList基于双向链表实现,它对元素的随机访问性能差,但是在插入和删除元素时表现出色。
由于实现的方式不同,LinkedList不能随机访问,它所有的操作都是要按照双重链表的需要执行。在列表中索引的操作将从开头或结尾遍历列表。

LinkedList的常用方法

java 知乎 集合框架 java中集合框架的层次结构_System_03

public class TestLink {
    public static void main(String[] args) {
        LinkedList list=new LinkedList();
        News news1=new News(1,"我好困","sam");
        News news2=new News(2,"我好饿","sam");
        News news3=new News(3,"我好渴","sam");
        News news4=new News(4,"我好累","sam");
        list.add(news1);
        list.addLast(news2);
        list.addFirst(news3);
        list.add(news4);
        list.remove();//等同于removeFirst()
        list.element();//等同于getFirst()
        list.offer(1);//等同于add(1)
        list.peek();//等同于getFirst(),不同点在于当前为空就返回空
        list.poll();//弹出首元素,相当于removeFirst
        list.pop();//等同于removeFirst()
        list.push("abc");//等同于addFirst()
        for (Object o: list){
            System.out.println(o);
        }
        ArrayList arr=new ArrayList();
        arr.addAll(list);
    }
}

ArrayList和LinkedList的特点:
(1)ArrayList底层是可变数组,遍历元素更快,改变值也更快
(2)LinkedList底层是双向链表,插入、删除更快。

Set接口

Set集合是一种不允许有重复元素的集合。与List一样,它同样允许null的存在但是仅有一个。Set判断元素是否相同的依据是调用元素的equal方法,即如果有e1.equals(e2)==true,那么e1和e2不能同时存在于一个Set集合中。

Set接口如何判断加入对象是否已经存在呢?
采用对象的equals()方法比较两个对象是否相等

示例:

public class TestSet {
    public static void main(String[] args) {
        HashSet set=new HashSet();
        set.add(1);
        set.add("abc");
        set.add("hello");
        set.add(1);
        set.add("abc");
        set.add(2);
        System.out.println(set.size());
   }     
}

Map接口

与Collection集合不同,Map集合是由一系列键值对组成的集合,它提供了key到value的一对一映射,集合中的key不能重复。
HashMap
以哈希表的数据结构实现,查找对象时通过哈希函数计算其位置,查询速度快。可以使用null作为key或者value。
HashMap其实就是一个Entry数组,Entry对象中包含了键和值,其中next也是一个Entry对象,它就是用来处理hash冲突的,形成一个链表.

TreeMap:
如果使用自定义的类来作为TreeMap中的key值,且想让TreeMap能够良好的工作,则必须重写自定义类中的equals()方法,TreeMap中判断相等的标准是:两个key通过equals()方法返回为true,并且通过compareTo()方法比较应该返回为0。
示例:

public int compareTo(Object o) {
        if (o instanceof News){
            News obj=(News)o;
            //自定义比较规则
//            return obj.newsId-this.newsId;//降序
            return this.newsId-obj.newsId;//升序
        }
        return 0;
    }