JAVA后端面试《JAVA基础》

JAVA基础

1.JDK和JRE有什么区别?

  • JDK: JAVA Development Kit的简称,JAVA开发工具包,包括了JAVA的开发环境和运行环境(JRE)。
  • JRE: JAVA Runtime Environment的简称,JAVA运行环境。
  • 两者关系: JDK包含JRE,同时还包含了JAVA源码编译器 JAVAC,还包含了JAVA程序调试和分析的工具。

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

  • ==解读
  • 对于基本数据类型: 比较的是值是否相等。
  • 对于引用数据类型: 比较的是内存中的地址值。
String x = "String";//字符串常量池
String y = "String";//字符串常量池
String z = new String("String");
System.out.println(x==y);// true
System.out.println(x==z);// false
System.out.println(x.equals(y));// true
System.out.println(x.equals(z));// true
  • equas解读
  • equals本质上就是==,只不过String和Integer等重写了equals方法,把他变成了值比较.
//Cat类是自定义的一个类(Cat类中没有重写equals方法)
Cat c1 = new Cat("猫");
Cat c2 = new Cat("猫");
System.out.println(c1.equals(c2));//结果为false
/*因为Cat类中没有重写equals方法,
那么调用的是object的equals方法,因为是引用类型,
所以比较的是内存中的地址值,所以结果为false*/

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

  • 答案是不对的
  • JAVA代码示例:
String str1 = "通话";
String str2 = "重地";
System.out.println(String.format("str1:%d | str2:%d",  str1.hashCode(),str2.hashCode()));
System.out.println(str1.equals(str2));
//执行结果1: str1:1179395 | str2:1179395
//执行结果2: false
/*显然 “通话” 和 “重地” 的 hashCode() 相同,
然而 equals() 则为 false*/

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

  • final修饰的变量: 是常量,必须初始化值。
  • final修饰的方法: 是最终方法,不能被子类重写。
  • final修饰的类: 是最终类,不能被继承。

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

  • 等于-1,因为在数轴上取值时,中间值(0.5)向右取整。

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

  • String 属于引用数据类型
  • 基本数据类型:
    byte,short,int,long ,float,double,char,boolean
  • char占2字节(16位)可存放汉字:char a='中’

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

  • String 、StringBuffer、 StringBuilder
  • 1 .String 字符串常量(JAVA内的对象,是不可变的对象)
  • 2.StringBuffer 字符串变量(线程安全,用在多线程)
  • 3.StringBuilder 字符串变量(非线程安全,用在单线程)

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

  • 不一样:
    前者中的"i"是在字符串常量池中,后者中的"i"是被分配到堆内存中

9.如何将字符串反转?

  • 调用StringBuffer或者StringBuilder的reverse( ) 方法。

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

  • 1.indexOf(): 返回指定字符的索引。
  • 2.charAt(): 返回指定索引处的字符。
  • 3.replace(): 字符串替换。
  • 4.trim(): 去除字符串两端的空白。
  • 5.split(): 分割字符串,返回一个分割后的字符串数组。
  • 6.getBytes(): 返回字符串的字节数组。
  • 7.length(): 返回字符串长度。
  • 8.toLowerCase(): 将字符串转换成小写字母。
  • 9.toUpperCase(): 将字符串转换成大写字母。
  • 10.substring(): 截取字符串。
  • 11.equals():比较字符的值。

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

  • 抽象类可以没有抽象方法

12 .普通类和抽象类有什么区别?

  • 1.抽象方法 普通类不能有,抽象类可以有。
  • 2.实例化 普通类可以被实例化,抽象类不能直接被实例化。

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

  • 不能,被final修饰的类表示最终类,不能被继承,而定义抽象类就是让其他类继承的,因此产生矛盾。

14.接口和抽象类有哪些区别?

  • 1.实现:一个类可以实现多个接口,但只能继承一个抽象类。
  • 2.构造函数:抽象类可以有,但接口不能有。
  • 3.主函数(main方法):抽象类可以有,接口不能有。
  • 4.方法修饰符:接口中的方法默认被public abstract修饰。抽象类中修饰符可以任意的。
  • 5.普通成员变量:抽象类中可以有,接口中没有(接口中只有公共静态常量)。
  • 6.抽象方法:接口必须要有,抽象类可以没有。

15.何时使用接口,何时使用抽象类?

  • 接口: 主要用于抽象功能
  • 抽象类: 主要用于抽象类别

