集合和数组在存储数据的时候是各有优缺点的,先总结下集合和数组的区别
1.数组长度固定,集合长度不固定
2.数组只能存储同一类型的元素,集合可以存储不同数据类型(在引入泛型后,可以规定元素的类型相同)
3.数组可以存储基本类型也可以存储引用类型,集合只能存储引用类型
集合类由两大接口派生而出:Collection<E>和Map<K,V>
Collection<E>:是接口,需要由实现类去实现接口,存储单列元素。
它的主要方法:
添加:boolean add(E e) 移除:boolean remove(Object o) 判断是否包含某元素:boolean contains(Object o) 返回集合中元素的个数:int size() 判断集合是否为空:boolean isEmpty() 迭代器:Iterator<E> iterator() 是Collection集合特有的一种遍历方式,实现了Iterable<E>接口,使用boolean hasNext():如果迭代器中还有元素,则返回true。和E next():返回迭代器中的下一个元素 这两个方法进行遍历
它的子接口:List<E>和Set<E>及Queue<E>。List集合中元素是有序不唯一的(有序是指存储有序但不是排序),Set集合中元素是无序但唯一的。
List<E>集合的实现类:
Set<E>集合的实现类:
HashSet:底层数据结构是哈希表,依赖HashCode()方法和equals()方法。这两个方法的执行顺序:先HashCode(),值不同:添加;值相同:equals()值,不同:添加;相同:不添加。 其子类LinkedHashSet,底层数据结构由哈希表及链表构成,链表保证元素有序,Set保证元素唯一。
TreeSet:底层数据结构是红黑树,是一种自平衡的二叉树。元素排序(是排序不是有序!)
排序分为自然排序和比较器排序。自然排序:元素具备比较性,元素所属类实现接口Comparable即可,比如我们平常使用的Integer,String都已实现Comparable接口;比较器排序:如果元素是自定义类时,需要按需求对元素进行排序,比如按自定义类中的某个成员变量的大小进行排序,此时需要集合接收一个Comparator的实现类对象,可采用匿名内部类或外部类去重写compare()方法。
Map<K,V>:是一个接口,K是键 ,V是该键对应的值,存储的元素是键值对,也就是成对存在的,存储双列元素。键不能重复,每一个键最多映射一个值。
它的主要方法:
添加:V put(K key,V value) 删除:V remove(K key,V value) 判断:1).boolean containsKey(Object o):是否包含某个键;2).boolean containsValue(Object o):是否包含某个值;3).boolean isEmpty():是否为空 获取:1) Set<K> keySet() 获取所有键的视图 2) V get(Object key) 返回改建对应的值 3) int size() 获得该集合的键值对的对数
Map集合的遍历方式:
1)键找值:将所有的键获取到一个集合Set中,再遍历该集合获取对应的值
2)由键值对对象找键和值:获取所有的键值对对象到集合中,再遍历该集合获得每一个键值对的键和值
Map常用的实现类与Set的实现类类似:
注意:Map集合的数据结构仅对键有效,与值无关。
判断使用哪个集合:
是否是键值对形式的元素?
是:Map
是否需要排序?
是:TreeMap
否:HashMap
否:Collection
是否唯一(或有序)
不唯一,有序:List
数据结构:数组:ArrayList(线程不安全,效率高);Vector(线程安全,效率低)
链表:LinkedList(线程不安全,效率高);
唯一,无序:Set
是否排序?
是:TreeSet
否:HashSet
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对呐喊教程的支持。如果你想了解更多相关内容请查看下面相关链接
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:notice#nhooo.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。