Java面试基础题目整理

Java基础面试题目整理

Java语言的优点

  • 纯面向对象语言
  • 平台无关性(Java语言可以很好的跨平台)
  • Java提供了很多的内置库
  • 具有较好的安全性和健壮性

面向对象的特征
封装 继承 多态

Java语言八中基本类型
byte short int lang float double char boolean

int和Integer的区别

  1. Integer是int的包装类,int是java的一种基本类型。
  2. Integer使用必须实例化才可使用,int可以直接使用。
  3. Integer是对象的引用,当实例化时,实际上是生成指针指向的对象。
  4. Integer的默认值为null,而int的默认值为0。

final、finally和finalize的区别

  • final是修饰词,final修饰的类不可以被继承。
  • finally是异常处理框的一部分,每次都会执行。
  • finalize是垃圾回收时启动方法。

抽象类和接口的区别?

区别抽象类接口
构造方法可以有构造方法不可以有构造方法
普通成员变量可以有不可以有
非抽象方法可以有所有方法必须抽象
抽象方法的权限可以使public、proteted只能是public
静态变量可以使任意权限只能是public static final
实现一个类只能继承一个类一个类可以实现多个接口

Java程序初始化的先后顺序

  1. 静态对象(变量)优于非静态对象(变量)。
  2. 父类优先于子类进行初始化。
  3. 按照成员变量定义的对象进行初始化。

Java创建对象的几种方式

  • 通过new 语句实例化一个对象。
  • 通过反射机制创建对象。
  • 通过clone()方法创建对象。
  • 通过反序列化的方式创建对象。

package的作用

  • 提供多层命名空间,解决命名冲突。
  • 按功能进行分类,使项目结构更加的清楚。

Java中提供的两种多态机制

  • 编译是多态==>重载(同一个类中有多个具有相同名字,但这些方法具有不同的参数)
  • 运行时多态==>重写(子类继承父类的方法和名称,参数也相同)

注:a.子类不能重写父类中的final方法。
b.子类必须重写父类的abstract方法。

this和super的区别

  1. this是用来指向当前实例对象。
  2. super是用来访问父类的成员和变量。

java语言中的null值是什么?在内存中null是什么?
null不是一个合法的Object实例,所以在内存中并未对其分配空间,它仅仅用于表示该引用未指明对象。
null是将引用中变量的值全部置0。

"=="、equals和hashcode有什么区别?
1."=="
(1)基本数据类型
对应基本数据类型,其比较的是对应的值。
(2)引用类型(类、接口、数组)
此时的应用对象都是通过new出来的对象,比较的是他们的地址。(需要比较堆栈中对象的内容是否相同,重写对应的equals就可以。)。
2.equals
(1)在默认的情况下(没有覆盖equals方法)使用equals比较的是对象的地址。
(2)覆盖了equals方法,就需要根据具体的代码来确定equals方法的作用。(覆盖后一遍都是通过对象的内容来判断对象是否是是相等的)
3.hashCode
hashCode()方法返回的就是一个数值,从方法的名称上就可以看出,其目的是生成一个hash码。hash码的主要用途就是在对对象进行散列的时候作为key输入,据此很容易推断出,我们需要每个对象的hash码尽可能不同,这样才能保证散列的存取性能。事实上,Object类提供的默认实现确实保证每个对象的hash码不同(在对象的内存地址基础上经过特定算法返回一个hash码)。Java采用了哈希表的原理。哈希(Hash)实际上是个人名,由于他提出一哈希算法的概念,所以就以他的名字命名了。 哈希算法也称为散列算法,是将数据依特定算法直接指定到一个地址上。初学者可以这样理解,hashCode方法实际上返回的就是对象存储的物理地址(实际可能并不是)。

散列函数,散列算法,哈希函数。
是一种从任何一种数据中创建小的数字“指纹”的方法。
散列函数将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。
好的散列函数在输入域中很少出现散列冲突。

