Java之面试题(一)

Java之面试题(一)

Q1 : 数据类型都有哪些?分别的取值范围

整型:

byte:-2^7 ~ 2^7-1,即-128 ~ 127。1字节。Byte。末尾加B

short:-2^15 ~ 2^15-1,即-32768 ~ 32767。2字节。Short。末尾加S

int: 有符号int :-2^31 ~ 2^31-1,即-2147483648 ~ 2147483647。4字节。Integer。

​ 无符号int :0~2^32-1。

long:-2^63 ~ 2^63-1,即-9223372036854774808 ~ 9223372036854774807。8字节。Long。末尾加L。(也可以不加L)

浮点型:

float :4字节。Float。末尾加F。(也可以不加F)

double :8字节。Double。

字符型:

char :2字节。Character。

布尔型:

boolean :Boolean。

Q2 : 说一下Jdk和Jre的区别?

JRE: Java Runtime Environment(java运行环境)
JDK:Java Development Kit (java开发工具)

 JDK:它是Java开发运行环境,在程序员的电脑上当然要安装JDK;
 JRE:Java Runtime Environment它是Java运行环境,如果你不需要开发只需要运行Java程序,那么你可以安装JRE。
 JDK包含了JRE。
 JRE中包含虚拟机JVM

Q3 : 比较&和&&

& 不管前面的条件是否正确,后面都执行
&& 前面条件正确时,才执行后面,不正确时,就不执行,就效率而言,这个更好

Q4 :什么是类,什么是对象,类与对象的关系

类的概念: 类是具有相同属性和服务的一组对象的集合。为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和服务两个主要部分。在面向对象的编程语言中,类是一个独立的程序单位,应该有一个类名并包括属性说明和服务说明两个主要部分。

对象的概念:对象是系统中用来描述客观事物的一个实体,是构成系统的一个基本单位。一个对象由一组属性和对这组属性进行操作的一组服务组成。从更抽象的角度来说,对象是问题域或实现域中某些事物的一个抽象,它反映该事物在系统中需要保存的信息和发挥的作用;它是一组属性和有权对这些属性进行操作的一组服务的封装体。客观世界是由对象和对象之间的联系组成的。

类与对象的关系就如模具和铸件的关系,类的实例化结果就是对象,而对一类对象的抽象就是类。类描述了一组有相同特性( 属性 ) 和相同行为 ( 方法 ) 的对象。

生活中,类就像图纸,对象就是图纸实例化出来的物品。

Q5 : 什么是构造方法,什么是方法重载

  1. 构造方法的名字必须与定义他的类名完全相同,没有返回类型,甚至连void也没有。

  2. 构造方法的调用是在创建一个对象时使用new操作进行的。

  3. 构造方法的作用是初始化对象。不能被static、final、synchronized、abstract和native修饰。构造方法不能被子类继承。

  4. 当新对象被创建的时候,构造方法会被调用。每一个类都有构造方法。在程序员没有给类提供构造方法的情况下,Java编译器会为这个类创建一个默认的构造方

  5. Java中构造方法重载和方法重载很相似。可以为一个类创建多个构造方法。每一个构造方法必须有它自己唯一的参数列表。

Q6 : 多线程中发生死锁的原因和解决方法

产生死锁的原因(1)竞争系统资源 (2)进程的推进顺序不当

产生死锁的必要条件

  • 1、互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用
  • 2、不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。
  • 3、请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的占有。
  • 4、循环等待,即存在一个等待队列:P1占有P2的资源,P2占有P3的资源,P3占有P1的资源。这样就形成了一个等待环路。

当上述四个条件都成立的时候,便形成死锁。当然,死锁的情况下如果打破上述任何一个条件,便可让死锁消失。下面用java代码来模拟一下死锁的产生。

解决死锁

  1. 加锁顺序(线程按照一定的顺序加锁)
  2. 加锁时限(线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁)
  3. 死锁检测

Q7 :简述一下封装

Java语言的三大特性:

继承、封装、多态

什么是封装

封装就是对类的属性不可见,将类的信息隐藏在类的内部,不允许外部程序直接访问,

但是对外提供了访问的接口或者方法.

Q8 : 简述static关键字

一旦用了static关键字,那么这样的内容不再属于对象自己。而是属于类的,所以凡是本类的对象,都共享同一份。

如果没有static关键字,那么必须首先创建对象,然后通过对象才能使用它。

1.静态方法不能直接访问非静态变量。

  • 原因:因为在内存当中是【先】有静态内容,【后】有的非静态内容。

2.静态方法当中不能使用this。

  • 原因:this代表当前对象,通过谁调用的方法,谁就是当前对象。

**特点:**当第一次用到本类时,静态代码块执行唯一一次。
静态内容总是优先于非静态,所以静态代码比构造方法先执行。

静态代码的典型用途:
用来一次性地对静态成员变量进行赋值。

Q9 :抽象类和接口的区别

抽象类要被子类继承,接口要被类实现。

接口只能做方法声明,抽象类中可以作方法声明,也可以做方法实现。

接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。

接口是设计的结果,抽象类是重构的结果。

抽象类和接口都是用来抽象具体对象的,但是接口的抽象级别最高。

抽象类可以有具体的方法和属性,接口只能有抽象方法和不可变常量。

抽象类主要用来抽象类别,接口主要用来抽象功能。

Q10 : 方法重载和重写的区别

Overload是重bai载的意思,表示在同一个类中,允许存在du一个以上的同名函数,zhi只要他们的参数个数或者dao参数类型不同即可,Override是覆盖的意思,也就是重写,它与返回值类型无关,只看参数列表,两者不同主要体现在:目的不同、范围不同、参数不同、多态性不同、返回类型不同。

