Java集合

  1.Java集合的核心作用是作为容器存储对象的。集合可以动态的存储多个对象,且还可以保存具有映射关系的关联数组。

  我们知道,面向对象语言对事务的体现都是以对象的形式,为了方便的对多个对象的操作,我们就要将对象进行储存。就好像小孩子上学,为了方便的对小孩子进行教育,就要把他们聚集在一个班级里。这个班级,就是集合。我们前边说过的数组也是一个存储对象的容器,但是数组有着天然的弊端,一是数组一旦建立,长度就确定了,二是无法确定现有数组中真实存在的对象有几个,因为数组的length求出的是数组的建立时的长度。正因为这些弊端,所以Java语言提供了另外一种存储Java对象的容器,就是集合。

  2.集合按照结构体系分类可分为Collection接口和Map接口。Collection可分为List子接口和Set子接口,List可存储有序的可重复的对象,Set可存储无序的,不可重复的对象。Map存放的是具有映射关系的键值对。

  3.Collection接口的常用方法。

  size():返回当前集合中的真实对象的个数。初始化集合元素个数为0.

  add():添加一个元素到集合中。参数可以使任意类型。

  addAll():添加参数集合中所有的元素到集合中。

  isEmpty();判断集合是否没有元素。

  contains():查看集合是否包含了某个元素。注意参数对象的类必须重写了equals()和hashcode()方法。

  cantainsAll():判断集合是否包含了摸个集合中的所有元素。

  retainAll();将参数集合和当前集合的交集集合给当前集合,返回true或false表示当前集合是否发生了改变。

  remove();删除当前集合中的某个元素。返回true或false。注意参数对象的类必须重写了equals()和hashcode()方法

  removeAll():删除当前集合中的所有参数集合中的元素。

  equals():判断当前集合和形参集合的所有元素是否相等。

  toArray():将集合转换为数组,返回object[]类型的数组。(Arrays.asList()将数组转为list集合)

  iterator():返回一个Iterator接口子类的对象,用来遍历集合。(遍历集合的两种方式)

  4.List接口及其主要实现类

  List接口是有序的可重复的集合容器,它分为三个子实现类,ArrayList、LinkedList、vector。

  ①ArrayList的底层代码显示真正的存储结构还是数组。它除了可以实现了Collection中的方法之外还可以根据自己的有序和可重复性有自己独特的方法。因为它是有序的集合,这个集合的有序是指按照添加进来的顺序进行排序,也可以在指定位置进行集合的增删改查操作。具体方法如下:

  add(index,object):在指定位置添加元素

  get(index):获取指定位置的元素。

  remove(index):删除指定未指定的元素。

  set(index,object):设置(修改)指定位置的元素。

  addAll(index,Collection);在指定位置上将参数集合中的所有元素添加进来。

  indexOf(object):返回元素在集合中首次出现的下标。(不存在则返回-1)

  lastIndexOf(object);返回元素在集合中最后一次出现的下标。(不存在则返回-1)

  subList(index1,index2):返回从下标index1到下标index2中的元素集合(左闭右开)。

  LinkedList和Vector的使用

  ②LInkedList实现类的底层使用链表实现的,当存在大量的删除的修改元素操作的额时候,LinkedList的效率要高于ArrayList。

  ③Vector是古老的List的实现类,相较于ArrayList,Vector是线程安全的,但是我们基本不用Vector,因为效率很低。

  List中我们常用ArrayList。

  5.Set接口和其主要的实现类

  Set接口是存放无序的不可重复的对象的集合容器。它的主要实现类是:HashSet、LinkedSet、TreeSet。

  Set子类存放元素时,必须要求子类重写了equals和hashcode方法,因为Set的不可重复性比较的是对象的内容,而不是地址值。

  Set是如何存储对象呢?当有一个对象进来时,首先调用此对象的hashcode方法计算此对象的哈希值,此哈希值决定了对象在在Set中的位置,若此位置之前没有对象存储,则这个对象存到哈希值对应的位置,若此哈希值的位置有对象存储,则调用equals方法比较对象内容是否相同,相同,则此对象不可存入。一般来说,当两个对象的哈希值相同时,equals方法判定也会相同。哈希方法是为了确定位置,equals方法则是比较内容。

  ①HashSet中的元素是无序的,无序并不代表随机,即当元素存入集合时,位置就确定了。

  ②LinkedHashSet也像LinkedList一样使用了链表维护了添加进集合的顺序致使我们遍历集合时,会按照添加进集合的顺序进行遍历输出。但是我们仍然无法按顺序的获取集合中的元素,无法像List一样很具下标操作元素。

  因为无序,所以LinkedList的插入行不如HashSet,但是存入有顺序,所以遍历效果好于HashList。(相反的,因为有序,LinkedList的插入性好于ArrayList,遍历性低于ArrayList)。

  ③TreeSet是Set接口中的比较特殊的一个实现类,稍后我们会专门介绍它。

  6.Map集合及其子实现类和子接口。

  Map集合时和Collection并列存在的集合容器,他存放的是具有一对一映射关系的的数据。结构是key--value。

  Map的key使用Set存放的,所有不允许重复且是无序的,常用String存放键key(因为String类中重写了equals和hashcode方法);Map的value是用普通集合存放的,可重复。

  key和value是单向一对一的映射关系,所以总可以通过key找到对应的value值。

  每一组key-value构成一个entry,它是Set存放的,所以他也是不可重复无序的。

  Map的主要实现类是HashMap、LinkedHashMap、TreeMap和Properties。(和Set比较像)

  ① HashMap实现类的常用方法

  put(key , value):像集合中添加一个元素。(添加元素时,会调用key对象的hashcode、equals方法进行判断是否有相同的key对象)

  size();求Map集合中元素的个数。

  remove(key):删除key对应的entry,返回key对应的value

  get(key):获取key对应的value值。

  containsKey(key)、containsValue(value):判断是否存在key、value对应的entry对象。

  HashMap的遍历。可以依次获取map.keySet()、map.values()、map.entrySet()之后再用强制for循环进行遍历。

  ②LinkedHashMap:同LinkedHashSet一样,使用了链表维护了entry添加进集合的顺序,所以遍历时会按照这个顺序进行遍历。且相对于HashMap,遍历速度快,插入修改删除速度慢,因为有一个链表需要维护。

  ③TreeMap和TreeSet一样,我们会在接下来详细讲述。

  ④HashTable子类Properties

  我们常用Properties处理属性文件内容的获取,这个集合的特点是键值都是String型的。而且线程安全,也是无序的,不同于HashMap的是,Properties的键值对都不允许是null值。

  6.Collections工具类的使用

  像Arrays对数组一样,Collection是一个操作集合的工具类,它提供了一系列静态方法对集合进行排序,查询,修改等操作,还提供了对集合对象设置不可变,对集合对象实现同步控制等方法。

  reverse(list):反转集合list中的元素顺序。

  shuffle(list):对list集合进行随机排序。

  sort(list):对List进行自然升序的排序。

  sort(list,compareble):对list集合按照compareble产生的顺序进行排序。

  swap(list,i,j):将list集合中的下标为i和j的元素进行交换。

  max/min(list):返回集合中自然排序的最大值/最小值。

  frequency(collection):返回某元素在集合中存在的个数。

  copy(list1,list2):将list2中的元素全部复制到list1中。(list2的现有长度必须小于list1的现有长度)

  synchronized(list):将此list集合包装成现行安全的list集合。










  

  

  





















                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         












  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值