Java面试基础

JDK和JRE的区别

JDK:Java Development Kit,是java的开发运行环境
JRE:Java Runtime Environment,是java的运行环境
JDK包含了JRE,JRE包含了JVM

==和equals的区别

==是判断两个变量或实例是不是指向同一个内存空间,equals是判断两个变量或实例所指向的内存空间的值是不是相同
==是指对内存地址进行比较 , equals()是对字符串的内容进行比较
==指引用是否相同, equals()指的是值是否相同
在这里插入图片描述

hashcode和equals

两个对象equals相等,则它们的hashcode必须相等,反之则不一定。
两个对象==相等,则其hashcode一定相等,反之不一定成立。

final在java中的作用

final作为Java中的关键字可以用于三个地方。用于修饰类、类属性和类方法。

特征:凡是引用final关键字的地方皆不可修改!

(1)修饰类:表示该类不能被继承;

(2)修饰方法:表示方法不能被重写;

(3)修饰变量:表示变量只能一次赋值以后值不能被修改(常量)。

相信大家都具备基本的常识: 被final修饰的变量是不能够被改变的. 但是这里的"不能够被改变"对于不同的数据类型是有不同的含义的.
当final修饰的是一个基本数据类型数据时, 这个数据的值在初始化后将不能被改变; 当final修饰的是一个引用类型数据时, 也就是修饰一个对象时, 引用在初始化后将永远指向一个内存地址, 不可修改. 但是该内存地址中保存的对象信息, 是可以进行修改的.
上一段话可能比较抽象, 希望下面的图能有助于你理解, 你会发现虽说有不同的含义, 但本质还是一样的.
首先是final修饰基本数据类型时的内存示意图

在这里插入图片描述

在这里插入图片描述

Math.round(-1.5)的返回值

是-1。四舍五入的原理是在参数上加0.5然后做向下取整。

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

String StringBuilder StringBuffer
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

这三个类存储的本质都是一个char类型数组.不同的是String类型的数组长度是3,而另外两个数组的长度都是19且默认值为0

String类是不可变的字符串,而另外两个类都是可以对字符串进行追加的.看一下追加扩容的方法
在这里插入图片描述
在这里插入图片描述

StringBuffer类中多了一行toStringCache = null;的代码,其中toStringCache是一个char[];这个属性在重写toString()方法中使用了

在这里插入图片描述
count是现在对象中的字符串的长度,len是要追加的字符串的长度,这两个相加之后就是追加完之后的字符串的长度
在这里插入图片描述
自动扩容源码

private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

    /**
     * 传入的是追加之后的字符串的长度,先将当前char[]的长度*2((value.length << 1))在加上2的值做为新的char[]的长度
     * 然后判断新的char的长度是否能够存储追加之后的字符串,如果长度还不够,就将追加之后的字符串的长度直接赋值给新char的长度.
     * 在判断新的char的长度的值是否合法,也就是在0-Integer.MAX_VALUE - 8之间并且不包括0就直接返回新的字符串长度,否则进行进一步处理.
     **/
    private int newCapacity(int minCapacity) {
        // overflow-conscious code
        int newCapacity = (value.length << 1) + 2;
        if (newCapacity - minCapacity < 0) {
            newCapacity = minCapacity;
        }
        return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0)
                ? hugeCapacity(minCapacity)
                : newCapacity;
    }

    private int hugeCapacity(int minCapacity) {
        if (Integer.MAX_VALUE - minCapacity < 0) { // overflow
            throw new OutOfMemoryError();
        }
        return (minCapacity > MAX_ARRAY_SIZE)
                ? minCapacity : MAX_ARRAY_SIZE;
    }
    

java中操作字符串的类,我知道的有三个类,分别是String,StringBuffer和StringBuilder.这三个类都是以char[]的形式保存的字符串,但是String类型的字符串是不可变的,对String类型的字符床做修改操作都是相当于重新创建对象.而对StringBuffer和StringBuilder进行增删操作都是对同一个对象做操作.StringBuffer中的方法大部分都使用synchronized关键字修饰,所以StringBuffer是线程安全的,StringBuilder中的方法则没有,线程不安全,但是StringBuilder因为没有使用使用synchronized关键字修饰,所以性能更高,在单线程环境下我会选择使用StringBuilder,多线程环境下使用StringBuffer.如果生命的这个字符串几乎不做修改操作,那么我就直接使用String,因为不调用new关键字声明String类型的变量的话它不会在堆内存中创建对象,直接指向String的常量池,并且可以复用.效率更高

转载自:https://blog.csdn.net/qq_37358860/article/details/100313160

普通类和抽象类的区别

关键点:abstract修饰符(抽象方法)、具体实现过程、实例化、子类实现父类的抽象方法

普通类中不可含有抽象方法,可以被实例化;
抽象类,则抽象类中所有的方法自动被认为是抽象方法,没有实现过程,不可被实例化;抽象类的子类,除非也是抽象类,否则必须实现该抽象类声明的方法

抽象类不能被finall修饰,抽象类是用来继承的

抽象类和接口的区别

1、接口可bai以被多重implement*,抽象类只能被单一extends 。  du

2、接口只有定义,抽象类可以有定义和实现 。

3、接口的字段定义默认为:public static final, 抽象类字段默认是“friendly”。

4、接口没有构造方法,抽象类可以有构造方法。

java 中 IO 流分为几种

按照流的流向分,可以分为输入流和输出流;
按照操作单元划分,可以划分为字节流和字符流;
按照流的角色划分为节点流和处理流。

InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。
OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流

按操作方式分类
在这里插入图片描述

按操作对象分类结构
在这里插入图片描述

BIO,NIO,AIO的区别

  • BIO
    同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成
  • NIO
    同步非阻塞I/O模型,它支持面向缓冲的,基于通道的I/O操作方法。
  • AIO
    AIO 也就是 NIO 2。在 Java 7 中引入了 NIO 的改进版 NIO 2,它是异步非阻塞的IO模型。异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。AIO 是异步IO的缩写,虽然 NIO 在网络操作中,提供了非阻塞的方法,但是 NIO 的 IO 行为还是同步的。对于 NIO 来说,我们的业务线程是在 IO 操作准备好时,得到通知,接着就由这个线程自行进行 IO 操作,IO操作本身是同步的。查阅网上相关资料,我发现就目前来说 AIO 的应用还不是很广泛,Netty 之前也尝试使用过 AIO,不过又放弃了

Files常用的方法

Files.exists():检测文件路径是否存在。

Files.createFile():创建文件。

Files.createDirectory():创建文件夹。

Files.delete():删除一个文件或目录。

Files.copy():复制文件。

Files.move():移动文件。

Files.size():查看文件个数。

Files.read():读取文件。

Files.write():写入文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值