Java面试题汇总(查漏补缺)

1、Java中Int与Integer的区别?

(1)int 是基本类型,直接存数值;而integer引用数据类型。
(2)int的声明不需要实例化,且变量声明后的初始值为0;Integer的是一个类,初始值为null,需要进行实例化,才能对变量数据进行处理。
(3)Integer类是int的包装类,实际开发中Integer被看成一个对象,可以进行数据转换等操作。

2、heap(堆)和stack(栈)有什么区别?

①stack的空间由操作系统自动分配和释放,heap的空间是手动申请和释放的。heap用new来申请分配空间。
②stack空间有限,heap的空间是很大的自由区,在java中,若只声明一个对象,则在栈内存栈为其分配地址空间,若使用new来实例化,则在堆中为其分配地址。

3、启动一个线程是用run()还是start()?

启动一个线程是调用start()方法,线程就进入就绪状态,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。

run()方法是该线程所关联的执行代码,可以产生必须退出的标志来停止一个线程。

4、进程与线程的区别总结

根本区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位
资源开销:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。
包含关系:如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。
内存分配:同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的
影响关系:一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。
执行过程:每个独立的进程有程序运行的入口、顺序执行序列和程序出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,两者均可并发执行。

5、序列化

序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。
一、序列化和反序列化的概念
把对象转换为字节序列的过程称为对象的序列化。
把字节序列恢复为对象的过程称为对象的反序列化。

二、对象的序列化主要有两种用途:
1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
2) 在网络上传送对象的字节序列。

在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存。比如最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些seesion先序列化到硬盘中,等要用了,再把保存在硬盘中的对象还原到内存中。

当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。

需要被序列化的类必须实现Serializable接口,该接口是一个mini接口,其中没有需要实现方法,implements Serializable只是为了标注该对象是可被序列化的。

例如,在web开发中,如果对象被保存在了Session中,tomcat在重启时要把Session对象序列化到硬盘,这个对象就必须实现Serializable接口。如果对象要经过分布式系统进行网络传输,被传输的对象就必须实现Serializable接口。

6、什么是死锁?如何避免

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

死锁产生的四个必要条件:互斥、占有且等待、不可抢占、循环等待。

如何避免:
一、死锁预防——破坏”占有且等待“条件、”不可抢占“条件、”循环等待“条件。
二、避免死锁——银行家算法。
三、死锁的检测与解除。

7、设计一个一百亿的计算器

①要考虑计算机的底层原理,知道加减法的位运算原理,了解算术运算会发生越界的情况,两个数值的运算不能超过计算机中该类型的数值范围。
②要具备一定的面向对象的设计思想。

不考虑long类型,int的正数范围是2的31次方,表示的值约等于210001000*1000,也就是20亿大小,实现100亿的计算机需要自己设计一个类可以表示很大的整数,并且提供与另外一个整数加减乘除的功能。
大概功能如下:
1、这个类内部有两个成员变量,一个表示符号,一个用字节数组表示数值的二进制数。
2、有一个构造方法,把一个包含有多位数值的字符串转换到内部的符号和字节数组中。
3、提供加减乘除功能。

8、写clone()方法时,通常都有一行代码,是什么?

clone有缺省行为,super.clone();首先要把父类的成员复制到位,才能复制字节的成员。

9、Java中实现多态的机制是什么?

依靠的实父类或者接口定义的引用变量可以指向子类或者具体实现类的实例对象,而程序调用的方法就是引用所指向的具体事例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。

10、什么是内部类?

内部类就是在一个类的内部定义的类,内部类中不能定义静态成员变量,内部类可以直接访问外部类中的成员变量,内部类的方法可以定义在外部类的方法外面,也可以在外部类方法体中(创建内部类的实例对象时,外面必须先创建外部类的实例对象,然后用这个外部类的实例对象去创建内部类的实例对象)。

11、简述synchronized和java.util.concurrent.locks.Lock的异同?

相同点:Lock能完成synchronized所实现的所有功能。
不同点:Lock有比synchronized更精确的线程语义和更好的性能,synchronized会自动释放锁,而Lock要求程序员手工从finally语句中释放。

12、List和Map的区别

①List是存储单列数据的集合;Map是存储键值对这样双列数据的集合。
②List中存储的数据是没有顺序的,并且允许重复;Map中存储的数据是没有顺序的,其键是不能重复的,值可以重复。

13、List、Map、Set三个接口存取元素时,各有什么特点?

List一特定的次序来持有元素,可重复。
Set无法拥有重复元素,内部排序。
Map保存key-value值,value可重复。

14、简述你所了解的设计模式

工厂模式:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

抽象工厂模式:提供一个创建一系列相关或互相依赖对象的接口。无需指定他们具体的类。

单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

建造者模式:将一个复杂的构建与其相分离,使得同样的构建过程可以创建不同的表示。

原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值