16.JAVA中IO流分为几种?

  • 1.按流向来分:输入流和输出流。
    输入流的基础类:inputStreamReader
    输出流的基础类:OutputStreamWriter
  • 2.按处理的内容来分:字节流和字符流。
    字节流的常用基础类:inputStreamOutputStream
    字符流的常用基础类:ReaderWriter
  • 3.字节流和字符流的区别
    字节流操作数据的基本单位:8位的字节
    字符流操作数据的基本单位:16位的字节

17.File的常用方法有哪些?

  • 判断
    1.exists():判断文件、文件夹是否存在
    2.isFile():判断是否是文件
    3.isDirectory():判断是否是文件夹
    4.canRead():判断是否可读
    5.canWrite():判断是否可写
    6.canExecute():判断是否可执行
    7.isHidden():判断是否隐藏
  • 获取
    1.getAbsolutePath():获取绝对路径
    2.getFreeSpace():获取空余空间,单位是字节
    3.getName():获取文件名
    4.getParent():获取父目录的路径
    5.getPath():获取文件对象定义指向的路径
    6.getTotalSpace():获取所有空间大小,单位是字节
    7.getUsableSpace():获取jvm的可用空间,单位是字节
    8.getAbsoluteFile():获取绝对路径所创建的文件对象
    9.length():获取文件大小
    10.list():返回指定目录下的所有文件名组成的数组
    11.listFile():返回指定目录下所有文件对象组成的数组

18.BIO、NIO、AIO的区别?

  • 1.BIO:Block IO的简写,同步阻塞式IO(传统IO)
    特点: 模式简单,使用方便,并发处理能力低。
  • 2.NIO:New IO的简写,同步非阻塞IO(传统IO的升级)
    特点: 客户端和服务端通过Channel(通道)通讯,实现了多路复用。
  • 3.AIO:Asynchronous IO的简写,异步非阻塞IO(NIO的升级)
    特点: 异步IO的操作基于事件和回调机制

19.final、finally、finalize的区别?

  • final: 用于修饰属性,方法和类,分别表示属性不可变,方法不能被重写,类不能被继承。
  • finally: 是异常处理语句结构的一部分,表示总是执行。
  • finalize(): 是Object类的一个方法,子类可以覆盖该方法以实现资源清理工作,GC在回收对象之前调用该方法
  • GC: Garbage Collection的简写,垃圾收集。

