文章目录
集合
集合体系结构:
集合分为单列集合以及双列集合
ArrayList添加元素的过程及扩容机制?
ArrayList在创建一个对象时会默认给定一个容量值10(除创建时就给定容量外),在添加一个元素时ArrayList底层会判断加上这个元素后容量是否足够,如果足够则直接添加,如果不够,将原来的数组复制到一个容量是之前1.5倍的数组中,在加上需要添加的元素.
ArrayList和LinkedList的区别?
ArrayList和LinkedList都实现了list接口,但是他们有一下区别:
ArrayList是基于索引的数据结构,它的底层是数组,它可以以o(1)时间复杂度对元素进行访问。与此对应,LinkedList是以元素列表的形式存储数据,每个元素都跟它的前一个和后一个元素连接在一起,这种情况下,查找某个元素的时间复杂度是o(n)。
LinkedList比ArrayList更占内存,因为LinkedList为每个节点存储了两个引用,一个指向前一个元素,一个指向后一个元素。
总的来说:
ArrayList:数组储存,利用数组储存,查询块,在中间添加值,删除值的效率低
LinkedList:链表储存,利用链表存储,查询慢,在中间添加值,删除值的效率高.
HashMap的底层实现原理?
添加元素时(首次添加时会创建哈希数组默认长度是16 ,数组只是用来定位元素在哈希表中的位置),根据添加元素的哈希值通过哈希函数计算得到一个小于哈希数组长度的值,将需要添加的元素以链表的形式添加到函数求得的值对应的哈希数组位置中,当哈希数组的某一个位置重复时,将连接到上一次链表的后面,当一个链表的长度达到7时,会将链表转成红黑树,以方便检索,当哈希数组数据存储达到当前数组长度的0.75(称为负载因子)时就会扩容到原来的2倍.
HashMap
HashMap中的元素的key值不能重复,排列顺序是不固定的,可以存储一个为null的键.
TreeMap中所有的元素都保持某种固定的顺序,如果需要得到一个有序的Map就应使用TreeMap,Key值所在的类必须实现Comperable接口
HashTable实现了同步.不能存储null的键.
Map遍历方式1
Set<String> keyset = map.keySet();//将键存放在一个数组中
for(String key : keyset){
System.out.println()
}
Map遍历方式2
/*
entrySet();是把map中的键值对封装在一个Entry对象中,将多个Entry对象装进Set集合中.
Entry对象包含键值
*/
Set<Entry<String,String>> entrySet = map.entrySet();
for(Entry entry : entrySet){
System.out.println(entry.getKey()+"::"+entry.getValue());
}
Collections类
Collections:是集合的工具类,如同数组的工具类Arrays类似.
Collection和Collections的区别:Collection是一个接口,而Collections是一个工具类.
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class CollectionDemo {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(5);
list.add(4);
list.add(8);
list.add(6);
Collections.addAll(list,1,2,3);//将"1,2,3"在list后面添加
Collections.sort(list);//list集合排序
System.out.println(Collections.binarySearch(list,2));//二分法查找
//使用匿名内部类自定义集合排序方法
Collections.sort(list,new Comparator<Integer>(){
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});
System.out.println(list);
ArrayList<Integer> list1 = new ArrayList<>();
list1.add(9);
list1.add(0);
list1.add(7);
Collections.copy(list,list1);//将集合list1中的元素复制到list中,并覆盖list中原来0-list1.size()-1的值;目标集合要大于或等于被复制的集合
System.out.println(list);
List<Integer> list2 = Collections.emptyList();//返回一个空集合,集合不能使用 避免判断时出现空指针错误
Collections.fill(list,5);//用5填充list集合
Collections.swap(list,1,6);//交换list中1 和 6 的值;
System.out.println(list);
Collections.reverse(list);//逆序list数组;
System.out.println(list);
System.out.println(Collections.max(list));//返回集合中的最大值
Collections.replaceAll(list1,7,6);//用6替换list1集合中所有的7
/*
addAll(Collection<? super T> c, T... elements)
*/
}
/* int ...a定义可变长度的参数,表示不确定参数的个数,
本质是数组,一个参数列表中只能有一个,并且放在参数列表的最后一位*/
public static void test(int b, int ...a){
}
}