1. ArrayList与LinkList区别
- ArrayList是数组的数据结构,LinList是链表的数据结构
- 随机访问时,ArrayList效率比较高,因为LinkList要移动指针,而ArrayList是给予索引(index)的数据结构,可以直接映射到。
- 插入和删除数据时,LinkList的效率比较高,因为ArrayList要移动大量的数据
- LinkedList比ArrayList开销更大,因为LinkedList的节点除了存储数据,还要存储引用。
Coolections.sort和Arrays.sort的实现原理
- Collection.sort是对list进行排序,Array.sort是对数组进行排序。
HashMap原理,java8做了什么改变
- HashMap是以键值对存储数据的集合容器
- HashMap是非线程安全的
- HashMap底层数据结构:数组+(链表、红黑树),jdk8之前是用数组+链表的方式实现,jdk8引进了红黑树
- HashMap数组的默认长度是16,key和value都允许null的存在
- HashMap的内部实现数组是Node[] 数组,上面存放的是key-value键值对的节点。HashMap通过put和get方法存储和获取。
List和Set,Map的区别
- List以索引来存取元素,有序的,元素是允许重复的,可以插入多个null。
- Set不能存放重复元素,无序的只允许一个null。
- Map 保存键值对映射,映射关系可以一对一、多对一
- List 有基于数组、链表实现两种方式
- Set、Map 容器有基于哈希存储和红黑树两种方式实现
- Set 基于 Map 实现,Set 里的元素值就是 Map的键值
HashMap,HashTable,ConcurrentHash的共同点和区别
底层实现 | 是否可以为空 | 线程是否安全 | 初始容量及扩容 | |
---|---|---|---|---|
HashMap | 链表+数组+红黑树 | 可以存储null键和null值 | 线程不安全 | 初始容量16,每次扩容2的n次幂 |
HashTable | 链表+数组+红黑树 | key和value都不能为空 | 线程不线程安全的 使用了synchronized关键字 | 初始容量11 |
ConcurrentHashMap | 链表+数组+红黑树 | 不能存储null的键和值 | 线程安全的,使用锁分段技术确保线程安全 |
写一段代码在遍历ArrayList时移除一个元素
//倒叙遍历删除
for(int i=list.size()-1;i>-1;i--){
if(list.get(i).equals("jay")){
list.remove(list.get(i);
}
}
//迭代器删除
Iterator itr = list.iterator();
while(itr.hasNext()){
if(itr.next().equals("jay"){
itr.remove();
}
}
//打印数组的方式
public class Test{
public static void main(String[] args){
String[] jayArray ={"jay","boy"};
Stream.of(jayArray).forEach(System.out::println);
System.out.println(Arrays.toString(jayArray))
}
}
//output
jay
boy
//output2
[jay,boy]
HashMap扩容过程
- 第一步把数组长度变为原来的两倍
- 第二步吧旧数组的元素重新计算hash插入到新的数组中
ArrayList和Vector的区别是什么
- vector是线程安全的,ArrayList不是线程安全的
- ArrayList在底层数组不够用时在原来的基础上扩展0.5倍,vector是扩展1倍
- Vector只要是关键性的操作,方法前面都加了synchronized关键字,来保证线程的安全性。
如何决定使用HashMap还是TreeMap?
- TreeMap实现SortMap接口,能保证记录根据键值排序,默认是按key的升序排序,也可以指定排序的比较器,当用Iterator遍历TreeMap时 得到的记录是排过序的。
- TreeMap使用Iterator迭代方法:
TreeMap<Integer,String> treeMap = new TreeMap();
treeMap.put(1,"hello");
treeMap.put(9,"big");
treeMap.put(18,"beautiful");
treeMap.put(5,"world");
Set set = treeMap.entrySet();
Iterator iterator = set.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
//outPut
1=hello
5=world
9=big
18=beautiful
//已经根据key(键)的值进行排序
如何实现数组和List之间的转换?
- List转Array,必须使用集合的toArray(T[] array),:
List<String> list = new ArrayList<String>();
list.add("shuo");
list.add("❤");
list.add("lin");
String[] array = list.toArray(new String[list.size()]);
System.out.println(Arrays.toString(array));
//outPut
[shuo, ❤, lin]
- Array转List
String[] str = new String[]{"lin","❤","shuo"};
ArrayList<String > arrayList = new ArrayList(str.length);
Collections.addAll(arrayList,str);
System.out.println(Arrays.toString(arrayList.toArray(new String[str.length])));
//outPut
[lin, ❤, shuo]
20 迭代器Iterator是什么 怎么用 有什么特点?
Iterator主要是用来遍历集合用的,它的特点是更加安全,因为它可以确保在遍历的集合元素被更改的时候,抛出ConcurrentModificationException 异常。
- next() 方法获得集合中的下一个元素。
- hasNext() 检查集合中是否还有元素
- remove() 将迭代器新返回的元素删除。
- forEachRemaining(Consumer<? super E> action) 遍历所有的元素。
List<String> list = new ArrayList<>();
Iterator<String> it = list.iterator();
while(it.hasNext()){
String obj = it.next();
System.out.println(obj);
}