Java常见面试题(一)

目录

1、什么是JDK?什么是JRE?什么是JVM?它们之间有什么联系?

2、最小的信息单元、最小的存储单元是什么?它们之间有什么联系?

3、基本数据类型有哪些?引用数据类型有哪些?它们的区别是什么?

4、基本数据类型数据表示范围?

5、&与&&的区别?|与||的区别?

6、for、while、do...while的区别?

7、堆(heap)内存和栈(stack)内存的区别?

8、什么是方法重载和方法重写?

9、scanner.hasNext()、scanner.nextLine()、scanner.next()有什么区别?

10、instanceof关键字的作用?

11、成员变量和局部变量有什么区别?

12、面向对象的特征有哪些?

13、String、StringBuilder、StringBuffer有什么区别?

14、访问权限修饰符 public、private、protected、以及默认时的区别?

15、状态修饰符final、static各有什么作用?

16、包装类有哪些?为什么会有包装类?

17、int 和 String的相互转换有哪些?

18、Java中的异常体系?

19、Java中的 Error和 Exception的区别?

20、Java自定义异常中 Throw和 Throws的区别?


1、什么是JDK?什么是JRE?什么是JVM?它们之间有什么联系?

  • JDK:java development kit:java开发工具包,是开发人员所需要安装的环境
  • JRE:java runtime environment:java运行环境,java程序运行所需要安装的环境
  • JVM:Java 虚拟机 (JVM)是运行 Java 字节码的虚拟机。JVM 有针对不同系统的特定实现 (Windows, Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。字节码和不同系统的 JVM 实现是 Java 语言 “一次编译,随处可以运行” 的关键所在

2、最小的信息单元、最小的存储单元是什么?它们之间有什么联系?

  • 最小信息单元:位(bit),又称“比特位"(用b表示)
  • 最小存储单元:字节(byte),由连续的8位组成(用B表示)
  • 关系:1B (字节)=8bit

3、基本数据类型有哪些?引用数据类型有哪些?它们的区别是什么?

  • 基本数据类型:整数(byte、short、int、long)、浮点数(float、double)、字符(char)、布尔(boolean)
  • 引用数据类型:类(class)、接口(interface)、数组([])、字符串(string)

注意:Java 里使用 long 类型的数据一定要在数值后面加上 L,否则将作为整型解析

4、基本数据类型数据表示范围?

byte、short、char类型参与运算时自动转为 int 类型

5、&与&&的区别?|与||的区别?

6、for、while、do...while的区别?

7、堆(heap)内存和栈(stack)内存的区别?

区别:

  • 栈是LIFO(后进先出)的数据结构
  • 每个申请的堆内存是一块连续内存,堆内存之间是不连续的
  • 栈内存大小可以针对单个进程设置上限。通过设置ulimit中的Max stack size来限制单个进程的最大栈内存(默认值为8M),也可以在程序main方法最开始的地方调用系统方法setrlimit来修改最大栈内存,子进程的最大栈内存继承自父进程。查看指定进程的最大栈内存 cat /proc/进程id/limits
  • 堆内存没有上限,只有OOM
  • 栈内存是由高地址向低地址向下增长,局部变量存储在栈内存上。当需要新的局部变量时,栈顶向下移动,将变量内存分配在栈顶;当函数执行完成返回,函数中的局部变量不再有用,栈顶向上移动销毁变量。下一个函数的局部变量的内存分配与消耗继续如此。栈顶移动时,不会清空内存中的数据,所以局部变量需要初始化。当初始分配的栈空间大小不足时,系统会自动扩容。
  • 堆内存是由低地址向高地址增长。与栈内存的数据结构不同,堆内存是零散的内存块,它的分配与释放需要开发者手动管理。当我们申请了一块堆内存且不释放,它在我们进程的整个生命周期内都是可用的,这与栈内存中的局部变量随着函数的返回而销毁不同。这样也容易出现访问已释放的堆内存和堆内存忘记释放,即悬空指针(指针指向的内存已释放,指针本身没有置空)和内存泄漏。野指针(指针变量未初始化,指针中的地址是随机的;指针指向了不可访问的地址:如已释放的栈内存地址或者越界或者指针运算跑飞了)
  • 栈内存是基于线程的,每个线程拥有自己的栈内存
  • 堆内存是进程内共享的,每个线程都可以访问
  • 栈内存是一次性分配足够大的空间(不足时会扩容),存储变量时不需要进行内存分配
  • 堆内存每次分配都需要向操作系统申请(或者你申请足够大的内存,自己手动做内存管理)
  • 栈内存是连续的,满足局部性原理,cpu缓存命中高
  • 堆内存是分散的,cpu缓存命中没有栈内存高

8、什么是方法重载和方法重写?

方法重载: 在一个类中,同名的方法如果有不同的参数列表( 参数类型不同、参数个数不同甚至是参数顺序不同 则视为重载。
  1. 重载 Overload 是一个类中多态性的一种表现
  2. 重载要求同名方法的参数列表不同 (参数类型,参数个数甚至是参数顺序)
  3. 重载的时候,返回值类型可以相同也可以不相同,无法以返回型别作为重载函数的区分标准

方法重写:在子类中把父类本身有的方法重新写一遍。

  1. 发生在父类与子类之间
  2. 方法名,参数列表,返回类型(除过子类中方法的返回类型是父类中返回类型的子类)必须相同
  3. 访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)
  4. 重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常

9、scanner.hasNext()、scanner.nextLine()、scanner.next()有什么区别?

  • hasNext():Scanner类的一个方法,判断是否有输入,有输入项 hasNext()为true;没有输入项 hasNext()为false
  • nextLine():结束符只是Enter键,即nextLine()方法返回的是Enter键之前的所有字符,它是可以得到带空格的字符串的
  • next()一定要读取到有效字符后才可以结束输入,对输入有效字符之前遇到的空格键、Tab、或Enter键等结束符,next()方法会自动将其去掉,只有在输入有效字符之后,next()方法后才将其后的输入的空格键、Tab或Enter键等视为分隔符或结束符。next方法不能得到带空格的字符串

10、instanceof关键字的作用?

instanceof 严格来说是Java中的一个双目运算符,用来测试一个对象是否为一个类的实例,用法为:

boolean result = obj instanceof Class

其中 obj 为一个对象,Class 表示一个类或者一个接口,当 obj Class 的对象,或者是其直接或间接子类,或者是其接口的实现类,结果 result 都返回 true,否则返回 false

int i=0;

System.out.println(i instanceof Integer);//编译不通过i必须是引用类型,不能是基本类型

System.out.println(i instanceof Object);//编译不通过 Integer integer=new Integer(1);

System.out.println(integer instanceof Integer);//true

//false,在JavaSE规范中对instanceof运算符的规定就是:如果obj为null,那么将返回false
System.out.println(null instanceof Object);

11、成员变量和局部变量有什么区别?

12、面向对象的特征有哪些?

  • 抽象:将一类对象的共同特征总结出来构造类的过程, 包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,不关注行为的细节
  • 继承:从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类) ;得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段
  • 封装:把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口
  • 多态性:允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。多态性分为编译时的多态性和运行时的多态性。如果将对象的方法视为对象向外界提供的服务,那么运行时的多态性可以解释为:当 A 系统访问 B 系统提供的服务时,B 系统有多种提供服务的方式,但一切对 A 系统来说都是透明的

