Java面试题库——Java基础

1.面向对象的特征有哪些方面?

- 抽象:是将一类对象的共同特征总结出来构造类的过程。
- 封装:是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。封装就是隐藏一切可以隐藏的东西,只对外提供最简单的接口。
- 继承:是从已有类得到继承信息创建新类的过程。
- 多态:一种事物的多种表现形态就是多态。允许不同子类型对同一消息作出不同的响应。用同样的对象调用同样的方法做了不同的事。

2.Java的基本数据类型有哪些?

Java有8个基本数据类型:
整型:byte、int、short、long
字符型:char
浮点型:float、double
布尔型:boolean

3.Java的访问修饰符有哪些?

public:公开,所有类都可以访问
protected:受保护的,同一个包或者有父子关系的类可以访问
default:默认的,同一个包中的其它类可以访问
private:私有的,只有当前类可以访问

4.JDK和JRE有什么区别?

jdk:是面向开发人员的,是开发工具包,包括开发人员需要用到的一些类。
jre:是java运行时环境,包括java虚拟机等,是提供给使用Java的人用的

5.==和equals的区别是什么?

== :是一个运算符,可以判断基本类型也可以判断引用类型。判断基本类型时,就是判断两者的值是否相等;判断引用类型时,就是判断两者的地址是否相等,也就是说判断实际对象是不是同一个。
equals :是 Object 中的方法,只能判断引用类型,也是通过判断两者地址是否相等。一般情况下,子类会重写这个 equals 方法,以添加判断内容是否相等的功能。

6.两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?

不对,hashCode 只是Java 用来标识对象的,不等同于地址,hashCode也是可以重写的,所以不一定。
但如果equals()相同,那么hashCode是一定相等的。

7.final 在 java 中有什么作用?

修饰类不可被继承
修饰方法不能被重写
修饰变量不能被修改

8.Java 中的 Math.round(-1.5) 等于多少?

结果为:-1
向上取整Math.ceil();
向下取整Math.floor();
四舍五入Math.round(x);算法为 Math.floor(x+0.5),即将原来的数字加上 0.5 后再向下取整

9.String 属于基本数据类型吗?

不属于,String 是final修饰的Java类,是属于引用数据类型

10.java 中操作字符串都有哪些类?它们之间有什么区别?

String、StringBuffer、StringBuilder
String是只读字符串,引用的字符串中的内容是不可更改的。
StringBuilder是Java5引入的,StringBuffer和StringBuilder的方法完全相同,都可以对同一个对象做更新,区别是StringBuilder是在单线程环境下使用,是线程不安全的,而StringBuffer是线程安全的。

11.内存中栈(stack)、堆(heap)和静态区的用法

栈:是由系统自动分配的,通常定义一个基本数据类型的变量,一个对象的引用,还有函数调用的现场保存都使用内存中的栈空间。
堆:是人为申请开辟的,通过new关键字和构造器创建的对象放在堆空间中。
静态区:程序中的字面量和常量存放在静态区中。

String str = new String("hello");
上面的语句中变量 str 放在栈上,用 new 创建出来的字符串对象放在堆上,而"hello"这个字面量放在静态区

12.String str="i"与 String str=new String(“i”)一样吗?

不一样,它们不是同一个对象
前者如果定义多个变量都为相同值的话,会公用同一个地址,创建的对象应该放在了常量池中;
后者是创建了一个新的对象,放在堆内存中。

13.请写出以下代码的运行结果

public class Test {
	public static void main(String[] args) {
		Integer num1 = 100,num3 = 150;
		Integer num2 = 100;num4 = 150;
 
		System.out.println(num1 == num2);
        System.out.println(num3 == num4);
	}
}
运行结果:
    true false

解释:在Java中,Integer类会对在-128到127范围内的整数值进行缓存。Java的Integer缓存机制仅适用于通过自动装箱或使用Integer.valueOf(int)方法创建的Integer对象。在这种情况下,Java会返回缓存的对象实例。
所以说,如果我们使用在 -128 到 127 范围内的值创建 Integer 对象时,这时引用变量指向的都是同一个对象,所以我们使用 == 会返回 true。

14.如何将字符串反转?

使用StringBuffer 或 StringBuilder 的 reverse 成员方法。

15.String 类的常用方法都有那些?

equals():判断是否相等
contains():是否包含某字符
indexOf():某字符第一次出现的索引
charAt():返回在指定索引处的字符
replace():将字符串中的某字符都替换成指定字符
subString():截取子字符串
length():获取字符串长度
split():根据给定正则表达式的匹配拆分此字符串
concat():将指定字符串连接到此字符串的结尾
isEmpty():是否为空
valueOf():返回给定类型参数的字符串表示形式

16.抽象类必须要有抽象方法吗?

不是。抽象类可以没有抽象方法,但是如果你的一个类已经声明成了抽象类,即使这个类中没有抽象方法,它也不能再实例化,即不能直接构造一个该类的对象。如果一个类中有了一个抽象方法,那么这个类必须声明为抽象类,否则编译通不过。

17.抽象类能使用 final 修饰吗?