1、目的不同

overload用于增加程序的可读性(做法不同,但是做的同一事情)。 override用于提供其超级类已经提供的方法的特定实现。

2、范围不同

overload 在相同的类范围内内执行。 override发生在两类具有继承(继承)的关系。

3、参数不同

overload参数必须不同。 override参数必须相同。

4、多态性不同

overload 静态多态,调用的函数在编译时被选中。 override 是运行时多态性的。

5、返回类型不同

overload中可以相同或不同。但你必须改变参数。 override必须是相同的或协变的。

Q11 :多态的表现形式有哪些

多态可以用“三个定义和两个方法”来总结。三个定义分别是父类定义子类构建、接口定义实现类构建和抽象类定义实体类构建,而两个方法分别是方法重载和方法重写。 

Q12 : Java中异常处理的机制

​ 1.try:它里面放置可能引发异常的代码

​ 2.catch:后面对应异常类型和一个代码块,用于表明该catch块用于处理这种类型的代码块,可以有多个catch块。

​ 3.finally:主要用于回收在try块里打开的物力资源(如数据库连接、网络连接和磁盘文件),异常机制总是保证finally块总是被执行。只有finally块,执行完成之后,才会回来执行try或者catch块中的return或者throw语句,如果finally中使用了return或者 throw等终止方法的语句,则就不会跳回执行,直接停止。

​ 4.throw:用于抛出一个实际的异常,可以单独作为语句使用,抛出一个具体的异常对象。

​ 5.throws:用在方法签名中,用于声明该方法可能抛出的异常。

Q13 :==和equls的区别

==:如果比较的对象是基本数据类型,则比较的是数值是否一致;如果比较的是引用数据类型,则比较的是对象的地址值是否一致。

equals():equals()方法不能用于比较基本数据类型的对象,如果对象和自身进行比较,则equals()方法与==是一样的。对于String类 Date类 File类等 可重写equals() 方法用于比较对象的属性内容是否一致

Q14 : 什么是泛型,以及泛型的作用

泛型简单易用,类型安全 泛型的主要目标是实现java的类型安全。 泛型可以使编译器知道一个对象的限定类型是什么,这样编译器就可以在一个高的程度上验证这个类型

消除了强制类型转换 使得代码可读性好,减少了很多出错的机会

Q15 :ArrayList和LinkedList的区别

1.ArrayList是基于索引的数据接口,它的底层是数组。它可以以O(1)时间复杂度对元素进行随机访问。与此对应,LinkedList是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是O(n)。

2.相对于ArrayList,LinkedList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。

3.LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。

Q16 : List和Map的区别

在数据结构方面,List存储的是单列数据的集合,而Map存储的是key、value类型的数据集合。在数据存储方面,List存储的数据是有序且可以重复的,而Map中存储的数据是无序且key值不能重复(value值可以重复)。

Q17 : String、StringBuffer与StringBuilder之间区别

首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String

String:适用于少量的字符串操作的情况

StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况

StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况

StringBuffer是线程安全,可以不需要额外的同步用于多线程中;

StringBuilder是非同步,运行于多线程中就需要使用着单独同步处理,但是速度就比StringBuffer快多了;

StringBuffer与StringBuilder两者共同之处:可以通过append、indert进行字符串的操作。

String实现了三个接口:Serializable、Comparable、CarSequence

StringBuilder只实现了两个接口Serializable、CharSequence,相比之下String的实例可以通过compareTo方法进行比较,其他两个不可以。

Q18 : 同步代码块和同步函数的区别

为何要使用同步?

java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),
将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他线程的调用,
从而保证了该变量的唯一性和准确性。

同步方法和同步代码块的区别是什么?

  • 同步方法默认用this或者当前类class对象作为锁;
  • 同步代码块可以选择以什么来加锁,比同步方法要更细颗粒度,我们可以选择只同步会发生同步问题的部分代码而不是整个方法;
  • 同步方法使用关键字 synchronized修饰方法,而同步代码块主要是修饰需要进行同步的代码,用 synchronized(object){代码内容}进行修饰。

Q19 : 简述线程的五种状态

\1. 新建(NEW):新创建了一个线程对象。

\2. 可运行(RUNNABLE):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权 。

\3. 运行(RUNNING):可运行状态(runnable)的线程获得了cpu 时间片(timeslice) ,执行程序代码。
\4. 阻塞(BLOCKED):阻塞状态是指线程因为某种原因放弃了cpu 使用权,也即让出了cpu timeslice,暂时停止运行。直到线程进入可运行(runnable)状态,才有机会再次获得cpu timeslice 转到运行(running)状态。阻塞的情况分三种:

(一). 等待阻塞:运行(running)的线程执行o.wait()方法,JVM会把该线程放入等待队列(waitting queue)中。
(二). 同步阻塞:运行(running)的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池(lock pool)中。
(三). 其他阻塞:运行(running)的线程执行Thread.sleep(long ms)或t.join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入可运行(runnable)状态。

\5. 死亡(DEAD):线程run()、main() 方法执行结束,或者因异常退出了run()方法,则该线程结束生命周期。死亡的线程不可再次复生。

Q20 : Thread类的 wait()和sleep()的区别?

  1. wait()来自Object类,sleep()来自Thread类
  2. 调用 sleep()方法,线程不会释放对象锁。而调用 wait() 方法线程会释放对象锁;
  3. sleep()睡眠后不出让系统资源,wait()让其他线程可以占用 CPU;
  4. sleep(millionseconds)需要指定一个睡眠时间,时间一到会自然唤醒。而wait()需要配合notify()或者notifyAll()使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值