JAVA面试题(java基础)

该JAVA面试题转自(https://blog.csdn.net/sufu1065/article/details/88051083),非常感谢博主提供。下面是自己对于面试题的理解与解答,可参考。

Java 基础

1.JDK 、 JRE和JVM 有什么区别?

  • JDK

JDK:Java Development Kit ,是指Java开发工具包,包括了Java的运行环境JRE(Java Runtime Environment)、Java工具(javac、java、jdb)和Java基础的类库,是给开发人员用的。

  • JRE

JRE:Java Runtime Environment,是指Java运行环境。JRE中包含了Java virtual machine(JVM),runtime class libraries和Java application launcher,这些是运行Java程序的必要组件。

  • JVM

JVM:Java Virtual Machine,指Java虚拟机。是运行在操作系统之上的,也是整个Java实现跨平台最核心的部分。将字节码文件(.class)转化为机器码。

  • JDK、JRE、JVM三者的关系
    JDK>JRE>JVM
    在这里插入图片描述

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

public class TestJava {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//==是比较对象的内存地址是否相等
		//比较String 变量
		String s1 = "abc";
		String s2 = "abc";
		System.out.println(s1==s2); //true
		System.out.println(s1.equals(s2));//true
		//当String s1 = "abc";
		//1、首先JVM会在常量池中查找是否存在“abc”的对象;
		//2、如果没有,则会在常量池新创建一个“abc”;
		//3、如果有“abc”,则将s1指向“abc”对象;
		//4、所以s1 和s2指向同一个对象,s1==s2为true。
		
		//比较对象
		String s3 = new String("abc");
		String s4 = new String("abc");
		System.out.println(s1==s3); //false
		System.out.println(s3==s4); //false
		//当String s3 = new String("abc");
		//1、每new,都会在堆内存中产生一个新的对象;
		//2、所以s3和s4指向不同的对象;
		//3、所以s3 == s4为false
		
		//equals是比较两个对象的内容是否相等
		System.out.println(s3.equals(s4)); //true	
	}
}

3.两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
不对,举个例子,我们将关键字key存入hash表时,是根据散列函数映射到表中的一个位置,有些key会产生冲突,而冲突的原因是在于两个不相等的key的hashCode相同,但是key不一定相等,所以equals()不一定为 true。

那equals()为true的,两个对象的hashCode就相同吗?
也不一定,因为equals()比较的是两个对象的内容是否相等。而hashCode代表的是对象在堆内存的物理地址。所以equals()为true的,两个对象的hashCode也不一定相同

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

  • final修饰类,该类不可被继承

在这里插入图片描述

  • final修饰方法,该方法不可被重写

在这里插入图片描述

  • final修饰变量,该变量不可被更改

在这里插入图片描述
5.java 中的 Math.round(-1.5) 等于多少?
Math.round()的原理是对传入的参数+0.5之后,再向下取整得到的数就是返回的结果,返回值为long型。
所以Math.round(-1.5) 是-1.5+0.5=-1,向下取整为-1。

6.String 属于基础的数据类型吗?
不属于,java有8种基础

  • 四种整数类型(byte、short、int、long)
  • 两种浮点数类型(float、double)
  • 一种字符类型(char)
  • 一种布尔类型(boolean)

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

    ***String、StringBuffer、StringBuilder***
  • 从字符串可变看

String 属于不可变类
如String s1 = “abc”; 不可更改
StringBuffer和StringBuilder,都可更改字符串本身。

  • 从线程安全看

StringBuffer 线程安全

StringBuilder 线程不安全

  • 从操作方法看

三种都有各自的方法

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

  • String str="i"

1、首先JVM会在常量池中查找是否存在“i”的对象;
2、如果没有,则会在常量池新创建一个“i”;
3、如果有“i”,则将str指向“i”对象;

  • String str = new String("i")

1、即使i在常量池中存在,也会在堆内存中重新创建和分配堆内存,然后将str指向该堆内存。

9.如何将字符串反转?

public static void main(String[] args) {
		// TODO Auto-generated method stub	
		String str = "abc";
		//第一种方法,使用StringBuilder的reverse()方法
		StringBuilder s = new StringBuilder(str);
		System.out.println(s.reverse()); //cba
		
		//第二种方法,将str转化为数组,然后从后往前输出
		char[] arr = str.toCharArray();
		for(int i=arr.length-1; i>=0; i--){
			System.out.print(arr[i]);
		}
		
		//第三种,......
	}

10.String 类的常用方法都有那些?
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
11.抽象类必须要有抽象方法吗?
不一定,抽象类可以没有抽象方法,但是有抽象方法的类必须是抽象类。

12.普通类和抽象类有哪些区别?
区别1:抽象类不能被实例化
区别2:抽象类中,抽象方法只需声明,无需实现
区别3:抽象类中,普通方法可以实现
区别4:抽象类中不一定有抽象方法
区别5:待补充…

13.抽象类能使用 final 修饰吗?
不能,因为final修饰类,是代表该类不可以被继承,而对于抽象类,是需要被继承的。

14.接口和抽象类有什么区别?
自己对于抽象类和接口的理解
抽象类,把几个类共有的特点和方法抽象出来,形成抽象类。
比如狗、猫、老虎、熊,将这几个共有抽象出来,形成Animal抽象类,那共有的特点是都有名字和年纪,共有的方法是run()方法、eat()方法。

abstract class Animal{
	String name;
	int age;
	public abstract void run();
	public abstract void eat();
}

