java基础面试题目+自我答案

1.JDK 和 JRE 有什么区别?

JDK:Java Development Kit
	java 开发工具包,提供了java的开发和运行环境
JDK=java开发工具包和JRE

JRE:Java Runtime Environment
	java的运行环境
JRE=jvm+核心类库

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

== : 它的作用是判断两个对象的地址是不是相等。
     即,判断两个对象是不是同一个对象。(基本数据类型==比较的是值,引用数据类型==比较的是内存地址)
equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:
		情况1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。
		情况2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来两个对象的内容相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)

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

不对。
hasCode()相同只是表明2个键值对的hash值相等,并不能说明2个键值对相等。
扩展:
在HashMap中:当哈希算法算出的2个元素值相同,称之为哈希冲突。冲突后,进行进一步的判断,判断的是元素的内容,equals方法解决冲突。对使用哈希,所以每个对象都有hashCode()方法。
哈希表在判断元素是否相同,依据hashCode().如果哈希值相同,在判断元素的equals方法,true——不存,false——存储。

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

final关键字。最终
1final修饰符,可以修饰类,修饰方法,修饰变量
2final修饰的类不可以被继承.
3final修饰的方法不可以被覆盖(复写).
4final修饰的变量是一个常量,只能赋值一次,当使用的数据不变时,需要定义阅读性强的名称表示该数据,并将其数据final化
      被final修饰的变量,名称规范是:所有字母都大写SING_INGSTAFD
final固定的是显示初始化值,不是默认值。

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

Math.ceil() 执行向上舍入,即它总是将数值向上舍入为最接近的整数;
Math.floor() 执行向下舍入,即它总是将数值向下舍入为最接近的整数;
Math.round() 执行标准舍入,即它总是将数值四舍五入为最接近的整数(这也是我们在数学课上学到的舍入规则)。
ceil:天花板,往大了走,大于等于原值得最小整数,
floor:地板,往小了走,小于等于原值得最大整数
round:四舍五入,尽力往大了弄,floor(x+0.5)
	对于正数:round(1.6)=2,round(1.5)=2,round(1.4)=1
	对于负数:round(-1.4)=-1,round(-1.5)=-1,round(-1.6)=-2

6.String 属于基础的数据类型吗?

不属于,String属于字符串对象。
基本对象:byte,short,int,long,char,boolean,float,double
引用对象:数组,对象,类

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

1可变性:
String 类中使用 final 关键字字符数组保存字符串, private final char value[] ,所以String对象是不可变的。
StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder 类,在 AbstractStringBuilder中也是使用字符数组保存字符串 char[]value 但是没有用 final 关键字修饰,所以这两种对象都是可变的。
2线程安全性
String 中的对象是不可变的,也就可以理解为常量,线程安全。
AbstractStringBuilder 是 StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如 expandCapacity、append、insert、indexOf 等公共方法。
StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。
StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。
3性能
每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象。
StringBuffer 每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用StirngBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。
Stringfinal修饰,线程安全,适合操作少量数据
StringBuffer无final修饰,但是对方法加了同步锁,线程安全,适合多线程操作缓冲区下大量数据
StringBuilder无final,无同步锁,线程不安全,适合单线程下操作缓冲区中大量数据

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

String str = "i";//存放在方法区中的常量池中
 String str=new String(“i”);//存放在堆中的一个对象

9.如何将字符串反转?

 public static void main(String[] args) {
        //StringBuffer的reverse方法
        StringBuffer stringBuffer = new StringBuffer ();
        stringBuffer.append ("abcd");
        System.out.println (stringBuffer.reverse ());

        //StringBuilder的reverse方法
        StringBuilder stringBuilder = new StringBuilder ();
        stringBuilder.append ("abcd");
        System.out.println (stringBuilder.reverse ());

        //String中的toCharArray()方法
        String string = new String ("abcd");
        char[] chars = string.toCharArray ( );
        StringBuffer stringBuffer1 = new StringBuffer ();
        for (int i = chars.length-1;i>=0;i--){
            stringBuffer1.append (chars[i]);
        }
        System.out.println (stringBuffer1);

        //String中的charAt()方法
        String s = "abcd";
        String reverse = "";
        for (int i = s.length ()-1; i >=0; i--) {
            reverse = reverse+s.charAt (i);
        }
        System.out.println (reverse);
    }

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

indexOf():返回指定字符的索引。
charAt():返回指定索引处的字符。
replace():字符串替换。
trim():去除字符串两端空白。
split():分割字符串,返回一个分割后的字符串数组。
length():返回字符串长度。
toLowerCase():将字符串转成小写字母。
toUpperCase():将字符串转成大写字符。
substring():截取字符串。
equals():字符串比较。

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

不一定。
抽象类中不一定要包含abstract方法。也就是说,抽象类中可以没有abstract方法。

12.普通类和抽象类有哪些区别?

相同:都是用来描述事物,对其进行属性和行为的描述
不同:抽象类描述事物的信息不具体,一般类描述事物的信息具体
代码的不同:
抽象类中可以定义抽象方法,但是一般类不行。
抽象类不可以实例化,一般类可以。

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

抽象类必须由子类覆盖抽象方法才可以实例化,创建对象
final,修饰类,确保此类不能被覆盖。

14.接口和抽象类有什么区别?

抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
接口中不能含有静态代码块以及静态方法(static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
一个类只能继承一个抽象类,而一个类却可以实现多个接口。

15.java 中 IO 流分为几种?

按功能来分:输入流(input)、输出流(output)。
按类型来分:字节流和字符流。
字节流和字符流的区别是:
	字节流按 8 位传输以字节为单位输入输出数据
	字符流按 16 位传输以字符为单位输入输出数据。

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

BIO: 同步阻塞式IO,一个连接对应一个线程
NIO:同步非阻塞式IO,一个请求对应一个线程 Buffer,Channel,Selector
AIO:异步非阻塞式IO,一个有效请求一个线程

在这里插入图片描述

BIO这种模式下,我们的工作模式是先来到厨房,开始烧水,并坐在水壶面前一直等着水烧开。
NIO这种模式下,我们的工作模式是先来到厨房,开始烧水,但是我们不一直坐在水壶前面等,而是回到客厅看电视,然后每隔几分钟到厨房看一下水有没有烧开。
AIO这种模式下,我们的工作模式是先来到厨房,开始烧水,我们不一一直坐在水壶前面等,也不隔一段时间去看一下,而是在客厅看电视,水壶上面有个开关,水烧开之后他会通知我。

17.Files的常用方法都有哪些?

Files.exists():检测文件路径是否存在。
Files.createFile():创建文件。
Files.createDirectory():创建文件夹。
Files.delete():删除一个文件或目录。
Files.copy():复制文件。
Files.move():移动文件。
Files.size():查看文件个数。
Files.read():读取文件。
Files.write():写入文件。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值