面试题-Java基础篇

面试中可能遇到的java基础类问题

Java 基础

JDK 和 JRE 有什么区别

  • JDK:Java Development Kit Java开发工具包
  • JRE:Java Runtime environment Java运行环境

JRE,即java运行环境,包含了Java虚拟机、Java核心类库和支持文件,不包含开发工具,主要向用户提供运行java开发软件的运行环境。

JDK,即Java开发工具包,包含JRE,编译器和调试器等工具(JavaDoc,Java调试器),可以让开发者开发、编译、执行Java应用程序,主要供开发人员使用。

值得注意的是,在JDK 11 中,Oracle不再提供JRE和Server JRE下载

== 和 equals 的区别是什么

“==”

比较的是变量内存中存放的对象的存地址,用来判断两个对象的地址是否相同,即两个对象是否指向相同的地址,可以说‘==’比较的是引用。

“equals”

equals用来比较两个对象的内容,由于所有的类都继承于java.lang.Object类,因此适用于所有对象,只要没有对equals方法进行覆盖,平时调用的就是Object中的equals方法,而Object中的equals方法返回的是 == 的判断,因此需要注意。

字符串对象之间的比较能很好的区别 ==equals

hashCode 和 equals

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

不一定,因为hashCode()方法 和 equals()方法都可以覆盖,返回值可以自定义

两个对象用equals方法比较为true,它们的Hashcode值相同吗

不一定,因为默认情况下equals() 方法比较的是对象的内容,内容相同时但对象不一定相同,对象不同hashcode的值就不会相同。

关于hashCode和equals方法的覆盖使用是有有些规则的:

  • 两个对象使用equals比较返回true,那么hashCode方法必须返回相同值
  • 两个对象equals比较返回false,不意味着hashCode方法必须返回不同值

hashCode()和equals()方法的重要性体现在什么地方

Java中的HashMap使用hashCode()和equals()方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法。如果没有正确的实现这两个方法,两个不同的键可能会有相同的hash值,因此,可能会被集合认为是相等的。而且,这两个方法也用来发现重复元素。所以这两个方法的实现对HashMap的精确性和正确性是至关重要的。

来自牛客网

final 在 java 中有什么作用

  1. 修饰类

使用final修饰类的话,这个类将无法被继承(由于final类禁止继承,所以final类中所有的方法都隐式的指定为是final的)

  1. 修饰方法

《JAVA编程思想》第143页:
“使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升。在最近的Java版本中,不需要使用final方法进行这些优化了。”

  1. 修饰变量

一个被final修饰的变量或引用,一旦初始化后便不能更改。

类的private方法会隐式地被指定为final方法。

推荐阅读

java 中的 Math.round(-1.5) 等于多少

round 表示“四舍五入”,算法为Math.floor(x+0.5),所以

Math.round(1.5)  =  2
Math.round(-1.5) = -1

注:floor() 方法可对一个数进行下舍入,返回给定参数最大的整数,该整数小于或等于给定的参数。 the largest (closest to positive infinity) floating-point value that less than or equal to the argument and is equal to a mathematical integer.

String 属于基础的数据类型吗

不是,Java中的String是引用类型

java中的基本数据类型:byte,short,int,long,float,double,boolean,char

引用类型包括:类,接口类型,数组类型,枚举类型,注解类型

基本数据类型在创建时,在栈上给其划分一块内存,将数值直接存储在栈上。

引用数据类型在创建时,需要先在栈上分配一块内存给引用(句柄),而对象的具体信息都存储在堆内存上,然后由栈上面的引用指向堆对象的地址。

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

主要是:String、StringBuffer、StringBuilder

  • String:final修饰类型,String类的方法都是返回new String()。即String对象不能被修改,修改后都会产生新的对象。
  • StringBuffer:类中操作方法都有synchronized修饰,线程安全。
  • StringBuilder:和StringBuffer用法类似,区别在于类中的方法没有synchronized修饰,线程不安全。速度最快。