不能。

18.接口和抽象类有什么异同?

同:都不能被实例化,即不能直接构造一个该类的对象,但可以定义抽象类和接口类型的引用。方法都不包含主体,一个类如果继承了某个抽象类或者实现了某个接口都要对其中的抽象方法全部进行实现。

异:接口用interface修饰,抽象类使用abstract修饰。一个类只能继承一个抽象类,但是可以实现多个接口。接口比抽象类更抽象,不能定义构造器且全是抽象方法,成员全是public,定义的成员变量实际都是常量。

19.重载和重写的区别

重载:发生在同一个类中。重载要求必须有不同的参数列表;可以有不同的访问修饰符;也可以抛出不同的异常;对返回类型没有特殊要求。

重写:发生在父类和子类之间。重写要求参数列表必须与被重写的相同;返回的类型必须保持一致;修饰符和抛出的异常不能在被重写的方法之外。

20.java 中 IO 流分为几种?

字节流:InputStream、OutputStream
字符流:Reader、Writer

字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串;
字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以。

21.BIO、NIO、AIO 有什么区别?

BIO:Block IO 同步阻塞式 IO;BIO是一个连接一个线程。JDK4之前的唯一选择
NIO:Non IO 同步非阻塞 IO;NIO是一个请求一个线程。JDK4之后开始支持,常见聊天服务器
AIO:Asynchronous IO  异步非阻塞IO;AIO是一个有效请求一个线程。JDK7之后开始支持,常见相册服务器

22.静态变量和实例变量的区别

静态变量属于类,不管一个类创建多少个对象,静态变量在一个区中有且仅有一个拷贝;可以实现多个对象共享内存。
实例变量必须依存于某一实例,要先创建对象然后才能通过对象访问它。

23.JDK8新特性

接口默认方法:Java8允许接口中添加非抽象的方法的实现,只需要default关键字进行修饰。
Lambda表达式:是一种匿名内部类的简洁表达方式,可以将功能视为方法的参数进行传递。
函数式接口:是一种只有一个抽象方法的接口,通常与Lambda表达式一起用。
Stream API:新增的一个用于处理集合的强大工具。
Optional类:可以为null的容器对象,避免空指针异常。
日期时间API的改进;并发增强;可重复注解;类型推断的改进以及安全性等方面的增强。

24.JVM加载class文件的原理机制

JVM中类的装载是由类加载器和它的子类来实现的,类加载器包括:根加载器(BootStrap)、扩展加载器(Extension)、系统加载器(System)和用户自定义类加载器(java.lang.ClassLoader 的子类)。
JVM把描述类数据的字节码.Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型,这就是虚拟机的类加载机制。

25.int 和 Integer 有什么区别?

答:Java 是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java 为每一个基本数据类型都引入了对应的包装类型(wrapper class),int 的包装类就是 Integer,从 Java 5 开始引入了自动装箱/拆箱机制,使得二者可以相互转换。
Java 为每个原始类型提供了包装类型:
- 原始类型: boolean,char,byte,short,int,long,float,double
- 包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double

26.&和&&的区别?

&运算符有两种用法:(1)按位与;(2)逻辑与。&&运算符是短路与运算。逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是 true 整个表达式的值才是 true。&&之所以称为短路运算是因为,如果&&左边的表达式的值是 false,右边的表达式会被直接短路掉,不会进行运算。很多时候我们可能都需要用&&而不是&,例如在验证用户登录时判定用户名不是 null 而且不是空字符串,应当写为:username != null &&!username.equals(""),二者的顺序不能交换,更不能用&运算符,因为第一个条件如果不成立,根本不能进行字符串的 equals 比较,否则会产生 NullPointerException 异常。注意:逻辑或运算符(|)和短路或运算符(||)的差别也是如此。

27.用最有效率的方法计算 2 乘以 8

2 << 3(左移 3 位相当于乘以 2 的 3 次方,右移 3 位相当于除以 2 的 3 次方)。

28.数组有没有 length()方法?String 有没有 length()方法?

数组没有 length()方法,有 length 的属性。String 有 length()方法。JavaScript 中,获得字符串的长度是通过 length 属性得到的,这一点容易和 Java 混淆。

29.构造器(constructor)是否可被重写(override)?

构造器不能被继承,因此不能被重写,但可以被重载。

30.两个对象值相同(x.equals(y) == true),但却可有不同的 hash code,这句话对不对?

不对,如果两个对象 x 和 y 满足 x.equals(y) == true,它们的哈希码(hash code)应当相同。Java 对于 eqauls 方法和 hashCode 方法是这样规定的:(1)如果两个对象相同(equals方法返回 true),那么它们的 hashCode 值一定要相同;(2)如果两个对象的 hashCode 相同,它们并不一定相同。

31.Java 中会存在内存泄漏吗,请简单描述。

理论上 Java 因为有垃圾回收机制(GC)不会存在内存泄露问题(这也是 Java 被广泛使用于服务器端编程的一个重要原因);然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被 GC 回收,因此也会导致内存泄露的发生。例如 Hibernate 的 Session(一级缓存)中的对象属于持久态,垃圾回收器是不会回收这些对象的,然而这些对象中可能存在无用的垃圾对象,如果不及时关闭(close)或清空(flush)一级缓存就可能导致内存泄露。

