@TOC
Array 和 ArrayList 有何区别?如何实现 Array 和 List 之间的转换?
面试官:了解Array这个类嘛?它和AraayList有什么区别?
我:Array是一个辅助工具类,主要是辅助数组用的,有get和set方法可以更改数组对应index上的value值,还可以用它创建指定长度和类型的数组。 而 ArrayList是集合的一个实现类,实现了List接口,List又继承自Collection接口,List底层封装了一个Object[]的数组,ArrayList的好处就是可以不用考虑数组的长度,创建的时候会有一个初始容量,超过容量便会触发动态扩容,扩容的机制是1.5倍扩容。大概就是这些了。
面试官:好的,那如何实现Array和List之间的相互转换呢?
我:Array转List我记得的有这么几种,一种是遍历数组所有元素,add方法添加到List集合中,第二种是用Arrays.asList将数组转成List,第三种就是用Collections.addAll()方法将数组转成List。 List转Array方法就相对少一点,我记得除了遍历元素以外,List有个自带的toArray方法可以将List转成数组,我日常应用的大概就是这几个常见的方法了。
ps:List这个toArray方法返回的是一个Object[]数组,不能用强转转换成对应的类型,应该在toArray时候传入数组的类型和长度。
List<String> list=new ArrayList<String>();
list.add("hello");
list.add("world");
String[] str2=list.toArray(new String[list.size()]);
for (String string : str2) {
System.out.println(string);
}
Collection 和 Collections 有什么区别?
面试官:你既然提到了Collections和Collection,那你说说它俩的区别吧。
我:好的,Collection是java集合的一个重要分支,另一个分支是Map,Collection接口下面又三个重要子接口,Set(集),List(列表)和Queue(队列),三个子接口又有多个对应的实现类,就像List有刚才提到的ArrayList一种实现类以外还有LinkedList,用于不同的环境。 而Collections是集合的辅助工具类,他和Arrays一样都是util包下的,有一些辅助集合的方法,像是sort()排序方法,二分查找,反转等方法,方便集合的使用。
Collections 工具类中的 sort()方法如何比较元素?
面试官:看来日常的开发中你也用到过Collections,那你能说说Collections的sort()排序方法是如何比较元素的嘛?
我:(这个我不会,没答上来,我当时就瞎蒙了一个comparable,菜就是原罪,我查看了一下源码,就放这么多,自己看去)
public static <T extends Comparable<? super T>> void sort(List<T> list) {
list.sort(null);
}
public static <T> void sort(List<T> list, Comparator<? super T> c) {
list.sort(c);
}
可以看到他有两种方式的排序,一种是继承了Comparable,这种方法就是传入待排序的容器中,然后进行比较,调用了List.sort()方法,这个List.sort()的底层其实调用了Array.sort()方法,Array.sort()的底层有三种排序算法,有个比较耳熟能详的二分排序法,好奇的自己去看吧,我就不多叨叨了。 另一种要传一个Comparator的子类进去,要重写compare() 方法,这样就可以自定义排序了。
来了来了,总是少不了你——HashMap
面试官:你提到了集合的另一个分支Map,那你用过HashMap加粗样式嘛?,说说他的底层实现。 我:到底还是没躲掉。 这我就不再赘述了,看另外一篇博客吧,写的比较细一点 链接: blog.csdn.net/qq_42828912…. 不好看你回来打我!! 这里省略20分钟的底层实现问题~
TreeMap 和 TreeSet 在排序时如何比较元素?
面试官:看来你很了解集合这块知识,那我再问你最后一个问题吧, TreeMap 和 TreeSet 在排序时如何比较元素?
我:好的,TreeSet和TreeMap排序时都需要实现Comparable接口,但TreeSet底层默认参数是Comparator,也就是说TreeSet的排序要实现comparaTo()方法,和且TreeSet底层就是调用了TreeMap的方法,这里体现了组合模式。
而TreeMap要求存放的键值对映射的键必须实现Comparable接口,从而根据键对元素进行排序。
最后给你们推荐一本书吧
这是我最近在看的一本书,我觉得很适合在座的各位!
如果答案里可以补充的,请写在评论区打我的脸!
要是有错误,可别放过我,打死我,快点滴!!
啥也不是!!