面试必看 Java基础知识总结(1)

1,Java 和 C++的区别

  • Java没有指针
  • Java的类是单继承的,C++是多重继承;但是接口可以多继承
  • Java有自己的内存管理机制
  • C语言中,字符串或者字符数组结尾处都会有一个额外的字符“\0”代表结束

2,Java语言为什么说是“编译与解释并存”

  • Java程序需要先编译成字节码(*.class文件),这种字节码必须由Java解释器来解释执行

3,泛型了解么?什么是类型擦除?介绍一下常用的通配符?

  • Java的泛型是伪泛型,在编译期间,所有的泛型信息都会被擦掉,这就是类型擦除。
  • 泛型包括:泛型类、泛型接口、泛型方法
  • 常用的通配符为:T、E、K、V、?
    • ? 表示不确定的java类型
    • T(type)表示具体的一个java类型
    • K V(key value)分别代表java键值中的Key Value
    • E (element)代表Element

4,== 和equals的区别

  • == 判断两个对象的地址是不是相等,即判断两个对象是不是同一个对象,基本数据类型比较的是值,引用数据类型比较的是内存地址
  • equals() 判断两个对象是否相等
  • 当创建 String 类型的对象时,虚拟机会在常量池中查找有没有已经存在的值,如果有就赋给当前引用,如果没有就重新创建一个String对象

5,hashCode()与equals()?

  • hashCode 散列码,通过散列码可以检索除对应的值。例如HashSet,当一个对象进入HashSet的时候,会计算它的hashcode,接着去判断是否有相同的hashcode值:如果有,则调用equals来判断这两个对象是否真的相同,如果两者相同,hashset加入失败;如果两者不相同,就会散列到其他位置。因此,equals方法被覆盖过,那么hashcode方法也必须被覆盖

5,Java 程序设计语言对对象采用的不是引用调用

  • 一个方法不能修改一个基本数据类型的参数
  • 一个方法可以改变一个对象参数的状态
  • 一个方法不能让对象参数引用一个新的对象

6,重载与重写

  • 重载太简单了,不记录了,发生在编译期
  • 重写
    • 返回值类型、方法名、参数列表必须相同,抛出异常范围小于等于父类,访问修饰符范围大于等于父类
    • 父类方法访问修饰符为private/final/static则子类就不能重写该方法,但是被static修饰的方法能够被再次声明
    • 构造方法无法被重写
    • 发生在运行期

7,成员变量与局部变量的区别

  • 成员变量属于类,局部变量是在方法中定义的变量或者方法的参数
  • 成员变量可以被public、private、static等修饰符所修饰,局部变量不行;但是他们都能够被final所修饰
  • 对象存在于堆内存、局部变量存在于栈内存
  • 成员变量如果没有被赋值,则会自动以类型的默认值而赋值(除了被final修饰的成员变量也必须显式地赋值),局部变量不会自动赋值

8,静态方法和实例方法有何不同

  • 调用静态方法可以无需创建对象;可以使用“类名.方法名”,也可以使用“对象名.方法名”。实例方法只能用"对象名.方法名"
  • 静态方法在访问本类的成员时,只允许访问静态成员;实例方法则无此限制

9,常见关键字总结:static\final\this\super

  • https://snailclimb.gitee.io/javaguide/#/docs/java/basic/final,static,this,super

10,接口雨抽象类的区别

  • 接口方法默认是public,所有方法不能有实现;抽象类可以有非抽象的方法
  • 一个类可以实现多个接口,但只能实现一个抽象类。接口本身可以通过extends关键字扩展多个接口
  • 接口方法默认修饰符是public,抽象方法可以有public、protected和default这些修饰符

11,StringBuffer和StringBuilder的区别是什么?

  • 而 StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder 类,在 AbstractStringBuilder 中也是使用字符数组保存字符串char[]value 但是没有用 final 关键字修饰,所以这两种对象都是可变的。
  • 线程安全性: StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的;StringBuilder并没有加同步锁,所以是非线程安全的
  • 性能:StringBuilder比StringBuffer获取10%~15%左右的提升,但会线程不安全
  • 总结:
    • 操作少量数据:string
    • 单线程大量数据:StringBuilder
    • 多线程大量数据:StringBuffer

12,Java序列化中如果有些字段不想进行序列化,怎么办?

  • 在变量上面使用transient关键字修饰
  • transient只能修饰变量,不能修饰类和方法

13,Collections工具类和Arrays工具类常见方法总结

  • https://gitee.com/SnailClimb/JavaGuide/blob/master/docs/java/basic/Arrays,CollectionsCommonMethods.md

14,finally

  • try块或catch块中有return语句时,finally语句块将在方法返回之前被执行
  • 4种特殊情况,finally块不会被执行:
    • finally 第一行发生了异常
    • 在前面的代码中使用了System.exit(int)已退出程序。exit是带参函数
    • 程序所在线程死亡
    • 关闭CPU

15,try-with-resources

  • 跟python的with … as … 一样,可以自动关闭打开的IO
  • 通过使用分号分隔,可以在try-with-resources块中声明多个资源
try (Scanner scanner = new Scanner(new File("test.txt"))) {
     
    while (scanner.hasNext()) {
     
        System.out.println(scanner.nextLine());
    }
} catch (FileNotFoundException fnfe) {
     
    fnfe.printStackTrace();
}

16,线程、程序、进程

  • 线程与进程相似,但线程是一个比进程更小的执行单位,线程也被称为轻量级进程。
  • 程序是含有指令和数据的文件,被存储在磁盘或其他的数据存储设备中,也就是说程序是静态的代码。
  • 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。从另一角度来说,进程属于操作系统的范畴,主要是同一段时间内,可以同时执行一个以上的程序,而线程则是在同一程序内几乎同时执行一个以上的程序段。

17,线程的状态

  • NEW , 初始状态,线程被构建,但是还没有调用start()方法
  • RUNNABLE , 运行状态
  • BLOCKED , 阻塞状态
  • WAITING , 等待状态
  • TIME_WAITING , 超时等待状态
  • TERMINATED , 终止状态
    Tips:
  • 当碰到锁的时候,进入BLOCKED状态
  • 当使用wait()的时候,进入WAITING状态,需要依靠其他线程的通知才能够返回到运行状态

18,JAVA中的IO流分为几种
(1)

  • 按照流向分,分为输入流和输出流
  • 按照操作单元划分,划分为字节流和字符流
  • 按照流的角色划分为节点流和处理流
    (2)
  • InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。
  • OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。

19,BIO/NIO/AIO

  • BIO(Blocking I/O):同步阻塞I/O模式
  • NIO(Non-blocking/New I/O):同步非阻塞的I/O模型
  • AIO(Asynchronous I/O): 异步非阻塞的I/O模型

你可能感兴趣的:(面试准备)