java集合笔记

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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值