集合

来源:互联网 发布:vt和vi的区别 知乎 编辑:程序博客网 时间:2024/05/12 05:09


集合

一、集合的由来:

1、集合的由来:数组长度是固定,当添加的元素超过了数组的长度时需要对数组重新定义,太麻烦,java内部给我们提供了集合类,能存储任意对象,长度是可以改变的,随着元素的增加而增加,随着元素的减少而减少

2、数组和集合的区别

区别1 :数组既可以存储基本数据类型,又可以存储引用数据类型,基本数据类型存储的是值,引用数据类型存储的是地址值。

             集合只能存储引用数据类型(对象)集合中也可以存储基本数据类型,但是在存储的时候会自动装箱变成对象

 区别2:数组长度是固定的,不能自动增长

         集合的长度的是可变的,可以根据元素的增加而增长

3、数组和集合什么时候用

             1,如果元素个数是固定的推荐用数组

         2,如果元素个数不是固定的推荐用集合

 

二、集合的遍历之集合转数组遍历

1、集合的遍历 其实就是依次获取集合中的每一个元素。

2把集合转成数组,可以实现集合的遍历

     

三、集合的遍历之迭代器遍历

1、迭代器概述:集合是用来存储元素,存储的元素需要查看,那么就需要迭代(遍历)

2迭代器的使用

             

                    Collectionc = new ArrayList();

                    c.add("a");

                    c.add("b");

                    c.add("c");

                    c.add("d");

                    

                    Iteratorit = c.iterator();                                    //获取迭代器的引用

                    while(it.hasNext()){                                               //集合中的迭代方法(遍历)

                           System.out.println(it.next());

                    }

      

四、迭代器的原理及源码解析

1、迭代器原理:迭代器是对集合进行遍历,而每一个集合内部的存储结构都是不同的,所以每一个集合存和取都是不一样,那么就需要在每一个类中定义hasNext()next()方法,这样做是可以的,但是会让整个集合体系过于臃肿,迭代器是将这样的方法向上抽取出接口,然后在每个类的内部,定义自己迭代方式,这样做的好处有二,第一规定了整个集合体系的遍历方式都是hasNext()next()方法,第二,代码有底层内部实现,使用者不用管怎么实现的,会用即可

2、迭代器源码解析

      1)在eclipsectrl + shift + t找到ArrayList

      2ctrl+o查找iterator()方法

      3)查看返回值类型是new Itr(),说明Itr这个类实现Iterator接口

      4)查找Itr这个内部类,发现重写了Iterator中的所有抽象方法

 

五、并发修改异常的解决方案

      1、迭代器迭代元素,迭代器修改元素(ListIterator的特有功能add)

      2、集合遍历元素,集合修改元素

 

六、数据结构之数组和链表的区别:

1、数组

      查询快修改也快

      增删慢

2:链表

      查询慢,修改也慢

      增删快

 

七、集合框架List的三个子类的特点

1List的三个子类的特点

             ArrayList:

                    底层数据结构是数组,查询快,增删慢。

                    线程不安全,效率高。

             Vector:

                    底层数据结构是数组,查询快,增删慢。

                    线程安全,效率低。

             Vector相对ArrayList查询慢(线程安全的)

             Vector相对LinkedList增删慢(数组结构)

             LinkedList:

                    底层数据结构是链表,查询慢,增删快。

                    线程不安全,效率高。

 

             VectorArrayList的区别

                    Vector是线程安全的,效率低

                    ArrayList是线程不安全的,效率高

             共同点:都是数组实现的

             ArrayListLinkedList的区别

                    ArrayList底层是数组结果,查询和修改快

                    LinkedList底层是链表结构的,增和删比较快,查询和修改比较慢

             共同点:都是线程不安全的

2List的应用:

             查询多用ArrayList

             增删多用LinkedList

             如果都多ArrayList

 

八、泛型的基本使用

1、泛型好处

       提高安全性(将运行期的错误转换到编译期)

      省去强转的麻烦

2、泛型基本使用

 <>中放的必须是引用数据类型

3、泛型使用注意事项

前后的泛型必须一致,或者后面的泛型可以省略不写(1.7的新特性菱形泛型) 

 

