JAVA若干面试试题(持续更新)

在网上看JAVA的面试试题,因为快要考研复试了,万一问到JAVA那就不好办了。

网上的面试题回答的有些固然很好,可以直接引用。

有些不好理解,但只要自己钻研,等转化成自己的语言能说出来的之后就迎刃而解了。

这篇文章的目的是

①搜罗高频面试题和答案

②梳理网上的答案,去粗取精,去伪存真

③转化成书面语或口头语,能表达出来

本文有计算机考研经验的阅读起来会容易一点点

comparable和comparator的区别?

comparable是比较接口,实体类通过实现这个接口中的一个方法就可以定义排序规则。这意味着在类生成之初就为他定义好了排序规则。以后要对实体类的list进行排序,就可以调用collection.sort(list)直接排序了。integer这种封装类就实现了comparable接口。

但这样做不够灵活,因为只实现了一个排序规则。

comparator也是接口,用户可以自己定义工具类,实现这个接口,进而实现排序功能。用户可以自己定义多个排序类,并实现comparator,进而实现排序规则。要排序时只要collection.sort的一个重载函数sort(list,Asccomparator<T>)即可。

看了上文,有助于更好理解一位大佬写的文章。

Java 中 Comparable 和 Comparator 比较

这篇文章中的代码示例非常详细。美中不足的一点是,在答面试题时难以直接引用,并且对类的种类没有加以区分,刚读的时候容易混淆,不利于初学者理解。所以我就转化成了自己的语言,并区分“实体类”和“工具类”,帮助读者理解。

Collections.sort排序内部原理

在Java 6中Arrays.sort()和Collections.sort()使用的是MergeSort,而在Java 7中,内部实现换成了TimSort,其对对象间比较的实现要求更加严格

Timsort的工作原理

在带排序的序列中,有很多的有序区域,被称为run。在排序的时候,首先分析出这些run。Timsort迭代数据元素,将其放到不同的 run 里。最后将这些run进行合并直到剩下一个,就是我们要求的结果。在分析run的过程中,还会产生一个run的最小值,所有的run都不能低于这个最小值,如果低于,就用插入排序扩充run。python编程需要使用这个排序较早,后来java7中引入了。

timsort详细介绍

https://blog.csdn.net/sinat_35678407/article/details/82974174

介绍一下collection

collection是与集合有关的接口, 集合的顶层接口,不能被实例化

 i. 常用子接口

  1. List实现类:ArrayList(底层实现是动态数组)、Vector、LinkedList(底层实现是链表)

  2. Set实现类:HashSet、TreeSet

主要功能有: 添加功能、 删除功能、 判断功能; 获取功能;长度功能;交集功能;把集合转换为数组

https://blog.csdn.net/zfliu96/article/details/83476493

介绍一下Map

Map是java中的接口,实现了这个接口就可以实现一个由键值对元素组成了集合。

继承了这个接口的有Hashmap,treemap,hashtable

TreeMap使用的存储结构是平衡二叉树,也称为红黑树。学过数据结构都知道平衡二叉树的特性,可以使一个元素的查找效率提高到logn。存储在treemap的元素时有序的,定义排序规则可以通过调用不同的构造函数实现。

map不可以直接用迭代器遍历,需要转化成set之后,再用迭代器遍历。

hashmap的原理

hashmap继承了map接口,它是由键值对组成的集合,底层的实现是hash表,hash表处理冲突的方法是拉链法,这就使得底层实现为hash表+链表。在java8中为了更好地加速在链表中的查询,引入了红黑树,也就是平衡二叉树,冲突元素超过8就用红黑树代替链表。

hashmap和treemap的选择

HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap。HashMap通常比TreeMap效率要高一些,一个是哈希表,一个是二叉树,建议多使用HashMap,在需要排序的Map时候才用TreeMap。

Vector 与 Array 的区别

内存扩展:ArrayList在内存不够时默认是扩展50% + 1个,Vector是默认扩展1倍。

线程安全:Vector属于线程安全级别的,但是大多数情况下不使用Vector,因为线程安全需要更大的系统开销。

如要要求线程安全意味着,两个线程需要互斥地访问一个对象,一个线程在访问时,对象被加锁,另一个线程被阻塞,直到前一个线程放弃这个对象位置。而在非线程安全的情况下,所有的线程都可以同时操作这个对象,效率要高于线程安全时要高。线程安全也可以称为同步

HashMap 与 Hashtable 的区别

继承:Hashtable继承Dictonary类, HashMap继承自abstractMap

允许key为空:HashMap允许空的键值对, 但最多只有一个空对象,而HashTable不允许。

线程安全:HashTable线程安全的或这说同步的,HashMap非同步,效率上比HashTable要高

ConncurrentHashMap和hashtable比较(两个线程并发访问map中同一条链,一个线程在尾部删除,一个线程在前面遍历查找,问为什么前面的线程还能正确的查找到后面被另一个线程删除的节点)

ConcurrentHashMap融合了hashtable和hashmap二者的优势。hashtable是做了同步的,即线程安全,hashmap未考虑同步。所以hashmap在单线程情况下效率较高。hashtable在的多线程情况下,同步操作能保证程序执行的正确性。但是hashtable是阻塞的,每次同步执行的时候都要锁住整个结构,ConcurrentHashMap正是为了解决这个问题而诞生的,ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术。

ArrayList与 LinkedList 的区别?

ArrrayList 底层的数据结构是数组,支持随机访问,而 LinkedList 的底层数据结构书链表,不支持随机访问。使用下标访问一个元素,ArrayList 的时间复杂度是 O(1),而 LinkedList 是 O(n)。LinkedList是双向链表

Collection与Collections的区别是什么?

Collection是Java集合框架中的基本接口;

Collections是Java集合框架提供的一个工具类,其中包含了大量用于操作或返回集合的静态方法。

String 和 StringBuilder 的区别

可变与不可变:String不可变,每一次执行“+”都会新生成一个新对象,所以频繁改变字符串的情况中不用String,以节省内存。string的不可变,是对于string对象本身来讲的,因为它不能被改变,所以就要产生新对象,以达到修改的目的。当执行“+”操作时,实质上就是stringbuilder和append的操作,最后将stringbuilder对象进行tostring()。在Java的内存分配中,总共3种常量池,分别是Class常量池、运行时常量池、字符串常量池。

线程安全:StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。StringBuffer和String均线程安全。

https://blog.csdn.net/ifwinds/article/details/80849184

java中的重载和重写

重载发生在同一个类当中,就是指一个方法的方法名不变,其参数类型、个数、返回值都发生改变。

重写发生在子类当中,子类继承了父类的方法后,可以进行重写。重写返回类型不变,函数参数也不变,函数的逻辑改变了。重载和重写体现了多态性。重写后子类的方法可见性不能低于父类的方法。可见性指的是private、public、protect

发布了19 篇原创文章 · 获赞 10 · 访问量 1945

猜你喜欢

转载自blog.csdn.net/qq_30719815/article/details/104808334
今日推荐