java常见面试题目面试题汇总

1.JDK和JRE的区别?
jdk:JAVA Development Kit的简称,java开发工具包,提供了java的开发环境和运行环境。
jre:JAVA Runtime Environment 的简称,java运行环境吗提供了java运行环境。
区别:具体来说jdk里面包含了jre,同时还包含了编译java源码的编译器javac,还包含了很多java
调试程序和分析工具。简单来说:如果你只是想运行java程序只需安装jre即可,如果想编写java
代码,就需要安装jdk了。
2.== 和equals的区别?
“== " 对于基本数据类型来说比较的是值是否相同,对于引用类型来说比较的是引用地址是否相同;
equals()是比较的是Object类型,基本数据类型不能用equals()比较。所有的类都是Object的子类,Object类中equals()等价于” == ";比较的也是地址值;像String类重写了equals(),它自己的比较规则,比较的是字符串的内容而不是引用地址的值。

3.两个对象的hashCode()相同,则equals()也一定相同吗?
不相同,因为在散列表中,hashCode()相等即两个键值对的hash值相等,然而hash值相等,并不一定能得出键值对相等。补充说明:两个不同键值对的hash值相等就是"哈希冲突"。
4.final的作用?
final用来修饰类、变量、方法;final修饰的类不可以继承,修饰的变量不可修改,修饰的方法不能被重写。
5.java的基本数据类型?
java有八大基本数据类型,byte、char、short、int、long、boolean、dubole、float;
申明:string类型属于引用类型。
6.String、StringBuffer 、StringBuilder的区别?
String 声明的变量表示不可修改的字符串,每次操作都会生成新的String对象,然后将指针指向新的对象;StringBuffer 和StringBuilder声明的变量表示可以修改的字符串,使用append()可以再原有的对象上面增加字符串内容;
StringBuffer在多线程环境下是线程安全的,但是效率比较慢;StringBuilder在多线程环境下线程不安全;若在单线程下建议使用StringBuilder效率高;多线程情况下使用StringBuffer线程安全。
7.String str = “123” 与 String str = new String(“123”);一样吗?String str = new String(“123”);一共创建了几个对象
不一样;String str = “123” jvm会将其分配到常量池中;String str = new String(“123”);会被分配到堆内存中。
一共创建了两个对象,其中包括一个字符对象和一个字符对象引用对象。
8.抽象类和接口的区别?
抽象类:由abstract关键字修饰的类是抽象类;抽象类不可以被实例化,抽象类里面用abstract修改的方法为抽象方法,抽象方法没有方法体;抽象类里面可以有抽象方法和普通方法;如果一个类继承了抽象类,那么这个类必须定义为抽象类或者实现抽象类里面所有的抽象方法;
接口:通常有interface关键字来声明的;接口里面所有的方法都默认为抽象方法(没有方法体);但是在jdk1.8开始,接口里面的方法可以有普通方法。
区别:抽象类的子类用extends来继承抽象类,接口用implements来实现接口;抽象类可以有构造函数,接口不能有构造函数;抽象类可以有main(),接口没有;一个子类可以实现多个接口,但是只能继承一个抽象类;接口中的方法默认使用public修饰;抽象类中的方法可以是任意访问修饰符。
9.BIO、NIO、AIO的区别?
BIO:Blocking IO同步阻塞式IO,当发起IO的读写操作时,均为阻塞方式,只有当程序读到了流或者将流写入操作系统之后,才会释放资源。
NIO:Non-Blocking IO同步非阻塞式IO,是基于事件驱动思想的,实现上采用Reactor模式,从程序角度而言,当发起了IO的读或写操作时,是非阻塞的;当socket有流可读或者流可以写入socket时,操作系统会相应的通知应用程序进行处理,应用在将流读取到缓冲区或者写入到操作系统。对于网络IO而言,主要有建立连接、流读取及流写入三种事件。
AIO:为异步IO方式,也是基于事件驱动思想,实现上通常采用Proactor模式;从程序角度来说,当进行读写操作时只需调用api的read或者write方法即可。这两种方法均为异步,对于读操作而言,当有流可以读取是,操作系统会将可读的流传入read()的缓冲区,并通知应用程序;对于写操作,当操作系统将write()传递的流写入完毕时,操作系统主动通知应用程序。与NIO比较,AIO一方面简化了程序的编写,流的读写都由操作系统来完成;另一方面省去了NIO中程序要遍历事件通知队列(Selector)的代价。
10.Collection和Collections的区别?
Collection是java.util包下面的一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在java类库中有很多具体实现。Collection接口的意义是为可各种具体的集合提供了最大化的同意操作方式,其直接继承接口有List和Set。
Collections是java.util包下面的一个工具类。它提供了一系列的静态方法用于对集合中的元素进行排序、搜索、以及线程安全等各种操作。
11.List、Set、Map之间的区别?

比较内容ListSetMap
常用接口实现ArrayList、LinkedList、vector等HashSet、TreeSet等|HashMap 、HashTable等
常用方法add()、remove()、clear()、get()、contains()、size()|add()、remove()、clear()、contains()、size() put()、get()、remove()、containsKey()、containsValue()、keySet()、values()、size()
特点有序、可重复无须、不可重复key不可重复、value可重复
线程安全Vector线程安全、其它两个线程不安全HashMap线程不安全、HashTable线程安全
12.HashMap和HashTable的区别?
hashMap去掉了hashTable的contains方法、但是加上了containsValue方法。
hashTable的方法都加上synchronize关键字修饰,是线程安全的,hashMap没有,是线程不安全的,但是效率高。
hashMap允许空键值对,而hashTable不允许

13.HashMap的实现原理
hashMap是基于哈希表的Map接口的非同步实现。此实现提供了所有可选的映射操作,并允许使用null键和null值。此类不保证映射的顺序。hashMap的数据结构是基于链表结构的数组,当我们给put()方法传递键和值时,HashMap会由key来调用hash()方法,返回键的hash值,计算Index后用于找到bucket(哈希桶)的位置来储存Entry对象。

如果两个对象key的hash值相同,那么它们的bucket位置也相同,但equals()不相同,添加元素时会发生hash碰撞,也叫hash冲突,HashMap使用链表来解决碰撞问题。

分析源码可知,put()时,HashMap会先遍历table数组,用hash值和equals()判断数组中是否存在完全相同的key对象, 如果这个key对象在table数组中已经存在,就用新的value代替老的value。如果不存在,就创建一个新的Entry对象添加到table[ i ]处。如果该table[ i ]已经存在其他元素,那么新Entry对象将会储存在bucket链表的表头,通过next指向原有的Entry对象,形成链表结构(hash碰撞解决方案)。
在jdk1.8中对hashMap进行了优化,当链表中的节点数据超过了8个之后,该链表会转为红黑树来提高查询效率,从原来的O(n)到O(logn)。
14.HashSet实现原理
hashSet的底层有hashMap实现,hashSet的值存放在hashMap的key上,hashMap的value统一设置为PRESENT。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值