集合大家族

今天看到了一张集合的图,想着有空了进行整理整理,前面高能,哈哈哈哈

看图:

我们可以看到在集合(容器)的左右都有接口,而右边的偏多,这张图总结了各个接口的优缺点以及面试中会遇到的问题。

右边:

Iterable:iterable是iterator(迭代器)的父类,实现了iterable接口的类都可以拥有增加for循环,也就是有foreach循环;另外这个类还必须提供一个名为iterator()的方法,返回iterator.那么没有继承iterable的就没有iterator()方法了吗?不!还有Map,Map虽然单独在一块,但也有iterator()方法

iterator:迭代器主要是循环数据,提供了三个方法,hasNext(),next(),remove()。

Collection:Collection是list,set,queue的父类,Collection主要的方法有add(),remove(Object),clear()等,那么Collection的remove(Object)方法和iterator的remove()方法有什么区别呢?

1、前者的remove方法有参数,iterator的remove方法是没有参数的

2、性能方面。Collection的方法在移除数据时会将数据一次一次的遍历,直到找到要移除的数据,这样速度慢,性能就差,而且还可能出现异常;iterator的方法遵循着“守株待兔的原则”,来一个对象就移除一个对象,因此速度快,性能好。

3、容错方面。Collection的remove是单链表结构,当移除掉前面的一个对象时,就会出现异常,若移除掉后面的对象,就不会出现异常;而iterator的remove方法就是来一个对象移除一个对象,所以不会出现异常。

List: list集合是一个有序集合,也就是可重复,有顺序,有下标。List下分为ArrayList ,LinkedList

ArrayList与LinkedList有什么区别 ? 

相同点:ArrayList与LinkedList的线程不安全

不同点:

1、ArrayList是以数组的方式存储数据的;LinkedList是以双向链表的方式存储数据。

2、在项目中查询的功能很多,用的就是ArrayList;LinkedList一般用于增删改,但和项目中的增删改没有关系。

Set: set是一个无序集合,与list集合相反。set下分为HashSet,TreeSet,LinkedHashSet。HashSet主要是增删改查的速度快,是无序的,集合元素可以是null,但只能放入一个null;TreeSet:是为了提供set的不足,所以TreeSet是有顺序的;

Queue: queue是队列,一种先进先出的数据结构,像在火车站排队进站,先验证完毕的先进站。

Map:map是一个单独的接口,是以键值对的方式存储数据,可以将map理解成是list和set的假小三,但又和他们没有任何关系。因为map的键是可以不可以重复的,不能为空,这就相当于set,而值是可以重复的,可为空,相当于set。map和list,set没有关系。 map下分为HashMap,TreeMap,LinkedHashMap,优缺点可以参考set集合。HashMap的扩容,hashMap的初始容量默认为16,当初始容量达到了75%的扩容因子,那么就要扩容,通常是以2的n次方方式进行扩容。

array和ArrayList的区别?

1、array是数组,有固定的长度和数据类型

2、ArrayList是集合,长度可变,数据类型可变,ArrayList可以说是动态的数组。

如何将一个数组转为List?

1、数组转List,使用Arrays.asList(数组)

public void test1{
    String[] arr = {"包子","馒头","馍馍"};
    List<String> list = Arrays.asList(arr);
    List<String> newStrings = new ArrayList<String>(list);
    newStrings.add("熟了");
    
}

2、List转数组,使用list.toArray()

public void test2{
    List<String> str = new ArrayList<String>();
    str.add("包子");
    str.add("馒头");
    str.add("馍馍");
    String[] arr = str.toArray(new String[str.size()]);
}

如何将数组的顺序打乱?  

1)Collection自带的方法shuffle(),这个方法是将数据拿出来后在打乱.

2) 在数据库中先将数据打乱,在拿出来,如select * from user order by Random.          

扩展:

Queue(队列,先进后出),message(消息),Lopper(循环),Handler(处理)

 我可能是灵魂画手,哈哈哈

     当访问某一个网页,线程中分为两个:主线程,子线程。相当于警察(主)和小偷(子),小偷是个卧底。Looper通过for循环从queue中拿到某一个msg,在将消息传给子线程,子线程将消息交给Handler处理,Handler在交给主线程。所以我们加载网页时会有数据先出来,没有加载出来的在慢慢加载。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值