集合框架

Posted zhang321

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了集合框架相关的知识,希望对你有一定的参考价值。

数组、对象数组、集合框架的特点与区别

1.概念
数组:用于存放同一基本数据类型元素的组合。           值类型也叫基本数据类型

对象数组:用于存放同一对象类型元素的组合。

集合框架:动态的对象数组。

2.区别
数组不能动态扩张,定义时必须指定长度;集合则无需指定长度,可动态扩张。

二、为什么需要集合框架?
如果不知道程序运行时需要多少对象,或者需要更复杂的方式类存储对象,可以使用集合框架,collection集合框架用来存储和操作不同类型的对象数组。

三、集合框架的体系

技术图片


1:collection接口

技术图片
Collection 接口主要有三个子接口:

Set——表示不允许有重复元素的集合

List——表示允许有重复元素的集合

Queue——队列,JDK1.5新增,与上面两个集合类主要是的区分在于Queue主要用于存储数据,而不是处理数据。队列是一种特殊的线性表,先进后出。

按照一定的规则进行排序,

Stack——继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。

堆栈:表示一个先进后出的数据结构,子弹夹

 

1.1List接口
1.1.1特点:(有序,可重复)

(1)和数组类似,可以动态增长;

(2)有序,对象可以重复;

(3)查找元素效率高,插入删除元素效率低(会引起其他元素位置改变)。

1.1.2遍历方式:

(1)下标

(2)foreach(>=JDK 1.5)

(3)迭代器Iterator

 

1.1.4:对应的实现类

          Arraylist集合

       声明

                        ArrayList<E> al=new ArrayList<E>();

                        <E> 泛型,泛型可以为任何类型的对象,但不包括基本类型。

                        作用:它的好处在于存储时可以自动检查存入类型的合法性,取出时(get)可以自动转型成对应的类型

          方法

                      追加

                               boolean    add(E e);   //将指定的元素添加到此列表的尾部

                                  void       add(int index, E element);  //将指定的元素插入此列表中的指定位置

                                  boolean    addAll(Collection);  //将集合中的数据追加到另一个集合后面

                                  boolean    addAll(int index, Collection);   //将Collection指定追加到位置之后

                        删除

                                  void       clear();            //移除集合中所有的元素

                                  E          remove(int index);  //移除此列表中指定位置上的元素。

                                  boolean    remove(Object o);   //移除此列表中首次出现的指定元素(如果存在)。

                                  void       removeRange(int fromIndex, int toIndex);  //移除列表中索引在 fromIndex(包括)和 toIndex(不包括)                                   之间的所有元素。

                        修改(替换)

                                  Object     set(index, element);   //将index位置的对象替换成element

                      获取

                                  E          get(int index);  //返回集合中指定位置的对象

                                   List       subList(fromIndex, toIndex);  //截取子集合

                   判断

                                   boolean    contains(Object o);  //集合中是否包含该元素,需重写equals(比较整体)

                                   boolean    containsAll(Collection c);   //比较的是集合中的值,是否包含子集合中的内容(比较内容)

                                   boolean    isEmpty();           //如果此列表中没有元素,则返回 true

                                   int        indexOf(Object o);   //判断元素的索引位置,如果不包含元素,则返回-1

                     长度及调整大小

                         int        size();          //返回集合的长度

                        void       trimToSize();    //调整当前的容量为实际size的大小(提高性能)

 

 LinkedList集合

方法

添加

         void       addFirst(E e);   //将指定元素插入此列表的开头。

         void       addLast(E e);    //将指定元素添加到列表的结尾。

读取

         E          getFrist();    //返回此列表的第一个元素。

         E          getLast();     //返回此列表的最后一个元素。

移除

         E          removeFrist();   //移除并返回此列表的第一个元素。

         E          removeLast();    //移除并返回此列表的最后一个元素。

 

Set接口
特点(无序、不可重复)

(1)无序,对象不可以重复

(2)查找元素效率低,插入删除元素效率高(不会引起元素位置改变)。

遍历方式

(1)foreach

(2)迭代器

 

HashSet集合

方法

