集合:
Collcetion是一个接口类,其继承了JAVA的迭代接口Iterable。
Collection接口有两个主要的子接口List和Set,Map不是Collection的子接口。
Collection中可以存储的元素无序,可以重复组各自独立的元素,即其内的的每个位置仅有一个元素,可以允许同时由多个null对象。
Collection接口中的方法如下:
size():int
isEmpty():boolean
contains(Object):boolean
iterator():iterator<E>
toArray():Object[]
toArray(T[])<T>:T[]
add(E):boolean
remove(Object):boolean
containsAll(Collection<?>):boolean
addAll(Collection<? extends E>):boolean
removeAll(Collection<?>):boolean
clear():void
equals(Object):boolean
hashCode():int
1)List接口
List接口中元素的特点为:存储的元素实现类排序,而且可以重复存储相关信息。
1)实现类ArrayList(数组线性表)
特点:类似数组的方式存储,因为他随机访问的速度极快。
缺点:不适合于在线性表中进行频繁的插入和删除操作,因为每次插入和删除都要移动数组中的元素。
注意:
a.如果在初始化ArrayList的时候没有指定初始化长度的话,默认的长度为10.
b.ArrayList在增加新元素的时候如果超过了原始的容量的话,ArrayList扩容ensureCapacity的方案为“原始容量*3/2+1
int newCapacity
= (oldCapacity * 3)/2 + 1;
c.ArrayList是线程不安全的,在多线程的情况下不要使用。(多线程情况下可以使用Vector)
d.ArrayList实现遍历的几种方法
package com.yonyou.test;import java.util.ArrayList;import java.util.Iterator;import java.util.Listpublic class Test{public static void main(String[]
args) { List<String>
list=new ArrayList<String>(); list.add("Hello"); list.add("World"); list.add("HAHAHAHA"); //第一种遍历方法使用foreach遍历List for (String
str : list) { //也可以改写for(int
i=0;i<list.size();i++)这种形式 System.out.println(str); } //第二种遍历,把链表变为数组相关的内容进行遍历 String[]
strArray=new String[list.size()]; list.toArray(strArray); for(int i=0;i<strArray.length;i++) //这里也可以改写为foreach(String
str:strArray)这种形式 { System.out.println(strArray[i]); } //第三种遍历
使用迭代器进行相关遍历 Iterator<String>
ite=list.iterator(); while(ite.hasNext()) { System.out.println(ite.next()); } }}2)LinkedList
LinkedList的链式线性表的特点为: 适合于在链表中间需要频繁进行插入和删除操作。
LinkedList的链式线性表的缺点为: 随机访问速度较慢。查找一个元素需要从头开始一个一个的找。
LinkedList的内部实现
LinkedList的内部是基于双向循环链表的结构来实现的。在LinkedList中有一个类似于c语言中结构体的Entry内部类。
在Entry的内部类中包含了前一个元素的地址引用和后一个元素的地址引用类似于c语言中指针。
LinkedList不是线程安全的
注意LinkedList和ArrayList一样也不是线程安全的,如果在对线程下面访问可以自己重写LinkedList
然后在需要同步的方法上面加上同步关键字synchronized
LinkedList的遍历方法
package com.yonyou.test;import java.util.LinkedList;import java.util.Listpublic class Test{public static void main(String[]
args) { List<String>
list=new LinkedList<String>(); list.add("Hello"); list.add("World"); list.add("龙不吟,虎不啸"); //LinkedList遍历的第一种方式使用数组的方式 String[]
strArray=new String[list.size()]; list.toArray(strArray); for(String
str:strArray) { System.out.println(str); } //LinkedList遍历的第二种方式 for(String
str:list) { System.out.println(str);
} }}a.HashSet中存放null值
HashSet中时允许出入null值的,但是在HashSet中仅仅能够存入一个null值哦。
b.HashSet中存储元素的位置是固定的
HashSet中存储的元素的是无序的,这个没什么好说的,但是由于HashSet底层是基于Hash算法实现的,使用了hashcode,
所以HashSet中相应的元素的位置是固定的哦。
c.遍历HashSet的几种方法
package com.yonyou.test;import java.util.HashSet;import java.util.Iterator;import java.util.Set;public class Test{public static void main(String[]
args) { Set<String>
set=new HashSet<String>(); set.add("Hello"); set.add("world"); set.add("Hello"); //遍历集合的第一种方法,使用数组的方法 String[]
strArray=new String[set.size()]; strArray=set.toArray(strArray); for(String
str:strArray)//此处也可以使用for(int
i=0;i<strArray.length;i++) { System.out.println(str); } //遍历集合的第二中方法,使用set集合直接遍历 for(String
str:set) { System.out.println(str); } //遍历集合的第三种方法,使用iterator迭代器的方法 Iterator<String>
iterator=set.iterator(); while(iterator.hasNext()) { System.out.println(iterator.next()); }}}
2)LinkHashSet
LinkHashSet不仅是Set接口的子接口而且还是上面HashSet接口的子接口。
对于LinkedHashSet而言,它和HashSet主要区别在于LinkedHashSet中存储的元素是在哈希算法的基础上增加了
链式表的结构。
3)TreeSet
TreeSet是一种排序二叉树。存入Set集合中的值,会按照值的大小进行相关的排序操作。底层算法是基于红黑树来实现的。
TreeSet和HashSet的主要区别在于TreeSet中的元素会按照相关的值进行排序~
TreeSet和HashSet的区别和联系
1. HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的,只不过Set用的只是Map的key
2. Map的key和Set都有一个共同的特性就是集合的唯一性.TreeMap更是多了一个排序的功能.
3. hashCode和equal()是HashMap用的, 因为无需排序所以只需要关注定位和唯一性即可.
a. hashCode是用来计算hash值的,hash值是用来确定hash表索引的.
b. hash表中的一个索引处存放的是一张链表, 所以还要通过equal方法循环比较链上的每一个对象
才可以真正定位到键值对应的Entry.
c. put时,如果hash表中没定位到,就在链表前加一个Entry,如果定位到了,则更换Entry中的value,并返回旧value
4. 由于TreeMap需要排序,所以需要一个Comparator为键值进行大小比较.当然也是用Comparator定位的.
a. Comparator可以在创建TreeMap时指定
b. 如果创建时没有确定,那么就会使用key.compareTo()方法,这就要求key必须实现Comparable接口.
c. TreeMap是使用Tree数据结构实现的,所以使用compare接口就可以完成定位了.
Map接口实现的是一组Key-Value的键值对的组合。 Map中的每个成员方法由一个关键字(key)和一个值(value)构成。Map接口不直接继承于Collection接口(需要注意啦),因为它包装的是一组成对的“键-值”对象的集合,而且在Map接口的集合中也不能有重复的key出现,因为每个键只能与一个成员元素相对应。
Map接口的常见实现类HashMap、TreeMap、LinkedHashMap、Properties(继承HashTable)以及老版本的HashTable
HashMap
HashMap实现了Map、CloneMap、Serializable三个接口,并且继承自AbstractMap类。
HashMap基于hash数组实现,若key的hash值相同则使用链表方式进行保存。
新建一个HashMap时,默认的话会初始化一个大小为16,负载因子为0.75的空的HashMap
在HashMap中当数据量很多时,并且已经达到了负载限度时,会重新做一次哈希,也就是说会再散列。调用的方法为resize(),并且java默认传入的参数为2*table.length。
Java集合框架详解
本文深入解析Java集合框架,包括Collection接口及其子接口List、Set,还有Map接口等关键概念。探讨了不同集合类如ArrayList、LinkedList、HashSet、TreeSet、HashMap的特性与应用场景。
1万+

被折叠的 条评论
为什么被折叠?



