集合
一:介绍
1)ArrayList:是list的子类,允许存放重复的元素,因此有序,集合中元素被访问的顺序取决于集合的类型;
2)LinkedList:是一种可以在任何位置进行高效的插入和删除操作的有序序列;
3)HashSet:是set接口的一个子类,特点:里面不能存放重复元素,而且采用散列的存储方式,没有顺序,元素插入的顺 序和输出的顺序不一致;
二:遍历集合
List<String> list=new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
1)增强for循环遍历:
for (String str: list) {
system.out.println(str);
};
2)for循环;
for(int i=0;i<list.size();i++) {
system.out.println(str);
} ;
3)集合类的通用遍历方式:迭代器;迭代器是Itertor接口,
hasNext():判断集合是否还有其它的元素可以遍历;
next():返回迭代的下一个元素;
remove():删除通过next()迭代出的元素;
Iterator it=list.iterator();
while(it.hasNext()) {
system.out.println(it.next());
}
补充:
1)Iterator():包含了hashNext(),next(),remove()三种方法;
2)它的子接口LinkedIterator在它的基础上增加了add(),precious(),hasPrevious()三种方法;
如果是先Iterator接口,那么在遍历集合中元素的时候,只能往后遍历,被遍历后的元素不会再遍历到,无序集合实现的 都是这个接口;eg:HashSet,HashMap。
那些有序的集合实现的一般都是LinkedIterator接口,实现这个接口的集合可以双向遍历,既可以通过next()访问下一个 元素,又可以通过previous访问前一个元素;eg:ArrayList。
是否有序 | 是否允许元素重复 | ||
Collection | 否 | 是 | |
List | 是 | 是 | |
set | AbstractSet | 否 | 否 |
HashSet | 否 | 否 | |
TreeSet | 是(用二叉排序) | 否 | |
Map | AbstractMap | 否 | key唯一,value可以重复 |
HashMap | 否 | key唯一,value可以重复 | |
TreeMap | 是(二叉排序树) | key唯一,value可以重复 |
三:集合常见面试题
1)ArrayList和Vector有什么区别? HashMap和HashTable有什么区别?
Vector和HashTable是线程同步。性能上LArrayList和HashMap分别比Vector和HashTable更好。
2)大致讲解java集合的体质结构?
List,set和Map是这个集合体系中最主要的三个接口;
其中LIst和Set继承自Collection接口;
Set不允许元素重复,HashSet和TreeSet是两个主要的实现类;
List有序且允许元素重复,ArrayList,LinkedList和Vector是三个主要的实现类;
Map也属于集合系统,但和Collection接口不同,Map是key对value的映射集合,其中key列就是集合,key不能重复,但 是value可以重复,HashMap,TreeMap和HashTable是三个主要的实现类;
SortedSet和SortedMap接口对元素按指定规则排序,SortMap是对key列进行排序;
3)Comparable和Comparator区别?
调用java,Util.Collections.sort(List list)方法来进行排序的时候,List内的Object都是必须实现Comparable接口;
java.Util.Collections.Sort(List list,Comparator c)可以临时声明一个Commparator来实现排序;
4)ArrayList和LinkedList的区别?Collection与Collections的区别?
ArrayList:内部实质上就是一个数组适合查询元素,但是增删元素慢;
LinkedList:内部是链表,首位增删快,查询慢;
Collection是集合的接口;Collections是集合的工具类;
5)HashCode重写?
作为HashMap的key的类,hashCode方法与equal方法的重写要注意,因为这两个方法的结果直接影响散列表的性能;
这两个方法时在Object中定义的,API文档中对应两个方法的重写做了说明:
1:每当我们重写了一个类的equals方法时,就应当连同重写hashCode;
2:hashCode返回的数字应该是稳定的,意思是说当参与equals比较的属性的值没有发生改变的前提下,多次调用 hashCode返回的数字应当相同;
3:hashCode的值应当与equals的结果相对应:
两个对象若equals比较为true,hashCode的值应当相等;
两个对象若equals比较结果为false,hashCode值最好不同,若依然相同,那么作为key存入hashMap中时会产生链 表情况,影响hashMap查询性能;
6)装载因子及hashMap优化
Capacity:容量,hash表里bucket(桶)的数量,也就是散列数组大小;
Initial capacity:初始容量,创建hash表时,初始bucket的数量,默认构建容量是16,也可以使用特定容量;
Size:大小,当前散列表中存储数据的数量;
Load factor:加载因子,默认值0.75(75%),当向散列表增加数据时,如果size/capacity的值大于load factor 则发生扩容 并且重新散列(rehash);
性能优化:加载因子较小时,散列查找性能性能会提高,同时也浪费了散列桶空间容量,0.75是性能和空间相对平衡结 果,在创建散列表时,指定合理容量,减少rehash提高性能;
四:集合方法
int size:返回当前集合的元素总数;
void clear:用于清空当前集合;
boolean isEmpty():判断当前集合中是否不包含任何元素;
add():向集合中添加新元素;
boolean contains(Object o):判断给定的元素是否包含在集合中;
boolean addAll:传入一个集合将该集合中的所有元素添加到当前集合;
boolean containsAll():判断当前集合是否包含给定集合中的所有元素;
E get(int index):获取集合中指定的下标元素,从0开始;
E set(int index,E elment):将给定的元素存入给定位置,原位置元素返回;
void add(int index,E element):给定的插入到指定位置,原位置及后续元素都顺序向后移;
E remove(int index):删除给定位置的元素,并将被删除的元素返回;
subList:获取子list,会影响原list;
List的toArray:将集合转换为数组;
Arrays类中的asList:数组转换为对应的list集合;
Collections.sort:方法实现排序(给定的集合元素进行排序);
Sort方法进行排序,前提得实现Comparable接口,重写ComparTo抽象方法(元素对象排序);
Queue()
队列:特殊的线性表 ,LinkedList实现接口。只能从线性表的一端添加(offer)元素,从另一端取出(poll)元素;
boolean offer(E e):将一个对象添加到队尾,成功则为true;
E poll():从队首删除并返回一个元素;
E peek():返回队首的元素(不删除);
Deque
是Queue的子接口,两端分别可以入队(offer)和出对(poll),先进后出; 如果限制一端出队入队实现栈(stack)的数据接口;
栈:入栈push,出栈pop;
五:Map接口 存储 key-value
实现类:hash表实现的HashMap
V put(K key,V value):向Map中存放元素;
V get(Object key):从Map中获取元素;
boolean containskey(Object key):判断某个key是否在Map中;
Set<K>KeySet():遍历所有的key;
entrySet():遍历所有的键值对方法; LinkedHashMap实现有序;
Collection<V> value():遍历所有value;