专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

50道Java集合经典面试题(收藏版)

  FreemenApp是一款专注于IT程序员求职招聘的一个求职平台,旨在帮助IT技术工作者能更好更快入职及努力协调IT技术者工作和生活的关系,让工作更自由!
  Freemen为了做好大家面试路上的助攻手,对于java这块心里还没底的同学,特整理50道java常见面试题,让你面试不慌,争取Offer拿到手软!1。Arraylist与LinkedList区别
  可以从它们的底层数据结构、效率、开销进行阐述哈ArrayList是数组的数据结构,LinkedList是链表的数据结构。随机访问的时候,ArrayList的效率比较高,因为LinkedList要移动指针,而ArrayList是基于索引(index)的数据结构,可以直接映射到。插入、删除数据时,LinkedList的效率比较高,因为ArrayList要移动数据。LinkedList比ArrayList开销更大,因为LinkedList的节点除了存储数据,还需要存储引用。2。Collections。sort和Arrays。sort的实现原理
  Collection。sort是对list进行排序,Arrays。sort是对数组进行排序。Collections。sort底层实现
  Collections。sort方法调用了list。sort方法
  list。sort方法调用了Arrays。sort的方法
  因此,Collections。sort方法底层就是调用的Array。sort方法Arrays。sort底层实现
  Arrays的sort方法,如下:
  如果比较器为null,进入sort(a)方法。如下:
  因此,Arrays的sort方法底层就是:legacyMergeSort(a),归并排序,ComparableTimSort。sort():即Timsort排序。Timesort排序
  Timsort排序是结合了合并排序(merge。sort)和插入排序(insertionsort)而得出的排序方法;
  1。当数组长度小于某个值,采用的是二分插入排序算法,如下:
  找到各个run,并入栈。
  按规则合并run。
  3。HashMap原理,java8做了什么改变HashMap是以键值对存储数据的集合容器HashMap是非线性安全的。HashMap底层数据结构:数组(链表、红黑树),jdk8之前是用数组链表的方式实现,jdk8引进了红黑树Hashmap数组的默认初始长度是16,key和value都允许null的存在HashMap的内部实现数组是Node〔〕数组,上面存放的是keyvalue键值对的节点。HashMap通过put和get方法存储和获取。HashMap的put方法,首先计算key的hashcode值,定位到对应的数组索引,然后再在该索引的单向链表上进行循环遍历,用equals比较key是否存在,如果存在则用新的value覆盖原值,如果没有则向后追加。jdk8中put方法:先判断Hashmap是否为空,为空就扩容,不为空计算出key的hash值i,然后看table〔i〕是否为空,为空就直接插入,不为空判断当前位置的key和table〔i〕是否相同,相同就覆盖,不相同就查看table〔i〕是否是红黑树节点,如果是的话就用红黑树直接插入键值对,如果不是开始遍历链表插入,如果遇到重复值就覆盖,否则直接插入,如果链表长度大于8,转为红黑树结构,执行完成后看size是否大于阈值threshold,大于就扩容,否则直接结束。Hashmap解决hash冲突,使用的是链地址法,即数组链表的形式来解决。put执行首先判断table〔i〕位置,如果为空就直接插入,不为空判断和当前值是否相等,相等就覆盖,如果不相等的话,判断是否是红黑树节点,如果不是,就从table〔i〕位置开始遍历链表,相等覆盖,不相等插入。HashMap的get方法就是计算出要获取元素的hash值,去对应位置获取即可。HashMap的扩容机制,Hashmap的扩容中主要进行两步,第一步把数组长度变为原来的两倍,第二部把旧数组的元素重新计算hash插入到新数组中,jdk8时,不用重新计算hash,只用看看原来的hash值新增的一位是零还是1,如果是1这个元素在新数组中的位置,是原数组的位置加原数组长度,如果是零就插入到原数组中。扩容过程第二部一个非常重要的方法是transfer方法,采用头插法,把旧数组的元素插入到新数组中。HashMap大小为什么是2的幂次方?效率高空间分布均匀4。List和Set,Map的区别List以索引来存取元素,有序的,元素是允许重复的,可以插入多个null。Set不能存放重复元素,无序的,只允许一个nullMap保存键值对映射,映射关系可以一对一、多对一List有基于数组、链表实现两种方式Set、Map容器有基于哈希存储和红黑树两种方式实现Set基于Map实现,Set里的元素值就是Map的键值5。poll()方法和remove()方法的区别?
  Queue队列中,poll()和remove()都是从队列中取出一个元素,在队列元素为空的情况下,remove()方法会抛出异常,poll()方法只会返回null。
  看一下源码的解释吧:Retrievesandremovestheheadofthisqueue。Thismethoddiffersfrom{linkpollpoll}onlyinthatitthrowsanexceptionifthisqueueisempty。returntheheadofthisqueuethrowsNoSuchElementExceptionifthisqueueisemptyEremove();Retrievesandremovestheheadofthisqueue,orreturns{codenull}ifthisqueueisempty。returntheheadofthisqueue,or{codenull}ifthisqueueisemptyEpoll();6。HashMap,HashTable,ConcurrentHash的共同点和区别
  HashMap底层由链表数组红黑树实现可以存储null键和null值线性不安全初始容量为16,扩容每次都是2的n次幂加载因子为0。75,当Map中元素总数超过Entry数组的0。75,触发扩容操作。并发情况下,HashMap进行put操作会引起死循环,导致CPU利用率接近100HashMap是对Map接口的实现
  HashTableHashTable的底层也是由链表数组红黑树实现。无论key还是value都不能为null它是线性安全的,使用了synchronized关键字。HashTable实现了Map接口和Dictionary抽象类Hashtable初始容量为11
  ConcurrentHashMapConcurrentHashMap的底层是数组链表红黑树不能存储null键和值ConcurrentHashMap是线程安全的ConcurrentHashMap使用锁分段技术确保线性安全JDK8为何又放弃分段锁,是因为多个分段锁浪费内存空间,竞争同一个锁的概率非常小,分段锁反而会造成效率低。7。写一段代码在遍历ArrayList时移除一个元素
  因为foreach删除会导致快速失败问题,fori顺序遍历会导致重复元素没删除,所以正确解法如下:
  第一种遍历,倒叙遍历删除for(intilist。size()1;i1;i){if(list。get(i)。equals(jay)){list。remove(list。get(i));}}
  第二种,迭代器删除Iteratoritrlist。iterator();while(itr。hasNext()){if(itr。next()。equals(jay){itr。remove();}}8。Java中怎么打印数组?
  数组是不能直接打印的哈,如下:publicclassTest{publicstaticvoidmain(String〔〕args){String〔〕jayArray{jay,boy};System。out。println(jayArray);}}output〔Ljava。lang。String;1540e19d
  打印数组可以用流的方式Strem。of()。foreach(),如下:publicclassTest{publicstaticvoidmain(String〔〕args){String〔〕jayArray{jay,boy};Stream。of(jayArray)。forEach(System。out::println);}}outputjayboy
  打印数组,最优雅的方式可以用这个APi,Arrays。toString()publicclassTest{publicstaticvoidmain(String〔〕args){String〔〕jayArray{jay,boy};System。out。println(Arrays。toString(jayArray));}}output〔jay,boy〕9。TreeMap底层?TreeMap实现了SotredMap接口,它是有序的集合。TreeMap底层数据结构是一个红黑树,每个keyvalue都作为一个红黑树的节点。如果在调用TreeMap的构造函数时没有指定比较器,则根据key执行自然排序。
  10。HashMap的扩容过程
  Hashmap的扩容:第一步把数组长度变为原来的两倍,第二步把旧数组的元素重新计算hash插入到新数组中。jdk8时,不用重新计算hash,只用看看原来的hash值新增的一位是零还是1,如果是1这个元素在新数组中的位置,是原数组的位置加原数组长度,如果是零就插入到原数组中。扩容过程第二步一个非常重要的方法是transfer方法,采用头插法,把旧数组的元素插入到新数组中。11。HashSet是如何保证不重复的
  可以看一下HashSet的add方法,元素E作为HashMap的key,我们都知道HashMap的可以是不允许重复的,哈哈。publicbooleanadd(Ee){returnmap。put(e,PRESENT)null;}12。HashMap是线程安全的吗,为什么不是线程安全的?死循环问题?
  不是线性安全的。
  并发的情况下,扩容可能导致死循环问题。13。LinkedHashMap的应用,底层,原理LinkedHashMap维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序可以是插入顺序(insertorder)或者是访问顺序,其中默认的迭代访问顺序就是插入顺序,即可以按插入的顺序遍历元素,这点和HashMap有很大的不同。LRU算法可以用LinkedHashMap实现。14。哪些集合类是线程安全的?哪些不安全?
  线性安全的Vector:比Arraylist多了个同步化机制。Hashtable:比Hashmap多了个线程安全。ConcurrentHashMap:是一种高效但是线程安全的集合。Stack:栈,也是线程安全的,继承于Vector。
  线性不安全的HashmapArraylistLinkedListHashSetTreeSetTreeMap15。ArrayList和Vector的区别是什么?Vector是线程安全的,ArrayList不是线程安全的。ArrayList在底层数组不够用时在原来的基础上扩展0。5倍,Vector是扩展1倍。Vector只要是关键性的操作,方法前面都加了synchronized关键字,来保证线程的安全性。16。Collection与Collections的区别是什么?Collection是Java集合框架中的基本接口,如List接口也是继承于它publicinterfaceListEextendsCollectionE{Collections是Java集合框架提供的一个工具类,其中包含了大量用于操作或返回集合的静态方法。如下:publicstaticTextendsComparablelt;?superTvoidsort(ListTlist){list。sort(null);}17。如何决定使用HashMap还是TreeMap?
  这个点,主要考察HashMap和TreeMap的区别。
  TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按key的升序排序,也可以指定排序的比较器。当用Iterator遍历TreeMap时,得到的记录是排过序的。18。如何实现数组和List之间的转换?List转Array
  List转Array,必须使用集合的toArray(T〔〕array),如下:ListStringlistnewArrayListString();list。add(jay);list。add(tianluo);使用泛型,无需显式类型转换String〔〕arraylist。toArray(newString〔list。size()〕);System。out。println(array〔0〕);
  如果直接使用toArray无参方法,返回值只能是Object〔〕类,强转其他类型可能有问题,demo如下:ListStringlistnewArrayListString();list。add(jay);list。add(tianluo);String〔〕array(String〔〕)list。toArray();System。out。println(array〔0〕);
  运行结果:Exceptioninthreadmainjava。lang。ClassCastException:〔Ljava。lang。Object;cannotbecastto〔Ljava。lang。String;atTest。main(Test。java:14)Array转List
  使用Arrays。asList()把数组转换成集合时,不能使用修改集合相关的方法啦,如下:String〔〕strnewString〔〕{jay,tianluo};ListlistArrays。asList(str);list。add(boy);
  运行结果如下:Exceptioninthreadmainjava。lang。UnsupportedOperationExceptionatjava。util。AbstractList。add(AbstractList。java:148)atjava。util。AbstractList。add(AbstractList。java:108)atTest。main(Test。java:13)
  因为Arrays。asList不是返回java。util。ArrayList,而是一个内部类ArrayList。
  可以这样使用弥补这个缺点:方式一:ArrayListStringarrayListnewArrayListString(strArray。length);Collections。addAll(arrayList,strArray);方式二:ArrayListStringlistnewArrayListString(Arrays。asList(strArray));19。迭代器Iterator是什么?怎么用,有什么特点?publicinterfaceCollectionEextendsIterableE{IteratorEiterator();
  方法如下:next()方法获得集合中的下一个元素hasNext()检查集合中是否还有元素remove()方法将迭代器新返回的元素删除forEachRemaining(Consumerlt;?superEaction)方法,遍历所有元素
  Iterator主要是用来遍历集合用的,它的特点是更加安全,因为它可以确保,在当前遍历的集合元素被更改的时候,就会抛出ConcurrentModificationException异常。
  使用demo如下:ListStringlistnewArrayList();IteratorStringitlist。iterator();while(it。hasNext()){Stringobjit。next();System。out。println(obj);}20。Iterator和ListIterator有什么区别?
  ListIterator比Iterator有更多的方法。ListIterator只能用于遍历List及其子类,Iterator可用来遍历所有集合,ListIterator遍历可以是逆向的,因为有previous()和hasPrevious()方法,而Iterator不可以。ListIterator有add()方法,可以向List添加对象,而Iterator却不能。ListIterator可以定位当前的索引位置,因为有nextIndex()和previousIndex()方法,而Iterator不可以。ListIterator可以实现对象的修改,set()方法可以实现。Iierator仅能遍历,不能修改哦。21。怎么确保一个集合不能被修改?
  很多朋友很可能想到用final关键字进行修饰,final修饰的这个成员变量,如果是基本数据类型,表示这个变量的值是不可改变的,如果是引用类型,则表示这个引用的地址值是不能改变的,但是这个引用所指向的对象里面的内容还是可以改变滴验证一下,如下:publicclassTest{final修饰privatestaticfinalMapInteger,StringmapnewHashMapInteger,String();{map。put(1,jay);map。put(2,tianluo);}publicstaticvoidmain(String〔〕args){map。put(1,boy);System。out。println(map。get(1));}}
  运行结果如下:可以洗发现,final修饰,集合还是会被修改呢boy
  嘻嘻,那么,到底怎么确保一个集合不能被修改呢,看以下这三哥们unmodifiableMapunmodifiableListunmodifiableSet
  再看一下demo吧publicclassTest{privatestaticMapInteger,StringmapnewHashMapInteger,String();{map。put(1,jay);map。put(2,tianluo);}publicstaticvoidmain(String〔〕args){mapCollections。unmodifiableMap(map);map。put(1,boy);System。out。println(map。get(1));}}
  运行结果:可以发现,unmodifiableMap确保集合不能修改啦,抛异常了Exceptioninthreadmainjava。lang。UnsupportedOperationExceptionatjava。util。CollectionsUnmodifiableMap。put(Collections。java:1457)atTest。main(Test。java:14)22。快速失败(failfast)和安全失败(failsafe)的区别是什么?
  快速失败
  在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出ConcurrentModificationException。publicclassTest{publicstaticvoidmain(String〔〕args){ListIntegerlistnewArrayList();list。add(1);list。add(2);Iteratoriteratorlist。iterator();while(iterator。hasNext()){System。out。println(iterator。next());list。add(3);System。out。println(list。size());}}}
  运行结果:1Exceptioninthreadmainjava。util。ConcurrentModificationException3atjava。util。ArrayListItr。checkForComodification(ArrayList。java:909)atjava。util。ArrayListItr。next(ArrayList。java:859)atTest。main(Test。java:12)
  安全失败
  采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历。publicclassTest{publicstaticvoidmain(String〔〕args){ListIntegerlistnewCopyOnWriteArrayList();list。add(1);list。add(2);Iteratoriteratorlist。iterator();while(iterator。hasNext()){System。out。println(iterator。next());list。add(3);System。out。println(listsize:list。size());}}}
  运行结果:1listsize:32listsize:4
  其实,在java。util。concurrent并发包的集合,如ConcurrentHashMap,CopyOnWriteArrayList等,默认为都是安全失败的。23。什么是Java优先级队列(PriorityQueue)?
  优先队列PriorityQueue是Queue接口的实现,可以对其中元素进行排序优先队列中元素默认排列顺序是升序排列但对于自己定义的类来说,需要自己定义比较器publicclassPriorityQueueEextendsAbstractQueueEimplementsjava。io。Serializable{。。。privatefinalComparatorlt;?superEcomparator;
  方法:peek()返回队首元素poll()返回队首元素,队首元素出队列add()添加元素size()返回队列元素个数isEmpty()判断队列是否为空,为空返回true,不空返回false
  特点:1。基于优先级堆2。不允许null值3。线程不安全4。出入队时间复杂度O(log(n))5。调用remove()返回堆内最小值24。JAVA8的ConcurrentHashMap为什么放弃了分段锁,有什么问题吗,如果你来设计,你如何设计。
  jdk8放弃了分段锁而是用了Node锁,减低锁的粒度,提高性能,并使用CAS操作来确保Node的一些操作的原子性,取代了锁。
  可以跟面试官聊聊悲观锁和CAS乐观锁的区别,优缺点哈25。阻塞队列的实现,ArrayBlockingQueue的底层实现?
  ArrayBlockingQueue是数组实现的线程安全的有界的阻塞队列,继承自AbstractBlockingQueue,间接的实现了Queue接口和Collection接口。底层以数组的形式保存数据(实际上可看作一个循环数组)。常用的操作包括add,offer,put,remove,poll,take,peek。
  可以结合线程池跟面试官讲一下哦26。Java中的LinkedList是单向链表还是双向链表?
  哈哈,看源码吧,是双向链表privatestaticclassNodeE{Eitem;NodeEnext;NodeEprev;Node(NodeEprev,Eelement,NodeEnext){this。itemelement;this。nextnext;this。prevprev;}}27。说一说ArrayList的扩容机制吧
  ArrayList扩容的本质就是计算出新的扩容数组的size后实例化,并将原有数组内容复制到新数组中去。publicbooleanadd(Ee){扩容ensureCapacityInternal(size1);IncrementsmodCount!!elementData〔size〕e;returntrue;}privatevoidensureCapacityInternal(intminCapacity){ensureExplicitCapacity(calculateCapacity(elementData,minCapacity));}privatestaticintcalculateCapacity(Object〔〕elementData,intminCapacity){如果传入的是个空数组则最小容量取默认容量与minCapacity之间的最大值if(elementDataDEFAULTCAPACITYEMPTYELEMENTDATA){returnMath。max(DEFAULTCAPACITY,minCapacity);}returnminCapacity;}privatevoidensureExplicitCapacity(intminCapacity){modCount;如果最小需要空间比elementData的内存空间要大,则需要扩容overflowconsciouscodeif(minCapacityelementData。length0)grow(minCapacity);}privatevoidgrow(intminCapacity){获取elementData数组的内存空间长度intoldCapacityelementData。length;扩容至原来的1。5倍intnewCapacityoldCapacity(oldCapacity1);校验容量是否够if(newCapacityminCapacity0)newCapacityminCapacity;若预设值大于默认的最大值,检查是否溢出if(newCapacityMAXARRAYSIZE0)newCapacityhugeCapacity(minCapacity);调用Arrays。copyOf方法将elementData数组指向新的内存空间并将elementData的数据复制到新的内存空间elementDataArrays。copyOf(elementData,newCapacity);}28。HashMap的长度为什么是2的幂次方,以及其他常量定义的含义
  为了能让HashMap存取高效,数据分配均匀。
  看着呢,以下等式相等,但是位移运算比取余效率高很多呢hashlengthhash(length1)
  可以看下我这篇文章哈面试加分项HashMap源码中这些常量的设计目的29。ConcurrenHashMap原理?1。8中为什么要用红黑树?
  聊到ConcurrenHashMap,需要跟面试官聊到安全性,分段锁segment,为什么放弃了分段锁,与及选择CAS,其实就是都是从效率和安全性触发,嘻嘻java8不是用红黑树来管理hashmap,而是在hash值相同的情况下(且重复数量大于8),用红黑树来管理数据。红黑树相当于排序数据。可以自动的使用二分法进行定位。性能较高。30。ArrayList的默认大小
  ArrayList的默认大小是10个元素Defaultinitialcapacity。privatestaticfinalintDEFAULTCAPACITY10;31。为何Collection不从Cloneable和Serializable接口继承?Collection表示一个集合,包含了一组对象元素。如何维护它的元素对象是由具体实现来决定的。因为集合的具体形式多种多样,例如list允许重复,set则不允许。而克隆(clone)和序列化(serializable)只对于具体的实体,对象有意义,你不能说去把一个接口,抽象类克隆,序列化甚至反序列化。所以具体的collection实现类是否可以克隆,是否可以序列化应该由其自身决定,而不能由其超类强行赋予。
  如果collection继承了clone和serializable,那么所有的集合实现都会实现这两个接口,而如果某个实现它不需要被克隆,甚至不允许它序列化(序列化有风险),那么就与collection矛盾了。32。Enumeration和Iterator接口的区别?publicinterfaceEnumerationE{booleanhasMoreElements();EnextElement();}publicinterfaceIteratorE{booleanhasNext();Enext();voidremove();}函数接口不同Enumeration速度快,占用内存少,但是不是快速失败的,线程不安全。Iterator允许删除底层数据,枚举不允许Iterator安全性高,因为其他线程不能够修改正在被Iterator遍历的集合里面的对象。33。我们如何对一组对象进行排序?
  可以用Collections。sort()Comparator。comparing(),因为对对象排序,实际上是对对象的属性排序哈publicclassStudent{privateStringname;privateintscore;publicStudent(Stringname,intscore){this。namename;this。scorescore;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this。namename;}publicintgetScore(){returnscore;}publicvoidsetScore(intscore){this。scorescore;}OverridepublicStringtoString(){returnStudent:this。name分数:Integer。toString(this。score);}}publicclassTest{publicstaticvoidmain(String〔〕args){ListStudentstudentListnewArrayList();studentList。add(newStudent(D,90));studentList。add(newStudent(C,100));studentList。add(newStudent(B,95));studentList。add(newStudent(A,95));Collections。sort(studentList,Comparator。comparing(Student::getScore)。reversed()。thenComparing(Student::getName));studentList。stream()。forEach(pSystem。out。println(p。toString()));}}34。当一个集合被作为参数传递给一个函数时,如何才可以确保函数不能修改它?
  这个跟之前那个不可变集合一样道理哈
  在作为参数传递之前,使用Collections。unmodifiableCollection(Collectionc)方法创建一个只读集合,这将确保改变集合的任何操作都会抛出UnsupportedOperationException。35。说一下HashSet的实现原理?不能保证元素的排列顺序,顺序有可能发生变化。元素可以为nullhashset保证元素不重复(这个面试官很可能会问什么原理,这个跟HashMap有关的哦)HashSet,需要谈谈它俩hashcode()和equles()哦实际是基于HashMap实现的,HashSet底层使用HashMap来保存所有元素的
  看看它的add方法吧publicbooleanadd(Ee){returnmap。put(e,PRESENT)null;}36。Array和ArrayList有何区别?定义一个Array时,必须指定数组的数据类型及数组长度,即数组中存放的元素个数固定并且类型相同。ArrayList是动态数组,长度动态可变,会自动扩容。不使用泛型的时候,可以添加不同类型元素。37。为什么HashMap中String、Integer这样的包装类适合作为key?
  String、Integer等包装类的特性能够保证Hash值的不可更改性和计算准确性,能够有效的减少Hash碰撞的几率
  因为它们都是final修饰的类,不可变性,保证key的不可更改性,不会存在获取hash值不同的情况它们内部已重写了equals()、hashCode()等方法,遵守了HashMap内部的规范38。如果想用Object作为hashMap的Key?;
  重写hashCode()和equals()方法啦(这个答案来自互联网哈)重写hashCode()是因为需要计算存储数据的存储位置,需要注意不要试图从散列码计算中排除掉一个对象的关键部分来提高性能,这样虽然能更快但可能会导致更多的Hash碰撞;
  重写equals()方法,需要遵守自反性、对称性、传递性、一致性以及对于任何非null的引用值x,x。equals(null)必须返回false的这几个特性,目的是为了保证key在哈希表中的唯一性;39。讲讲红黑树的特点?每个节点或者是黑色,或者是红色。根节点是黑色。每个叶子节点(NIL)是黑色。〔注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!〕如果一个节点是红色的,则它的子节点必须是黑色的。从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。40。Java集合类框架的最佳实践有哪些?
  其实这些点,结合平时工作,代码总结讲出来,更容易吸引到面试官呢(这个答案来自互联网哈)1。根据应用需要正确选择要使用的集合类型对性能非常重要,比如:假如知道元素的大小是固定的,那么选用Array类型而不是ArrayList类型更为合适。
  2。有些集合类型允许指定初始容量。因此,如果我们能估计出存储的元素的数目,我们可以指定初始容量来避免重新计算hash值或者扩容等。
  3。为了类型安全、可读性和健壮性等原因总是要使用泛型。同时,使用泛型还可以避免运行时的ClassCastException。
  4。使用JDK提供的不变类(immutableclass)作为Map的键可以避免为我们自己的类实现hashCode()和equals()方法。
  5。编程的时候接口优于实现
  6。底层的集合实际上是空的情况下,返回为长度是0的集合或数组而不是null。41。谈谈线程池阻塞队列吧ArrayBlockingQueueLinkedBlockingQueueDelayQueuePriorityBlockingQueueSynchronousQueue
  ArrayBlockingQueue:(有界队列)是一个用数组实现的有界阻塞队列,按FIFO排序量。
  LinkedBlockingQueue:(可设置容量队列)基于链表结构的阻塞队列,按FIFO排序任务,容量可以选择进行设置,不设置的话,将是一个无边界的阻塞队列,最大长度为Integer。MAXVALUE,吞吐量通常要高于ArrayBlockingQuene;newFixedThreadPool线程池使用了这个队列
  DelayQueue:(延迟队列)是一个任务定时周期的延迟执行的队列。根据指定的执行时间从小到大排序,否则根据插入到队列的先后排序。newScheduledThreadPool线程池使用了这个队列。
  PriorityBlockingQueue:(优先级队列)是具有优先级的无界阻塞队列;
  SynchronousQueue:(同步队列)一个不存储元素的阻塞队列,每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量通常要高于LinkedBlockingQuene,newCachedThreadPool线程池使用了这个队列。针对面试题:线程池都有哪几种工作队列?
  我觉得,回答以上几种ArrayBlockingQueue,LinkedBlockingQueue,SynchronousQueue等,说出它们的特点,并结合使用到对应队列的常用线程池(如newFixedThreadPool线程池使用LinkedBlockingQueue),进行展开阐述,就可以啦。42。HashSet和TreeSet有什么区别?Hashset的底层是由哈希表实现的,Treeset底层是由红黑树实现的。HashSet中的元素没有顺序,TreeSet保存的元素有顺序性(实现Comparable接口)HashSet的add(),remove(),contains()方法的时间复杂度是O(1);TreeSet中,add(),remove(),contains()方法的时间复杂度是O(logn)43。Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?是用还是equals()?
  元素重复与否是使用equals()方法进行判断的,这个可以跟面试官说说和equals()的区别,hashcode()和equals44。说出ArrayList,LinkedList的存储性能和特性
  这道面试题,跟ArrayList,LinkedList,就是换汤不换药的ArrayList,使用数组方式存储数据,查询时,ArrayList是基于索引(index)的数据结构,可以直接映射到,速度较快;但是插入数据需要移动数据,效率就比LinkedList慢一点LinkedList,使用双向链表实现存储,按索引数据需要进行前向或后向遍历,查询相对ArrayList慢一点;但是插入数据速度较快。LinkedList比ArrayList开销更大,因为LinkedList的节点除了存储数据,还需要存储引用。45。HashMap在JDK1。7和JDK1。8中有哪些不同?
  互联网上这个答案太详细啦(https:www。jianshu。comp939b8a672070)
  46。ArrayList集合加入1万条数据,应该怎么提高效率
  因为ArrayList的底层是数组实现,并且数组的默认值是10,如果插入10000条要不断的扩容,耗费时间,所以我们调用ArrayList的指定容量的构造器方法ArrayList(intsize)就可以实现不扩容,就提高了性能。47。如何对Object的list排序
  看例子吧,哈哈,这个跟对象排序也是一样的呢publicclassPerson{privateStringname;privateIntegerage;publicStringgetName(){returnname;}publicvoidsetName(Stringname){this。namename;}publicIntegergetAge(){returnage;}publicvoidsetAge(Integerage){this。ageage;}publicPerson(Stringname,Integerage){this。namename;this。ageage;}}publicclassTest{publicstaticvoidmain(String〔〕args){ListPersonlistnewArrayList();list。add(newPerson(jay,18));list。add(newPerson(tianLuo,10));list。stream()。forEach(pSystem。out。println(p。getName()p。getAge()));用comparing比较对象属性list。sort(Comparator。comparing(Person::getAge));System。out。println(排序后);list。stream()。forEach(pSystem。out。print(p。getName()p。getAge()));}}48。ArrayList和HashMap的默认大小是多数?
  在Java7中,ArrayList的默认大小是10个元素,HashMap的默认大小是16个元素(必须是2的幂)。49。有没有有顺序的Map实现类,如果有,他们是怎么保证有序的Hashmap和Hashtable都不是有序的。TreeMap和LinkedHashmap都是有序的。(TreeMap默认是key升序,LinkedHashmap默认是数据插入顺序)TreeMap是基于比较器Comparator来实现有序的。LinkedHashmap是基于链表来实现数据插入有序的。50。HashMap是怎么解决哈希冲突的
  Hashmap解决hash冲突,使用的是链地址法,即数组链表的形式来解决。put执行首先判断table〔i〕位置,如果为空就直接插入,不为空判断和当前值是否相等,相等就覆盖,如果不相等的话,判断是否是红黑树节点,如果不是,就从table〔i〕位置开始遍历链表,相等覆盖,不相等插入。
  本文转载自捡田螺的小男孩

如果你信用卡网贷负债累累,现收入又不够还利息的,你会怎么做?感谢邀请握手本人也是使用过信用卡,深知信用卡最低还款的压力,利息越滚越多,在遇到这个问题,可以这样解决。一联系发卡行协商分期还款,最短三期,最长三十六期,一般信用卡分期利率在0。7为什么中国小学数学教育要分除和除以的区别?除和除以的区别除,是除数在前,被除数在后除以,是被除数在前,除数在后。这个大家都知道,题主想问的应该是,为什么要这么区分。那么,这个问题,数学老师并不能回答。他们只知道,教材上就是现在带编制的教师到底有多难考?先来自我介绍一下,非师范的应届生,今年刚刚上岸小学英语老师,上周已经开始上班了,做做开学前的一些准备工作,提前熟悉一下工作环境,目前感觉还是挺好的下面可以简单的来说一下我的备考情况初一女生作业多,每天仅休息六个小时,死命学习没效果,成绩很差,有何快速提高成绩法?小学升入初中,同学们无论是身体,还是生理,心智都有一个质的变化。学习上,班级管理上,老师再也不会象小学那样看管好每一位同学,很大程度上要依赖于同学们积极自觉完成作业,掌握知识。现在如果国家要求教师必须全面发展,凡是学生需要的东西老师都必须精通,你还会当老师吗?老师不是神。如果国家要求教师,必须全面发展。凡是学生需要的东西。老师都必须精通,你还会当老师吗?这道题是一道假设题,这个问题本身就是不可能办到的事情。要求中小老师,全面发展,这一点为什么江苏的好大学基本没有江苏俩字,比如南大东大河海南航矿大南理工江大苏大药大等等?江苏的大学都不想仅局限于江苏,心中都有大格局,就是要成为中国名校,世界名校。这也符合江苏人眼界高,不做附庸的性格。江苏的好大学,一般都集中在南京,因为民国时期,首都在南京,当时叫南本人江苏文科生,陕西理工大学和徐州工程学院哪个更好?本人江苏文科生,陕西理工大学和徐州工程学院哪个更好?作为文科生,进入理工科为主的高等院校,就学科专业方向上来说,两所大学不分轩轾,没有更好之说作为江苏考生来说,究竟去哪所大学,就要中南财经政法大学算名校吗?大家好,这里是小雅老师课堂。答疑解惑,互动分享。中南财经政法大学是知名的财经类院校,211大学,综合素质非常不错的大学。毕业的学生们出路都非常不错,关键是这里的食堂里好吃的很多,小大连凯旋大厦失火,19楼住户会承担责任吗?这场大火损失的是整座大厦,19楼住户可承担不起,具体还要等官方报道,我们普通百姓可不能乱说。昨天看到这个大火确实震惊了,大连是我第二故乡。在大连上学工作结婚生子,整整十年,我对大连假如你彩票中了一个亿,你会干嘛?中了一个亿的大奖,对普通百姓来说是天上掉下馅饼,梦寐以求的小目标。精神刺激与物质满足会令人心态变异。如果我有幸被砸中,会把这个信息与亲戚朋友分享,大家聚在一起好好庆祝一番,并适当赏外地人考上公务员,能否工作几年后调回家乡呢?又不是坐火箭啊,那么快就想回家!公务员是个工种,不是玩过山车的。一般来说,外地人考上公务员,调回家乡很难,离家乡近点或许可以吧。因为现代交通工具如此发达,北京距新疆也不过才几个小时
十年淬火炼真钢走进奋进新时代主题成就展全面从严治党单元中央纪委国家监委网站陈昊杨文佳报道步入展区,迎面的展墙正中,一面电子屏幕滚动播放着记录党的十八大以来全面从严治党取得的历史性开创性成就的视频,吸引着往来观众驻足观看。屏幕上方,金色一个人的情人,命里是有定数的人生在世命也运也布大道于天下施善念于人心虽无修行身亦是修行人洞明修行苦方开修行门林徽因在给徐志摩的分手信中这样写道!如果你早点出现就好了,我一定会明目张胆地炫耀你,可是现在我们中间你为什么总是闷闷不乐?明明自己很想快乐当你开始人生这趟列车,一路开往终点。无论是微风和煦的春天,繁花似锦的夏天,硕果累累的秋天还是大雪纷飞的冬天列车都将呼啸而过,无法为你停留。当你长大后发现我们多渴望列车停留在快乐时光清荷札记绿荷入眸,浅喜深爱作者清荷札记夜露凝寒,万物皆秋,绿荷入眸,浅喜深爱,烦因缘至,闲由念生,心有山海,静而不争!十月,清秋入梦,寂寞是安享的清福,孤独是最好的修心。一捧书香,一盏茶茗,端庄为一朵莲韵的100条经典名言,写作使用频率超高01。最简单的音调,需要最艰苦的练习。泰戈尔02。挫败使人苦痛,却很少有人利用挫败的经验修补自己的生命。这份苦痛,就白白地付出了。三毛03。始终如一的目标不足以使生活幸福,但它几乎寒露王巍寒露寒露,云淡风瑟日渐凉,思念倍增,游子入心房寒气,借露势欺暖施寒威,日渐加重,几多心中牵挂,帽可有,衣可备,足下可有御寒袜与鞋露水,夜降晨俞浓,寒冷筑凝重,点点滴滴,晶莹剔透映视新的拐点出现,台积电再秀肌肉,苹果也扛不住了大家都知道,在芯片代工领域,台积电可谓是一家独大的存在,就算三星早一步实现了3nm制程芯片的量产,但仍然撼动不了台积电的地位,原因无他,只因台积电拥有超高的芯片产能和良品率。然而,37岁后还能场均20分有多难?NBA历史仅4人做到,詹皇成天花板对于NBA球员来说,单赛季场均20分并非太难,尤其是小球时代开启后,但是,当一名球员年龄到达37岁,还可以在NBA打出场均20分及以上的数据是极其难能可贵的。很多球员到了这个年龄,马伊琍也太瘦了吧,穿水桶裤都很飘逸,有种走路带风的大气感在日常生活中,多数女性喜欢的时装,都是中规中矩的款式,很少有人会尝试廓形时装。廓形服装的整体呈现,会让觉得很有距离感,这种衣服通常会出现在时尚杂志的封面上,或者是较为摩登的T台走秀堪比邓肯詹姆斯的天赋!文班亚马闪耀球场!NBA联盟或迎来大摆烂NBA精彩绝伦,联盟群星璀璨!NBA是全世界的篮球殿堂,每一个篮球运动员都梦想在NBA的舞台上一展身手,这里吸引着全世界媒体以及的球迷的关注,这里千万年薪不值一提,亿元合同也屡见不面对美国卡脖子升级中国该怎么办?直新闻我们看美国7日发布的这份清单,发现美国并非在某种高科技产品的生产环节打压中国,而是试图在包括支撑高科技产业发展的研发机构等一系列环节卡脖子,对此您怎么看?中国该怎么做?对外经
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网