• 工作笔记—转自原作者


     

     

    [转]牛逼笔记:5分钟搞定java集合框架

     

    java集合就是一个容器。

    1.     集合概述

    l       为了保存不确定的数据,或者对象,以及保存具有映射关系的数据。

    l       所有的集合类都位于java.util包下。

    1.1. 什么是集合,有什么特点?

    面向对象语言对事物的体现都是以对象的形式存在,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。

    集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。

    1.2. 集合与数组的区别(集合特点)

    首先我们要知道集合与数组是不同:

    其中集合是可变长度的,集合中用size();

    而数组是固定长度的,数组中是用length();

    集合是用来放对象的,数组可以存储基本数据也可以存储引用数据类型;

    有一点需要注意下,如果集合存放基本数据类型,在存取过程中会有个自动装箱和拆箱

    集合可以放任意对象(引用嘛),但是数组只能放相同的数据类型;

    对于如何使用集合,我们先看顶层的方法,然后去调用底层的子类来实现具体的功能。

    1.3. 集合框架

    由于集合内部的数据结构不同,集合分为多种容器。这些容器不断的向上抽取,就形成了集合框架。

    Collection

    |———-List(有序,,元素都有索引(角标),元素可以重复)

    |——–Vector:基于数组实现,同步,线程安全。增删,查询都慢。

    |——–ArrayList:基于数组实现,不同步,线程不安全,需要手动同步,查询的速度快

    |——–LinkedList:基于链表实现,不同步,线程不安全,需要手动同步,增删都很快

    |———-Set(无序,元素不可以重复)

    |——–HsahSet:基于哈希表实现,不同步的。

                  |——–LinkedHsahSet

    |——–TreeSet:基于二叉树实现,不同步的。自然排序,定制排序

    Map集合(键值对)

    |———-TreeMap基于二叉树,可以排序

    |———-HashMap哈希表实现

    Iterator迭代器

    |———-Collection每个集合都有迭代器

    |———-ListIterator主要用于List集合迭代,迭代过程可以操作元素

    1.4. 集合常见方法

    Collection的常见方法:

    1,添加:boolean add(Object obj)://添加元素

    booleanaddAll(Collectioncoll)://添加给定集合到当前集合

    2,删除:boolean remove(object obj)://删除元素

    booleanremoveAll(Collectioncoll);

    void clear();//清空集合

    3,判断:boolean contains(object obj)://是否包含指定元素

    booleancontainsAll(Colllectioncoll);//是否包含给定集合

    booleanisEmpty():判断集合中是否有元素。

    4,获取:int size():

    Iterator iterator():取出元素的方式:迭代器。

    5,其他:booleanretainAll(Collection coll);取交集。

    Object[] toArray():将集合转成数组。

    1.5.遍历集合:迭代器 Iterator

    也是集合框架的成员,但它主要用于遍历集合中的对象,封装了各种集合的底层细节,给集合框架提供了统一的接口。比如,这里举个例子。主要有3个方法:

    booleanhashnext();如果仍有元素可以迭代,则返回true

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

    void remove() 移除迭代器返回的最后一个元素

    而对于map类集合有2中方式来遍历:

    1:keySet()获取键对应的Set集合,然后在用Iterator配合get(Object key)获取每一个键所对应的值。

    2:entrySet()获取键值对集合,存入Map.Entry<K,V>集合中,Iterator对其进行迭代,在用getKey()取出键,getValue()取出值。

    1.6. 集合的一些技巧:

    需要唯一吗?

    需要:Set

    需要制定顺序:

    需要:TreeSet

    不需要:HashSet

    但是想要一个和存储一致的顺序(有序):LinkedHashSet

    不需要:List

    需要频繁增删吗?

    需要:LinkedList

    不需要:ArrayList

    l       看到array:就要想到数组,就要想到查询快,有角标.

    l       看到link:就要想到链表,就要想到增删快,就要想要 add get remove+frist last的方法

    l       看到hash:就要想到哈希表,就要想到唯一性,就要想到元素需要覆盖hashcode方法和equals方法。

    l       看到tree:就要想到二叉树,就要想要排序,就要想到两个接口Comparable,Comparator 。

    2.       List集合

    l   有序(存入和取出的顺序一致),元素都有索引(角标),元素可以重复。

    l   对于List,根据其内部结构不同又分为Arraylist、LinkedList、Vector

    l   共性特点:可以操作角标

    2.1.List子系

    List:

    |—-Vector:数组数据结构,是同步的。增删,查询都很慢!已经呗ArrayList替代了

    |—-ArrayList:数组数据结构,是不同步的。。查询的速很度快。

    |—-LinkedList:链表数据结构,是不同步的。增删的速度很快。

    2.2.List常用共性方法

    1添加元素:

    voidadd(intindex,Eelement);  //指定位置插入元素

    void add(index,collection);      //将给定的集合添加到末尾

    2删除元素:

    Object remove(index):      //删除指定交表的元素,返被背删除的

    3修改元素:

    Objectset(intindex,Eelement);       //用指定元素替换列表中指定位置的元素

    4获取元素:

    Object get(index);      //返回列表中指定位置的元素

    intindexOf(object);           //返回此列表中第一次出现的指定元素的索引,没有返回-1

    intlastIndexOf(object);     //返回此列表中最后一次出现的指定元素的索引,没有返回-1

    ListsubList(intfrom,intto);      //获取子集包含头不包含尾。

    3.       Set集合

    Set集合与Collection基本上一样,只不过内部元素是无序的,不允许重复。Add之前,会判断(equals方法)集合中是否包含此元素,如果包含返回true丙存入集合,如果不包含,返回false,不存。

    n       1:HashSet:按hash算法来存储集合中的元素,因此具有良好的存取和查找功能。

    l       特点:

    Ø       不保证顺序。

    Ø       不是同步的

    Ø       集合元素可以是null

    l       判断元素是否相等

    Ø       判断hash值是否相等

    Ø       Equals判断内容是否相等

    n       1:TreeSet:按存储集合中的元素的compare或者比较器,来判断是否需添加到集合。

    l       特点:

    Ø       自然顺序或指定顺序。

    Ø       不是同步的

    Ø       集合元素可以是null

    l       判断元素是否相等

    Ø       判断hash值是否相等

    Ø       Equals判断内容是否相等

    3.1.LinkedHashSet的集合特点

    是HashSet的一个子类,也是根据元素的hash值来判断元素位置,但同时使用链表维护元素次序。由于需要维护次序,所以性能略低于hashSet,但在迭代访问集合元素时,将有很好的性能。【有序不许重复】

    3.2. 常用共性方法

    1:增加元素:

    booleanadd(Object obj);//添加一个元素,在末尾位置

    booleanaddAll(Collection c);//添加一个集合,在末尾位置

    2:删除元素:

                  booleanremove(Object obj);//删除一个元素。

    booleanremoveAll(Collection c)//删除包含c的元素。

    voidclear();//移除此集合的的所有元素

    3:判断元素:

    booleancontains(Object obj)//判断是否包含某个元素。

    booleancontainsAll(Collection c);//在此集合中包含集合c中的所有元素

    booleanisEmpty();//判断是否为空集合。

    4:获取元素:

    intsize();//获取size大小。

    Iteratoriterator();//迭代器,用于取出元素的。配合it.next()和hasNext()组合使用。

    3.3.Hash表确定元素是否相同

    1:判断两个原素的hash值是否相同,如果相同个,判断两个内容是否相同

    2:判断hash值相同,其实是判断hashCode()是否相同,判断内容用equals()方法。

    n       hashCode规则:

    l       同一个对象多次调用返回的hashCode值相等。

    l       2个对象euqals方法比较返回true时,他们hashCode也应相等。

    l       对象中用作equals方法比较标准的field都应用来计算hashCode值

    n       重写hashDode规则:

    l       把每个对象的有意义的field,计算出一个hashcode值。

    l       用第一步计算出来的多个hashCode来组合成一个值返回。

    l       为了避免相加产生偶然相等。可以通过hashcode*一个质数相加返回。

    例如:

    Return name.hashCode*11 + age.hashCode*7;

    练习:请定义ArryaList集合,并存储Person对象。如newPerson(“lisi”,20);

    并取出。将姓名和年龄打印出来。

    3.4.TreeeSet排序的2种方式

    1,  让对象本身具备可比性。实现comparable接口的comparTo()方法。

    2,  创建比较器。比较器实现Compartor接口,Compar()方法作为TreeSet对象的构造参数象传入。注意泛型。

    3,  建议用第二种,使用灵活

    ·   publicstaticvoid main(String[] args) {

          TreeSet  <Person>ts= newTreeSet<Person>(new Comparator<Person>() {

                publicint compare(Person o1, Person o2) {

                return o1.getAge()-o2.getAge();

             }

          });

          ts.add(new Person(“mike”,28));

          ts.add(new Person(“lisi”,21));

          ts.add(new Person(“zhouqi”,29));

          ts.add(new Person(“zhaoliu”,25));

          ts.add(new Person(“wangu”,24));

          for (Object o: ts) {

             Person p = (Person) o;

             System.out.println(p.getName() +” ” + p.getAge());

          }

    }

    3.5. 选择HashSet还是TreeSet?

    HashSet的性能总是比TreeSet好,(主要表现在添加、删除、查询等),因为TreeSet需要二外的红黑树来维护次序。只有当需要排序时才使用TreeSet。

    HashSet有一个子类,LinkedSet对于普通测插入删除这个要比HashSet要慢些。因为要维护链表。

    3.6. 安全问题解决

    通常在创建是就调用Collections工具类的synchronizedSortedSet方法来包装集合。

    例如

    Sorted s =new Collections.synchronizedSortedSet(new Treeset(…))

    4.       Map集合

    Map集合用于存储那些有映射关系的数据;

    Map也成为双列集合。

    Map存的是一对元素:一个Key,一个Value。Key、Value可以使任何引用类型的数据。其中Map的Key不允许重复。

    4.1.Map集合子体系

    Map:

    |—-HashMap:哈希表结构;Key唯一;不同步;允许null作为键,值。hashCode()、equals()确定唯一

    |—-HashTable:哈希表结构;数据唯一;同步低效的。不允许null作为键,null作为值。

    |—-TreeMap:二叉树结构;Key唯一;可排序;不同步但高效;允许null作为键,null作为值。

    补充:

    4.2.Map常用方法

    1添加元素:

    ·value put(key,value):           返回前一个和key关联的值,如果没有返回null.

    2,删除元素。

    void  clear():            清空集合。

    value remove(key):           根据指定的key翻出这个键值对。

    3,判断元素。

    boolean containsKey(key):     判断是否包含给定的key

    boolean containsValue(value):判断是否包含给定的value

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

    4获取元素。

    value get(key):          通过键获取值,如果没有该键返回null。可以用来来判断是否包含指定键。

    int size():     获取键值对的个数。

    4.3.CollectionCollections

    collection是集合框架的顶层接口,集成了一些集合的共性方法;添加、删除、修改、查询、判断等。下分为list和set两个分支,其又各自有体系,其

    中list有序,可以重复的,有分为vector arraylistlinkedlist(各个数据结构,特点)

    其中set是无序不许重复的,有分为。hashset和treeset(各个数据结构,特点)

    Collections是一个对collection操作的工具类,提供的都是静态方法(查找,排序,反转,加锁)

    !============记录点滴成长============!
  • 相关阅读:
    iscroll 子表左右滚动同时保持页面整体上下滚动
    mac xampp命令行调用mysql
    学习—ReentrantLock
    sychronized和lock的区别
    学习——常见垃圾回收器
    学习——java内存模型
    学习——哈夫曼编码
    数据库—Innodb中的MVVC
    学习-事务-事务特性
    学习——事务-事务隔离级别
  • 原文地址:https://www.cnblogs.com/dark-passion/p/4971738.html
Copyright © 2020-2023  润新知