Java基础——集合

1、集合:存储对象常用的方式,只用于存储对象,长度可变,可存储类型不同的对象。
*数组和集合都是容器。数组虽然也可以存储对象,但长度固定。数组可以存储基本数据类型。
*队列接口可以在尾部添加元素,在头部删除元素,并且查找队列中元素的个数。
队列的实现方式:使用循环数组和链表
*循环数组比链表高效。循环数组是一个有界集合,容量有限。若程序中要收集的对象数量没有上限,就最好使用链表。
*Collection接口中的共性功能:
(1)boolean add(Object obj); 一次添加一个
boolean addAll(Collection c); 将指定容器中的元素添加
(2)删除:void clear();清空容器中的所有元素
Boolean remove(Object obj);移除
Boolean removeAll(Collection c); 移除指定的元素
(3)获取长度:int size();
(4)判断:Boolean isEmpty();
Boolean contains(Object obj);
Boolean containsAll(Collection c);
(5)将集合转成数组:toArray(); toArray([]);
(6)Iterator iterator();

2、迭代器:具备迭代功能的对象。迭代器对象不用new,直接通过iterator方法获取即可。迭代器是取出Collection集合中元素的公共方法。
*通过反复调用next方法逐个访问集合中的元素,到达末尾,next方法会抛出NoSuchElementException,因此,需要在调用next方法前调用hasNext方法。若迭代器对象还有多个供访问的元素,这个方法返回true。
*调用next方法,迭代器会越过下一个元素,并返回刚刚越过的元素;
remove方法删除上次调用next方法时返回的元素。
Next方法和remove方法的调用具有相互依赖性,在调用remove方法前没有调用next方法是不合法的(IllegalStateException)。

3、集合有两个基本接口:Collection和Map
*List是有序集合,存入和取出的顺序相同,有索引,允许重复元素。访问元素的方式:使用迭代器访问和使用一个整数索引来访问
*ConcurrentModificationException异常(并发修改异常)的解决方案:使用List集合的特有迭代器ListIterator获取迭代器对象,实现迭代过程中的增删改查。
*Set接口不允许重复元素,和Collection方法相同,Set集合取出的方法只有一个:迭代器。集(set)的equals方法只要两个集包含相同的元素就认为相等,不要求有相同的顺序。hashCode方法要保证相同元素的两个集会得到相同的散列码。

4、List集合的具体子类(区分子类是根据内部的数据结构不同)
(1)Vector:数据结构是数组,数组长度可变(不断地new新数组,并将原数组元素复制到新数组);线程同步;增删、查询速度都很慢;
(2)ArrayList:数组结构,长度可变;线程不同步,替代了Vector;增删速度不快,查询速度快;
(3)LinkedList:链表结构,线程不同步,增删速度快,查询不快;
*在java语言中,所有的链表实际上都是双向链接的,每个节点都有前驱节点和后驱节点。

5、HashSet(哈希表结构、散列表结构)特点:
(1)不允许存储重复元素,因为会发生查找的不确定性;
(2)不保证存入和取出的顺序一致,比数组查询效率高。
*哈希表在判断元素是否相同时,依据的是hash Code方法。如果哈希重复(哈希值相同),再判断元素的equals方法。如果equals返回true,不存,反之,存储。
*当哈希算法算出的两个元素的值相同称之为哈希冲突。
解决方案:当产生哈希冲突时,需要对元素进一步判断,判断元素的内容,用equals方法。
*如何保证唯一性:元素必须覆盖hashCode方法和equals方法。覆盖hashCode方法是为了根据自身元素特点,确定哈希值;覆盖equals方法是为了解决哈希值的冲突。

6、TreeSet:二叉树数据结构,可以对元素进行排序,不同步。树集是有序集合,可以以任意的顺序将元素插入到集合中。在遍历时,每个值将按照排序后的顺序呈现。
*排序方式:元素需要比较功能,所以元素需要实现Comparable接口,覆盖compareTo方法。
*如何保证元素的唯一性:比较方法的返回值是否为0。是,为重复元素,不存。树的排序必须是全序,即任意两个元素必须是可比的,并且只有在两个元素相等时结果才为0.
*若元素具备的比较功能不是所需的,而是按照自定义的方式对元素排序,该如何排序:
第二种比较方式:让集合具备比较功能,实现Comparator接口,覆盖compare方法,将Comparator接口的对象作为参数传递给TreeSet集合的构造函数。
*比较器更为灵活,自然排序作为默认方法。

7、技巧:JDK1.2以后出现的集合框架中常用子类对象,规律为前缀名是数据结构,后缀名为所属体系。
*ArrayList:数组结构。看到数组,查询快;看到List,可以重复,可以增删改查;
*LinkedList:链表结构,增删快
*HashSet:哈希表,查询速度更快,不保证有序。看到Set,可知不可重复
*LinkedHashSet:链表+哈希表。可以实现有序,因为有链表
*TreeSet:二叉树,可以排序。两种比较的方式:一种是自然排序Comparable,一种是比较器Comparator。

8、队列:可以在尾部添加一个元素,在头部删除一个元素。而有两个端头的队列为双端队列,可以在头部和尾部同时添加或者删除元素,但不支持在队列中间添加元素。

9、映射(map)数据结构:双列集合,一次存一对,键值对,要保证键的唯一性。
共性功能:(1)添加:v put(key,value); putAll(Map<k,v>,map);
(2)删除:void clear(); v remove(key);
(3)判断:boolean constainsKey(object); Boolean constainsValue(object);
Boolean isEmpty();
(4)获取:v get(key); int size();
*映射的两个通用实现:HashMap(散列映射)和TreeSet(树映射)。散列映射稍微快一些。
*Map:HashTable:哈希表,是同步的,不允许null键,不允许null值
HashMap:哈希表,不同步,允许null键,null值
TtreeMap:二叉树,不同步,可以对map集合中的键进行排序
*如果对同一个键两次调用put方法,第二次的值会取代第一次的值。实际上,put将返回用这个键参数存储的上一个值。
*三种映射视图:键集、值集合(不是一个集)、键/值对集
(1)键集:Set keyset()
(2)值集合:Collection values()
(3)键/值对集:Set<Map.Entry<K,V>> entrySet()
*Map集合没有迭代器,可以通过map.keySet()转换成Set集合,再使用迭代器。

10、集合和数组转换:
(1)数组转换成集合:Arrays.asList()
目的是使用集合的方法操作数组中的元素,但不能使用集合的增删方法,
改变长度
(2)集合转换成数组:toArray()
返回的数组是一个Object[]数组,不能改变他的类型
*若数组中都是引用数据类型,转换成集合时,数组元素直接作为集合元素;若数组中的都是基本数据类型,会将数组对象作为集合中的元素。
*若传入的数组长度小于集合长度,方法会创建一个长度和集合长度一致的数组;若传入的数组长度大于等于集合长度,会使用传入的数组长度作为集合的长度。
*把集合转换成数组的原因:为了限定对元素的操作,比如增删。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值