Java学习之集合

        前言:因为在日常的Java开发工作中都离不开程序对数据的存储和读取,此时就会用到数组、集合等一些常用的数据结构。但是对于了解数组的童鞋都知道,数组在实际开发当中使用上的局限性。其一是数字长度是固定的,其二是数组存放数据类型都必须相同(基本类型/应用类型)。若程序运行时不知道究竟需要多少对象,需要在空间不足时自动扩增容量,则需要使用容器类库,数组不适用。此时,就需要引入集合的概念,下面对数组,集合这种最基本的数据结构进行详细的介绍。

一、数组;

       数组其实就是一组长度固定、类型相同的变量集合(个人理解)。这些变量可以按照统一的方式进行操作。数组本身属于引用数据类型,那么既然是引用数据类型,这里面实际又会牵扯到内存分配,而数组的定义语法有如下两类。

数组动态初始化:
        声明并开辟数组:
               数据类型 [] 数组名称 = new 数据类型[长度];
        分布进行数组空间开辟(实例化)
               数组类型 数组名称[] = null; | | | 数组类型 [] 数组名称 =null; | | 开辟数组空间: | 数组名称 =new` 数组类型[长度]; |

数组静态初始化:

简化格式:数据类型 数组名称 = {值, 值,…}
完整格式:数据类型 数组名称 = new 数据类型[] {值, 值,…}

二、集合;

       1、集合其实就是一个长度不固定,类型也可以不固定的对象容器(个人理解)。存放于java.util包中,是用来存放对象的容器。根据上边概念,日常对于集合的使用需要注意:

       ①、集合只能存放对象。比如你存一个 int 型数据 1放入集合中,其实它是自动转换成 Integer 类后存入的,Java中每一种基本类型都有对应的引用类型。

       ②、集合存放的是多个对象的引用,对象本身还是放在堆内存中。

       ③、集合可以存放不同类型,不限数量的数据类型。

       

                                                                   图 1-1

        如上图,Java的集合框架主要包括两种类型的容器;一种是集合(Collection),存储一个元素集合。一种是图(Map),存储键值对映射(即 Key-Value映射)。Collection接口又有三个子类型,List 、Set、Queue,再下面就是一些抽象类,最后是具体的实现类,常用的有ArrayLsit、HashSet、HashMap等等。

        集合框架其实是用来代表和操作集合的统一架构,所有的集合架构都包含如下内容;

        接口:代表集合的抽象类型。如;Collection、Map、Set、Lsit、

        实现类:是集合接口的具体实现,是可重复使用的数据结构。如;ArrayList、HashMap、HashSet等。

        算法:是实现集合接口的对象里的方法执行的计算。如排序等。

        除了集合,该框架也定义了几个Map接口类。Map 不是集合,只是被集合框架所整合在其中。结合框架体系如下图;                                    

       下面对各个接口进行一个简单的概述;        

序号接口描述
1Collection 接口

Collection 是最基本的集合接口,一个 Collection 代表一组 Object,即 Collection 的元素, Java不提供直接继承自Collection的类,只提供继承于的子接口(如List和set)。

Collection 接口存储一组不唯一,无序的对象。

2List 接口

List接口是一个有序的 Collection,使用此接口能够精确的控制每个元素插入的位置,能够通过索引(元素在List中位置,类似于数组的下标)来访问List中的元素,第一个元素的索引为 0,而且允许有相同的元素。

List 接口存储一组不唯一,有序(插入顺序)的对象。

3Set

Set 具有与 Collection 完全一样的接口,只是行为上不同,Set 不保存重复的元素。

Set 接口存储一组唯一,无序的对象。

4SortedSet 
继承于Set保存有序的集合。
5Map

Map 接口存储一组键值对象,提供key(键)到value(值)的映射。

6Map.Entry 
描述在一个Map中的一个元素(键/值对)。是一个Map的内部类。
7SortedMap
继承于 Map,使 Key 保持在升序排列。
8Enumeration
这是一个传统的接口和定义的方法,通过它可以枚举(一次获得一个)对象集合中的元素。这个传统接口已被迭代器

List集合的实现:

      1、List  list = new ArrayList();底层数据结构是数组,查询快,增删慢,线程不安全,效率高。

      2、List  list = new Vector();底层数据结构 是数组,查询快,增删慢,线程安全,效率低。不常用。

      3、List  list = new LinkedList();底层数据是链表,查询慢,增删快,线程不安全,效率高。

      说明:对于底层数据结构是数组和链表需要说明的是;数组进行遍历是根据下标的,所以无需遍历可以直接获取到某一个下标的值,但每一次新增和删除会引起数据位置变化,所以增删慢。而对于链表结构,不能通过下标去查找,而是需要挨个去遍历,增删的时候也无需关注数据的位置,所以增删快。

       线程安全性:刨析ArrayList 和 LinkedList 底层发现,两者底层实现均没有为方法增加同步锁,而Vector 底层方法则使用了锁机制,当一个线程访问了该List 数据的时候其他访问该List的其他线程会被挂起等待,直至第一个线程完成访问,这样数据的安全性就得到了保证。

      栗子:数组就像身上编了号站成一排的人,要找第10个人很容易,根据人身上的编号很快就能找到。但插入、删除慢,要望某个位置插入或删除一个人时,后面的人身上的编号都要变。当然,加入或删除的人始终末尾的也快。

  链表就像手牵着手站成一圈的人,要找第10个人不容易,必须从第一个人一个个数过去。但插入、删除快。插入时只要解开两个人的手,并重新牵上新加进来的人的手就可以。删除一样的道理。

Set集合的实现:

       1、Set hashSet = new HashSet();

        ①、HashSet:不能保证元素的顺序;不可重复;不是线程安全的;集合元素可以为 NULL;

        ②、其底层其实是一个数组,存在的意义是加快查询速度。我们知道在一般的数组中,元素在数组中的索引位置是随机的,元素的取值和元素的位置之间不存在确定的关系,因此,在数组中查找特定的值时,需要把查找值和一系列的元素进行比较,此时的查询效率依赖于查找过程中比较的次数。而 HashSet 集合底层数组的索引和值有一个确定的关系:index=hash(value),那么只需要调用这个公式,就能快速的找到元素或者索引。

        ③、对于 HashSet: 如果两个对象通过 equals() 方法返回 true,这两个对象的 hashCode 值也应该相同。

        2、Set linkedHashSet = new LinkedHashSet();

        3、Set treeSet = new TreeSet();

Map集合的实现:

        ①、Map  map = new HashMap();采用的Hash表算法,此时Map中的Key不会保证添加的先后顺序,key不允许重复,判断标准为key2.equals(Key1)为true,并且hashCode相等。

        ②、Map  map = new TreeMap();采用红黑树算法,此时Map中的key会按照自然顺序或定制顺序进行排序,key同样不允许重复,key判断重复的标准是compareTo/compare 函数的返回值是否为0。

        ③、Map map = new LinkedHashMap();采用链表和Hash表算法,会按照Key被添加的先后顺序,也不允许重复,Key 的重复验证标准与HashMap判断标准相同。

        ④、Map map = new HashTable();采用Hash表的算法,是HashMap的前身,

        ⑤、Map map = new Properties();HashTable的子类,此时要求Key和Value都是String类型。通常用来加载资源文件。

Set和List区别

      1、Set集合的接口存储是无序的,不重复的数据。List恰好相反,存储有序,可重复数据。

      2、Set检索效率较低,删除和插入效率高,插入和删除不会引起元素位置变化。

      3、List和数组类似,可动态增长,根据实际存储数据的长度自动增长List 的长度。查找元素效率高,但插入删除效率低。因为操作成功会引起其他元素位置改变。

Map与Set 

       同类型的接口实现底层的算法相同,HashMap 与HashSet 底层都采用Hash表算法,TreeMap 与TreeSet底层算法相同

                                                       

        由上图可看出,Set 底层其实就是Map集合的Key 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值