String str=”i”与 String str=new String(“i”)一样吗

不一样,因为String为final类型所以String str=”i”中,‘i’是在常量池,而new String(“i”)是新建的对象在堆内存中

如何将字符串反转

1
2
3
4
5
6
7
8
9
//使用StringBuffer中的reverse方法
StringBuffer sbuf = new StringBuffer("offer");
sbuf.reverse();
System.out.println(sbuf.toString());

//使用StringBuilder中的reverse方法
StringBuilder sbder = new StringBuilder("offer");
sbder.reverse();
System.out.println(sbder.toString());

String 类的常用方法都有那些

方法名 描述
toCharArray 将字符串转换成字符数组
charAt 取出指定位置的字符
getBytes 将字符串转换成byte数组
length 获取字符串长度
trim 去掉字符串两端空格
substring 字符串的截取
split 按照指定字符对字符串进行拆分,返回字符串数组
toUpperCase 将字符串中小写字母转换成大写字母
toLowerCase 将字符串中大写字母转换成小写字母
startsWith 判断是否以指定字符串开头
endsWith 判断是否以指定字符串结尾
equals 两个String类型内容比较
equalsIgnoreCase 将两个字符串进行不区分大小写比较
replaceAll 替换指定字符串

抽象类必须要有抽象方法吗

用abstract修饰的类就是抽象类,但抽象类中的方法不一定是抽象方法,也就是说,不一定非要有抽象方法。

注:抽象类不能被实例化

普通类和抽象类有哪些区别

  1. 抽象类不能被实例化
  2. 抽象类可以有构造方法,被继承事子类必须继承父类得一个构造方法
  3. 含有抽象方法的类必须修饰为抽象类
  4. 抽象方法不能被声明为静态,但抽象类中可以有静态方法
  5. 抽象类的子类必须实现抽象类中的所有抽象方法,否则这个子类也必须抽象类

抽象类能使用 final 修饰吗

抽象类是用于继承得,使用final对其修饰将意味着这个类无法被修改和不可以被继承,所以抽象类不能使用final修饰

接口和抽象类有什么区别

  1. 抽象类要被子类继承,接口要被类实现
  2. 接口只能做方法申明,在抽象类种可以做方法声明也可以做方法实现
  3. 接口里定义的变量是公共的静态常量,抽象类中的变量是普通变量

恰当的原则应该是优先选择类而不是接口。

java 中 IO 流分为几种

  1. 按流的流向分类:输入流和输出流
  2. 按操作单元划分:字节流和字符流
  3. 按流的角色划分:节点流和处理流

Java IO 流共涉及40多个类,并且都是从如下4个抽象类基类派生出来:InputStream/Reader:所有输入流的基类,前者是字节输入流,后者是字符输入流:OutputStream/Writer:所有输出流的基类,前者是字节输出流,后者是字符输出流。

BIO、NIO、AIO 有什么区别

BIO:Block IO同步阻塞式IO,传统的IO,特点是模式简单,并发处理能力低

NIO:Non IO 同步非阻塞IO,传统IO的升级,客户端和服务端通过通道通信,实现多路复用

AIO:Asynchronous IO,NIO的升级版,也叫NIO2,实现异步非阻塞IO,异步IO的操作基于事件和回调机制

Files的常用方法都有哪些

方法名 描述
Files.exists() 检测文件路径是否存在
Files.createFile() 创建文件
Files.createDirectory() 创建文件夹
Files.delete() 删除文件或者目录
Files.copy() 复制文件
Files.move() 移动文件
Files.size() 查看文件个数
Files.read() 读取文件
Files.write() 写入文件

老师有讲过,思想是需要建立在一定的实践基础上,前期需要对代码基础进行多多练习,对代码真正的熟悉,熟练,再去掂量思想也不迟,或许能收获更多,就像读书一样,不同时期感触不同,收获也就不一定相同。