String、StringBuffer、StringBuilder的区别

  1. String是不可变类,一旦被创建其值将不能被改变。
  2. StringBuffer、StringBuilder是可被修改的字符串,都是字符缓冲区。
  3. StringBuffer是线程安全的。
  4. 执行效率:StringBuilder>StringBuffer>String。
  5. 使用场景:
名称使用场景
String数据量小的时候
StringBuilder单线程的时候
StringBuffer多线程的时候使用

StringTokennizer是用来分割字符串的工具。

Java的数组是否是对象?
Java中的数组时对象,因为每个数组都有对应的类型。

length属性和length()方法的区别?

  • length属性是数组用来获取大小的。
  • length()是用来计算字符串的长度。
  • size()方法是用来计算对象的大小的方法。

Java Collections框架(Collection是集合接口)
Java Collections框架中包含了大量的集合接口,以及这些接口实现类和他们的操作工具类(eg:排序、查找、反转、复制等)。具体而言,主要提供了List、Queue、Set、Stack、Map等。其中,List、Set、Queue、Stack都是继承接口Collection。

JVM加载Class文件的原理机制

  1. 装载:根据查找到对应的class文件导入。
  2. 链接:
    (1)检查:检查class文件的正确性。
    (2)准备:给类中的静态变量分配对应的存储空间。
    (3)解析:将符号引用转为直接引用。
  3. 初始化:对静态变量和静态代码进行初始化工作。

什么是GC?
GC是垃圾回收,主要的作用是回收程序中不再使用的内存。
常用的GC算法。

  1. 引用计算算法
  2. 压缩回收算法
  3. 复制回收算法

什么是迭代器?
迭代器是一个对象,它的工作是遍历选择列中的对象(其可以访问对象中的各个对象,但无需暴露其中的对象内部细节方法)。

ArrayList、Vector和LinkedList的区别?
三者均在java.util包中,均为可伸缩的数组(动态改变长度)。
ArrayList和Vector都是基于存储元素Object[] array类实现的。在内存中开辟一段连续的空间来存储。由于它们支持按照序号来访问,因此索引的速度比较快,插入和删除的速断慢。
ArrayList默认的扩充数据是原来的1.5倍。
Vector默认的扩充为原来的2倍。
ArrayList和Vector的最大的区别:Vector是线程安全的,而ArrayList是非线程安全。
LinkedList是采用双向列表来实现的。对数据的索引是从头开始,因此访问速度较低,插入和删除的效率高。
LinkedList是非线程安全的。

HashMap、HashTable、TreeMap、WeakHashMap的区别

  • HashMap是HashTable的轻量级实现。
  • HashMap可以存key为null的值,而HashTable不可以保存为null的值。
  • HashMap是非线程安全的。而HashTable是线程安全的。HashMap的效率高于HashTable。
  • HashMap的hash数组默认的大小为16,增加为2n。
  • HashTable的hash数组默认的大小为11,增加为2n+1。
  • 由于TreeMap实现了SortMap接口,HashMap的效率高于HashTable。
  • WeakHashMap与HashMap类似,二者不同之处在于WeakHashMap中key采用的是“若引用”的方式,只要key不再被引用,它就可以被GC。HashMap只用key被删除时,才可以被回收。

如何实现HashMap的同步?
Map m = Collections.synchronizedMap(new HashMap());

HashMap和ConcurrentHashMap的区别?

  • HashMap是非线程安全的,ConcurrentHashMap是线程安全的。
  • ConcurrentHashMap采用了锁分段的技术,将整个Hash桶进行分段segment,也就是将数组分割成多个片段segment。而且每个片段都segment都有锁的存在。再插入元素的时候,是先找到对应的段并获得对应的锁,再进行操作。
  • ConcurrentHashMap的锁粒度分段更加精细一些,并发性能也比较好。

HashTable和ConcurrentHashMap的区别?
二者都是多线程,当HashTable的大小增加到一定的程度的时候,其效率会急速下降(在迭代时被锁的时间太长)。ConcurrentHashMap采用了分段让效率提高了不少。