20.方法重写和和方法重载的区别?

  • 方法重载(overloading
    多个同名方法同时存在于一个类中,参数列表各不相同(类型,个数)
  • 方法重写(overriding
    子类通过对父类方法的重写,进行功能增强,其方法名和参数列表和父类相同。
    注释:@overriding(保证重写方法的上一行是注释)

21.JAVA支持多继承吗?

  • JAVA中的类: 不支持多继承,只支持单继承。
  • JAVA中的接口: 支持多继承
    子接口继承多个父接口,说明子接口扩展了多个功能.

22.什么是构造函数?什么是构造函数重载?

  • 构造函数: 创建对象时,构造函数会被调用,函数名与类名相同。
  • 构造函数重载: 一个类中存在多个构造函数,参数列表各不相同。

23.修饰符public、protected、默认不写、private的作用域?

  • public: 同包和其他包都可以使用。
  • protected: 同包和其他包的子孙类可以使用。
  • 默认不写: 只有同包内可以使用。
  • private: 只有本类中才可以使用。

24.堆内存和栈内存的区别?

  • ①堆内存
    堆内存用来存放所有new 创建的对象和数组的数据
  • ②栈内存
    栈内存主要存放的是 基本数据类型
    (int,short,long,byte,float,boolean,char)和对象句柄(例:String s 就是对象句柄);
    注意:并没有String基本类型,在栈内存的数据大小,生存周期必须是确定的。
    优点:寄存速度快,栈数据可以共享。
    缺点:数据固定,不够灵活。
    (当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,
    该内存空间可以立刻被另作他用。)

25.值传递和引用传递的区别?

  • 值传递:是对于基本类型变量而言的,传递的是该变量的一个副本,改变副 本不改变原变量;
  • 引用传递:是对于对象型变量而言的,传递的是该对象在内存中的地址值,对引用对象操作会改变原对象。

26.什么是自动装箱,什么是自动拆箱?

  • **自动装箱:**就是自动将 基本数据类型转换为包装器类型;
  • **自动拆箱:**就是自动将包装器类型转换为基本数据类型。
    ① Integer i = 8; (自动装箱)
    相当于自动创建一个Integer对象:Integer i = new Integer(8);(Integer就是int的包装器类)
    ② int t = i; (自动拆箱)

27.什么是.class文件?

  • ①JAVAC编译器将原有的.java文件翻译成二进制的字节码存在.class文件中。
  • ②而且class文件是跨平台的基础,有了class文件,JVM才能加载java类

28.异常处理的原则是什么?

  • ①在通用方法里面,不要捕获异常,而是直接抛出异常,让调用层处理。
  • ②用户访问界面处理掉所有可能出现的异常,并记录详细错误日志,然后返回友好的错误界面给用户。

29.static随着类的加载而加载

  • static 变量,static 方法,static代码块 。
    ①随着类的加载而加载,优先于对象存在,不依赖类的实例,被所有对象共享–static的成员变量和方法可以直接被类名调用。
    ②static的方法仅能调用其他的static方法,只能访问static数据,不能以任何方式引用this或者super。
    ③通常一个普通类不允许声明为 静态(是非法),只有内部类才允许。内部类被static修饰变为静态内部类。
    ④静态代码块:在类加载时优先加载,而且只执行一次.

30.下图中分别包含几个对象?

在这里插入图片描述

  • ① 1个对象,在栈内存中。
  • ② 2个对象,左边在栈内存中,右边在堆内存中
  • ③ 3个对象,多了一个字符串常量池的对象

31.为什么说char数组比String更适合存储密码?

  • String是字符串常量类,是不可变的
  • char数组是可变的,可以被覆盖
//1.假设password是前端提交过来的密码
String password = "123";
//2.假设在后台中,对密码进行处理
String password = "xxxxxs"
//3.原来的"123"依旧在内存中,所以相当不安全

32. instanceof关键字怎么使用?

  • instanceof:测试一个对象是否为另一个类的实例
//Class代表某个类或者接口
boolean b = obj instanceof Class
  • ①obj必须为引用类型
  • ②obj可以为null
  • ③obj可以为Class类的实例对象
  • ④obj可以为Class接口的实现类
  • ⑤obj可以为Class类的子类
public static void main(String[] args) {
        Integer integer = new Integer(2);
        System.out.println(integer instanceof Object);//ture
        boolean b = integer instanceof Object;
        System.out.println("b = " + b);//true
        int i = 2;
        //System.out.println(i instanceof Object) 编译错误
    }

33.URL和URI的区别?

  • URI 统一资源标志符:标记了一个网络资源
  • URL 统一资源定位符:标记了一个网络资源,并给出了一个访问地址
  • URN 统一资源名称:通过特定命名空间的唯一名称或ID来表示资源
  • 三者关系:URI包括URN和URL,URL是URI的子集,所以URL一定 URI,但URI不一定是URL

34.创建对象之间的比较

在这里插入图片描述
在这里插入图片描述

35.自增运算

   //求k的值
    int i = 1;
    int j = 2;
    int k = i++ + ++j + i++
  • 自增运算符的优先级比算数运算符的优先级要高。
    • i++的结果是1,算完以后i的值是2。
    • ++j的结果是3,算完以后j的值是3。
    • i++的结果是2(因为在此之前i的值在第一个i++完成后变成了2),算完以后i的值是3。所以k的值就是1+3+2=6

36.关键字总结

  • break

    • ①结束循环,跳出循环体,进行后面的程序;
    • ②switch case结构中结束选择分支
  • continue

    • ①结束本次循环,进行下次循环;
  • return

    • ①跳出循环体所在的方法,相当于结束该方法;
    • ②return +[返回类型的对象] 传给需要返回的方法
  • super

    • ①子类在构造方法中显示调用父类构造方法
    • ②在子类内部代表父类对象,从而在子类中访问父类的属性和方法。
  • this

    • ①在类的内部永远代表正在执行此代码的对象;在成员方法和构造方法内部,都可以通过this来明确访问类中的成员属性和成员方法。
    • ②在构造方法内部通过this(参数列表),可以调用其他构造方法。
发布了18 篇原创文章 · 获赞 6 · 访问量 1869

猜你喜欢

转载自blog.csdn.net/weixin_43766298/article/details/103434836