九、三种迭代的能否删除

 普通for循环,可以删除,但是索引要--

迭代器,可以删除,但是必须使用迭代器自身的remove方法,否则会出现并发修改异常

增强for循环不能删除

 

十、可变参数的概述和使用

1、可变参数概述

 定义方法的时候不知道该定义多少个参数

2、格式

       修饰符返回值类型方法名(数据类型… 变量名){}

3、注意事项:

       这里的变量其实是一个数组

      如果一个方法有可变参数,并且有多个参数,那么,可变参数肯定是最后一个

 

十一、HashSet如何保证元素唯一性的原理

 1.HashSet原理

我们使用Set集合都是需要去掉重复元素的,如果在存储的时候逐个equals()比较,效率较低,哈希算法提高了去重复的效率,降低了使用equals()方法的次数

HashSet调用add()方法存储对象的时候,先调用对象的hashCode()方法得到一个哈希值,然后在集合中查找是否有哈希值相同的对象

  如果没有哈希值相同的对象就直接存入集合

 如果有哈希值相同的对象,就和哈希值相同的对象逐个进行equals()比较,比较结果为false就存入, true则不存

 2.将自定义类的对象存入HashSet去重复

       类中必须重写hashCode()equals()方法

      hashCode():属性相同的对象返回值必须相同,属性不同的返回值尽量不同(提高效率)

       equals():属性相同返回true,属性不同返回false,返回false的时候存储

 

十二、TreeSet原理的特点和使用方式

 1.特点

       TreeSet是用来排序的,可以指定一个顺序,对象存入之后会按照指定的顺序排列

 2.使用方式

       a.自然顺序(Comparable)

              TreeSet类的add()方法中会把存入的对象提升为Comparable类型

             调用对象的compareTo()方法和集合中的对象比较

         根据compareTo()方法返回的结果进行存储

       b.比较器顺序(Comparator)

         创建TreeSet的时候可以制定一个Comparator

             如果传入了Comparator的子类对象,那么TreeSet就会按照比较器中的顺序排序

             add()方法内部会自动调用Comparator接口中compare()方法排序

             调用的对象是compare方法的第一个参数,集合中的对象是compare方法的第二个参数

       c.两种方式的区别

              TreeSet构造函数什么都不传,默认按照类中Comparable的顺序(没有就报错ClassCastException)

              TreeSet如果传入Comparator,就优先按照Comparator

 

十三、Map集合概述和特点

1Map接口概述

              将键映射到值的对象

              一个映射不能包含重复的键

             每个键最多只能映射到一个值

2Map接口和Collection接口的不同

Map是双列的,Collection是单列的

 Map的键唯一,Collection的子体系Set是唯一的

       Map集合的数据结构值针对键有效,跟值无关;Collection集合的数据结构是针对元素有效

      

3Map集合的功能概述

a:添加功能

              V put(K key,V value):添加元素。

             如果键是第一次存储,就直接存储元素,返回null

             如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值

 b:删除功能

             voidclear():移除所有的键值对元素

             Vremove(Object key):根据键删除键值对元素,并把值返回

 c:判断功能

             booleancontainsKey(Object key):判断集合是否包含指定的键

              boolean containsValue(Object value):判断集合是否包含指定的值

              boolean isEmpty():判断集合是否为空

 d:获取功能

             Set<Map.Entry<K,V>>entrySet():

              V get(Object key):根据键获取值

              Set<K> keySet():获取集合中所有键的集合

              Collection<V> values():获取集合中所有值的集合

 e:长度功能

              int size():返回集合中的键值对的个数

4Map集合的遍历之键找值

键找值思路:

       获取所有键的集合

      遍历键的集合,获取到每一个键

      根据键找值

5Map集合的遍历之键值对对象找键和值)

键值对对象找键和值思路:

       获取所有键值对对象的集合

       遍历键值对对象的集合,获取到每一个键值对对象

       根据键值对对象找键和值

 

十四、HashMapHashtable的区别

              HashtableJDK1.0版本出现的,是线程安全的,效率低,HashMapJDK1.2版本出现的,是线程不安全的,效率高

              Hashtable不可以存储null键和null,HashMap可以存储null键和null

 

1 0