class Cat extends Animal{
	public void run(){
		System.out.println("cat is running");
	}
	public void eat(){
		System.out.println("cat is eating");
	}
}

接口,类需要新增一个技能,这个时候可以实现采用实现接口的方式。接口相当于扩展类的功能

interface Catch{
	public void catchFood();
}

class Cat implements Catch{
	
	@Override
	public void catchFood() {
		// TODO Auto-generated method stub
		System.out.println("catch mouse");
	}
}

抽象类和接口的区别
区别1:单继承(一个类只能使用一次继承关系)和多实现(一个类可以实现多个 接口)
区别2:抽象类中可以有普通的方法(有方法体),接口中的方法都是抽象方法
区别3:抽象类不能被实例化
区别4:抽象类速度比接口快

15.java 中 IO 流分为几种?
java IO流共40多个,但是万变不离其中,都是从以下4个抽象类中派生出来的。
输入流:InputStream(字节流)/Reader(字符流)
输出流:OutputStream(字节流)/Writer(字符流)
在这里插入图片描述
16.BIO、NIO、AIO 有什么区别?

BIO:Blocking IO,同步阻塞式IO
NIO:Non-blocking IO,同步非阻塞式IO
AIO:Async IO,异步非阻塞IO
在说这三个之前,先来说一下IO操作
IO的主体是其应用程序的运行态,即进程,特别强调的是我们的应用程序其实并不存在实质的IO过程,真正的IO过程是操作系统的事情,这里把应用程序的IO操作分为两种动作:IO调用IO执行。IO调用是由进程发起,IO执行时操作系统的工作。因此,IO是应用程序对操作系统IO功能的一次触发。

以一个进程的输入类型的IO调用为例,它将完成或引起如下工作内容:

  • 进程向操作系统请求外部数据
  • 操作系统将外部数据加载到内核缓冲区
  • 操作系统将数据从内核缓冲区拷贝到进程缓冲区
  • 进程读取数据继续后面的工作

所以将应用程序的IO操作分为两个步骤来理解:IO调用和IO执行。IO调用是应用程序干的事情,而IO执行是操作系统的工作。

  • 在IO调用时,对待操作系统IO就绪状态的不同方式,决定了其是阻塞或非阻塞模式。如果操作系统IO处于未就绪状态,当前进程或线程就一直等待其就绪,该种IO方式为阻塞IO,如果进程或线程并不一定等待其就绪,而是可以去做其他事情,则是非阻塞IO。
  • 在IO执行时,线程或进程是否挂起等待IO执行据定了其是否为同步或异步。当程序发起IO调用时,当前线程需要等待操作系统完成IO工作并告知进程已完成,线程或进程才能继续往下执行其他指定,则是同步IO。如当前进程或线程不必等待操作系统的IO的执行完毕,可直接继续执行其他执行,即是异步IO。

参考《UNIX网络编程:卷一》第六章——I/O复用。书中向我们提及了5种类UNIX下可用的I/O模型:

  • 1、阻塞I/O模型(同步)

在这里插入图片描述
从图中可以看到,在应用程序调用操作系统IO时,当前操作系统IO未就绪,则recvfrom一直等待,等待其数据准备好,所以为阻塞IO。在IO执行时,当数据拷贝完成,返回给recvfrom程序,在返回之前,recvfrom进程被挂起,所以为同步IO

  • 2、非阻塞I/O模型(同步)

在这里插入图片描述
从图中可以看到,在应用程序调用操作系统IO时,当前操作系统IO未就绪,直接返回给recvfrom程序,recvfrom可以干别的事,也可以轮询操作系统IO是否就绪,所以为非阻塞IO。在IO执行时,当数据拷贝完成,返回给recvfrom程序,在返回之前,recvfrom进程被挂起,所以为同步IO
3、I/O复用模型(同步)
在这里插入图片描述
从图中可以看到,在调用recvfrom程序前先调用select,select调用系统IO准备好数据,然后通知recvfrom程序。所以对于recvfrom程序是非阻塞IO
在IO执行时,当数据拷贝完成,返回给recvfrom程序,在返回之前,recvfrom进程被挂起,所以为同步IO
4、信号驱动I/O模型(同步)
在这里插入图片描述
从图中可以看到,通过调用sigaction注册新号程序,等内核数据准备好中断当前程序,所以对于recvfrom程序是非阻塞IO
在IO执行时,当数据拷贝完成,返回给recvfrom程序,在返回之前,recvfrom进程被挂起,所以为同步IO
5、异步I/O模型(异步)
在这里插入图片描述
从图中可以看到,调用aio_read,让内核准备好数据,所以对于recvfrom程序是非阻塞IO。准备好之后,直接复制完成,再递交aio_read制定的信号处理数据。可以看到recvfrom程序无需等待数据处理完成,就可以干别的事情,所以是异步IO

相信大家看到这里,应该明白了BIO、NIO、AIO的区别了。

17.Files的常用方法都有哪些?
Files是java.nio.file.Files中的类,提供了很多操作文件的方法。
在这里插入图片描述
在这里插入图片描述
上面是自己对于这些面试题的理解,其中在查找资料的过程中,有参考以下博文:
1、https://www.jianshu.com/p/fa7bdc4f3de7、
2、https://blog.csdn.net/thebigdipperbdx/article/details/79512825
3、https://www.zhihu.com/question/19732473
非常感谢!如博文中有错误的地方,还请大家不吝赐教。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值