(1) 增

boolean    add(E e);  //如果集合中未包含指定元素,则添加指定元素

(2) 删

    void      clear();  //从集合中移除所有元素

    boolean   remove(Object o);   //如果指定元素存在于集合中,则将其移除

    ************************************************

    注意:Set集合中的HashSet因为是无序的,所以不像ArrayList那样用remove(index)指定下标的位置删除。

    ************************************************

(3) 查

    Set集合中没有get();方法,因为它无序无编号的(不知道拿出来的是什么)。

    解决办法 =============> 迭代器Iterator

    迭代器Iterator作用:遍历Set集合或取Set集合中的值。

    Iterator方法:

    boolean      hasNext();  //如果仍有元素可以迭代,则返回 true。

    E            next();     //返回迭代的下一个元素。

    操作步骤:

    第一: 声明迭代器(放到一个传送带上)

         Iterator<String> 迭代名 = 集合名.iterator<String>();     

         例:Set ar = new HashSet();

             ar.add("java01");

             ar.add("java02");

             ar.add("java03");

             Iterator<String>  it = ar.iterator<String>();

 

    第二: 循环取出

         while(it.hasNext()){ 

             String  str = it.next();

             System.out.println(str);

         }

注意

(1) 它不允许出现重复元素;

(2)不保证和政集合中元素的顺序

(3)允许包含值为null的元素,但最多只能有一个null元素。

 

面试题

如何证明Set集合中重复的数据是没有存进去还是替换了原来的?(面试)

解题思路:

    只要证明存没存进去,就可以证明该题。

    (没存进去,那就不存在替换;存进去了,那就是替换了原来的。)

    那如何证明有没有存进去?

    首先要先搞清java怎么判断2个对象是否相等

    1. 先比较2个对象的身份证hashcode;

    2. 再比较2个对象的equals是否相等。(是里和外比,还是外和里比?)

hashcode只是决定是否需要用equals来比较,真正决定对象是否相等的方法仍然是equals。

1.3 Queue接口

Map接口


特点
(1)无序、以键值对的形式添加元素,键不能重复,值可以重复

遍历方式
(1)先取出保存所有键的Set,再遍历Set即可(2种)。

(2)先取出保存所有Entry的Set,再遍历此Set即可。

 描述
Map并不是一个真正意义上的集合,但是这个接口提供了三种“集合视角”,使得可以像操作集合一样操作。


HashMap

特点

根据键的HashCode值存储数据,查询快,最多允许一个键为NULL,多个值为NULL。

线程不同步

方法

存储(以“键-值”的方式进行存储)

    V      put(K key, V value)    //将指定的值与此映射中的指定键关联

    例:mp.put("CN","中华人民共和国");

         mp.put("RU","俄罗斯联邦");

         mp.put("US","美利坚合众国");

读取

    V      get(Object key)  //返回指定键所映射的值,如没有值则返回null

    例:mp.get("CN");  //键值,而不是下标

删除

    V      remove(Object key)  //如果存在一个键的映射关系,则移除

    例:mp.remove("RU");

集合大小

    int    size()   //返回此映射中的键-值映射关系数

包含

    boolean     containsKey(Object key);

    boolean     containsValue(Object value);

    例:mp.containsKey("CN");   //是否包含CN键

其他方法

    mp.keySet();  //输出所有键的集合(注意不包括值)

    mp.values();  //输出键所对应的值,比如“中华人民共和国”

    mp.entrySet();  //返回此映射所包含的映射关系的 Set 视图

 

 

如何快速遍历Map集合

遍历保存的Entry的set 

Map<String, String> map=new HashMap<>();

                  map.put("zs", "张三");

                  map.put("ls", "李四");

                  map.put("ww", "五五");

                  map.put("zs", "张山");

                  for (Map.Entry<String, String> entry : map.entrySet()) {

                          System.out.println(entry.getKey()+" "+entry.getValue());

                  }

 

以上是关于集合框架的主要内容,如果未能解决你的问题,请参考以下文章

集合框架

集合框架

复习集合框架

Java集合框架介绍

java集合框架

集合框架