HashSet和TreeSet的区别?

  • TreeSet是基于二叉树实现,TreeSet中的数据是排好序的,不允许存放null值。
  • HashSet是哈希的表现,HashSet中的数据是无序的,可以存放null值,但是只能存放一个null。
  • HashSet要求放入对象需要实现HashCode()方法,放入的对象已hashCode码作为标识符。(具有相同内容的String,hashCode是一样的,所以放入的对象的内容是不能重复的)

应用场景:HashSet是基于Hash算法来实现的,所以在性能上是优于TreeSet的。我们通常使用HashSet,在需要排序的时候,才使用TreeSet。

数组的内存是如何分配的?
(1)简单的值类型数组,每个数据成员是一个引用。引用到栈上的空间。
(2)引用类型、类类型的数据,每个数组成员都是一个引用。引用到堆上的空间。

如何实现Java多线程?

  1. 继承Thread类,重写run()方法。
  2. 实现Runnable接口,并实现该接口的run()方法。
  3. 实现Collable接口,重写call()方法。

线程的实现方式选择:
1.尽可能的选择接口,java只支持单继承,使用接口的线程可以解决单继承的问题。
2.线程实现,不需要全部继承Thread,全部继承Thread会造成资源的上压力和浪费。

run()方法和start()方法的区别?

  • run()是用来完成线程的实际操作,当run()方法结束,此线程就结束了。

  • start()是用来启动一个线程类,此时线程处于就绪状态,并非运行状态。

    run()调用是同步的,而start()方法的调用是异步的。

sleep()、wait()、yield()、join()方法的区别?

  1. sleep()方法是让程序暂停执行一会儿,单并未释放锁。
  2. wait()也是暂停程序的执行,但是会释放对象锁。
  3. yield()方法是让线程回到可执行的状态。
  4. join()是让一个线程加入到另一个线程的尾部。
  5. sleep()、wait()的详细区别
区别sleepwait
原理不同暂停一段时间,时间到了自动唤醒直接睡眠,直到被再次唤醒
处理机制不释放对象锁释放对象锁
使用区域作用于任何地方必须放在同步代码中使用

终止线程用stop()、suspend()方法。

注:当A线程中调用了B线程,需要等B线程执行完成了后才能继续执行A线程。

多线程的好处?

  • 使用多线程可以减少程序的响应时间。
  • 与进程相比,线程创建和切换的开销更小。
  • 使用多线程能简化程序的结构,让其更加的便于理解。

session和cookie的区别?
session本质也是通过cookie来工作的。

区别cookiesession
数据存放存放在客户端存放在服务器端
安全不够安全相对安全
性能数据量大的时候,影响性能
大小单个cookie保存数据不可以超过4k

Jdbc的流程?

  1. 注册驱动
  2. 建立连接
  3. 创建sql语句
  4. 运行sql语句
  5. 处理运行结果
  6. 释放资源

synchronized与Lock的区别?

  1. synchronized是java的内置关键字,Lock是java类。
  2. synchronized无法判断是否取得锁的状态,Lock可以取得锁的状态。
  3. synchronized可以自动释放锁,而Lock需要手动释放锁。
  4. synchronized适用于少量同步问题,Lock适用于大量的同步问题。
  5. synchronized会发生阻塞。

代码同步选择:
1.尽可能的选择synchronized,因为jvm原生的支持synchronized,jvm在未释放锁的情况下会自动释放锁。
2.Lock的好处可以根据需求选择是否等待,操作起来更加的灵活。

堆和栈的区别
1.栈是用来存放变量的。而堆是用来存放对象的。
2.栈的更新速度比较快,而堆的更新速度比较慢。
(栈中的变量生命周期比较短,变量使用完成后即被回收。而堆是对象,当对象中的一个变量使用完后也不会回收,只有到对象不再被使用的时候,会被GC进行不定时的回收。)

装箱和拆箱

  • 装箱是自动将基本类型封装成包装类型(eg: Integer的valueOf(int))。
  • 拆箱是自动将包装类型拆成基本类型(eg: Integer的intValue())。

具体的拆箱和装箱详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值