13、String、StringBuilder、StringBuffer有什么区别?

  1. String是final修饰的,也就意味着String引用的字符串内容是不能被改变的。而StringBuffer和StringBuilder表示的字符串对象可以直接进行修改
  2. StringBuilder是Java5引入的,它和StringBuffer的方法完全相同,区别在于,StringBuilder是在单线程环境下使用的,它的所有方面都没有被synchronized修饰,因此它的效率也比StringBuffer要高
  3. StringBuffer是线程安全的,而StringBuilder是线程非安全的
  4. 执行速度方面:StringBuilder >  StringBuffer  >  String

14、访问权限修饰符 public、private、protected、以及默认时的区别?

15、状态修饰符final、static各有什么作用?

静态成员方法只能访问静态成员

16、包装类有哪些?为什么会有包装类?

  • 装箱:将基本类型用它们对应的引用类型包装起来
  • 拆箱:将包装类型转换为基本数据类型
包装类的作用:
  1. 某些方法的参数必须是对象,为了让基本类型也具有对象的特征,提供包装类
  2. 可以实现字符串和基本数据类型之间的转换

17、int 和 String的相互转换有哪些?

18、Java中的异常体系?

19、Java中的 Error和 Exception的区别?

  • Error:程序无法处理的错误。这些错误标识故障发生于虚拟机自身或者发生在虚拟机试图执行应用时,一般不需要程序处理。Error错误是任何处理技术都无法恢复的情况,会导致程序非正常终止。错误属于未检查类型,大多数发生在运行时。Error错误的一些例子是内存不足错误或系统崩溃错误
  • Exception:程序本身可以处理的异常。分为运行时异常和编译时异常;编译时异常是开发工具在编译期显示捕获的异常,而运行时异常常常与逻辑错误挂钩,是程序员编写程序时产生的错误

20、Java自定义异常中 Throw和 Throws的区别?


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

South.return

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值