32.如何实现对象克隆?

有两种方式:
(1). 实现 Cloneable 接口并重写 Object 类中的 clone()方法;
(2). 实现 Serializable 接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆

33.什么时候用断言(assert)?

断言在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。一般来
说,断言用于保证程序最基本、关键的正确性。断言检查通常在开发和测试时开启。为了
保证程序的执行效率,在软件发布后断言检查通常是关闭的。断言是一个包含布尔表达式
的语句,在执行这个语句时假定该表达式为true;如果表达式的值为false,那么系统会报告
一个AssertionError。

34.Error和Exception有什么区别?

Error表示系统级的错误和程序不必处理的异常,是恢复不是不可能但很困难的情况下的一种严重问题;比如内存溢出,不可能指望程序能处理这样的情况;
Exception表示需要捕捉或者需要程序进行处理的异常,是一种设计或实现问题;也就是说,它表示如果程序运行正常,从不会发生的情况。

35.列出一些你常见的运行时异常

- ArithmeticException(算术异常)
- ClassCastException (类转换异常)
- IllegalArgumentException (非法参数异常)
- IndexOutOfBoundsException (下标越界异常)
- NullPointerException (空指针异常)
- SecurityException (安全异常)

36.Java语言如何进行异常处理,

一般情况下是用try来执行一段程序,如果系统会抛出(throw)一个异常对象,可以通过它的类型来捕获(catch)它,或通过总是执行代码块(finally)来处理;try用来指定一块预防所有异常的程序;catch子句紧跟在try块后面,用来指定你想要捕获的异常的类型;throw语句用来明确地抛出一个异常;throws用来声明一个方法可能抛出的各种异常(当然声明异常时允许无病呻吟);finally为确保一段代码不管发生什么异常状况都要被执行。

37.阐述final、finally、finalize的区别。

- final:修饰符(关键字)有三种用法:如果一个类被声明为final,意味着它不能再派生出新的子类,即不能被继承,因此它和abstract是反义词。将变量声明为final,可以保证它们在使用中不被改变,被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取不可修改。被声明为final的方法也同样只能使用,不能在子类中被重写。
- finally:通常放在try…catch…的后面构造总是执行代码块,这就意味着程序无论正常执行还是发生异常,这里的代码只要JVM不关闭都能执行,可以将释放外部资源的代码写在finally块中。
- finalize:Object类中定义的方法,Java中允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在销毁对象时调用的,通过重写finalize()方法可以整理系统资源或者执行其他清理工作。

38.如何将 GB2312 编码的字符串转换为 ISO-8859-1 编码的字符串呢?

String str1 = new String(str.getBytes("GB2312"),"ISO-8859-1");

39.说说 Java 中多态的实现原理是什么?

Java多态机制包括静态多态 ( 编译时多态 )和动态多态 ( 运行时多态 ),静态多态比如说重载, 动态多态比如说重写,一般指在运行时才能确定调用哪个方法。通常说的多态是指动态多态。
多态的实现原理主要依赖于以下两个核心概念
继承:子类可以继承父类的属性和方法。当一个类继承另一个类时,子类将拥有父类的所有公共属性和方法,包括方法的签名(方法名称、参数列表和返回类型)。这使得子类可以覆盖(重写)父类的方法,并给出自己的实现。
方法重写:子类可以在继承的基础上对父类的方法进行重写。方法重写是指子类提供了与父类方法签名相同的方法,并且可以在子类中重新实现该方法。重写的方法可以提供新的实现,覆盖父类中的方法。在运行时,通过基类或接口类型引用子类对象时,将根据实际对象的类型来调用方法,而不是根据引用类型

40.Java中是值传递还是引用传递?

Java中的参数传递是值传递的,无论是基本数据类型还是对象类型,实际参数的值都会被复制一份传递给方法中的形式参数。对于基本数据类型,传递的是值本身;对于对象类型,传递的是对象的引用(地址)。这种值传递的方式使得方法中对参数的修改不会影响到原始值(对于基本数据类型)或原始对象的引用(对于对象类型)。

41.break 和 continue 有什么区别?

break:可以使流程跳出 switch 语句体,也可以在循环结构终止本层循环体,从而提前结束本层循环。
continue:的作用是跳过本次循环体中余下尚未执行的语句,立即进行下一次的循环条件判定,可以理解为仅结束本次循环。

42.switch支持的数据类型有哪些?

byte、short、char 、int、String(String 需要Java 7 及更高版本)

43.Comparator和Comparable有什么不同?

Comparable接口是在对象自身类中实现的,用于定义对象的自然排序规则,适用于对象自身的比较。Comparator接口是独立的比较器,用于定义不同的比较规则,适用于对不同对象的比较和排序。使用Comparable接口可以使对象具备自然排序的能力,而使用Comparator接口可以根据不同的比较规则灵活地进行对象排序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值