Java初级面试10连问

1.JDK JRE JVM 分别是什么?

JDK:开发者提供的开发工具箱,是给程序开发者用的,它包括完整的jre、Java运行环境,还包括了其他供开发者使用的工具包。

JRE:运行时所必须的包依赖的环境都在jre中

JVM:当我们运行一个程序时,JVM负责将字节码转换为特定机器代码,JVM提供了内存管理、垃圾回收和安全机制等,他独立于硬件和操作系统,正是java程序可以一次编写多处执行的原因。

2.什么是面向对象?

封装: 封装把一个对象的属性私有化、同时提供一些可以被外界访问的属性的方法。

继承:

  • java是多单继承的,
  • 子类拥有父类非private的属性和方法
  • 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展
  • 子类可以用自己的方式实现父类的方法

多态:父类的引用指向子类

3.Java的数据类型有哪些?

很多人都会在这个看似简单的问题中入坑,一说到数据类型,很多人第一时间想到的就是int、char等类型,但是我们仔细看题就会发现,题中所问的问题是数据类型,而不是基本数据类型。

数据类型有两种,分别是“基本数据类型”和“引用数据类型”

字节大小 占位大小
byte 1 2
short 2 16
int 4 32
long 8 64
double 8 64
float 4 32
char 2 16
boolean 1 8

而引用数据类型包括的是三种:类、接口、数组

那么在Java中为什么会有“基本数据类型”和“引用数据类型”?

原因是因为引用类型在堆里,基本类型在栈里,
栈空间小且连续,往往会被放在缓存。引用类型的高速缓存率高且要多一次解引用。
而且对象还要再多储存一个对象头,对基本数据类型来说空间浪费率太高。

4.解释一下构造方法?

构造方法有哪些规定?

  • 构造方法名必须与类名一致
  • 构造方法不举办任何返回值类型、关键字void也不能加入
  • 任何类都有构造方法,如果没有显示的定义,则系统会为该类定义一个默认的无参构造器
  • 如果显示的定义了构造器,系统就不会创建默认的不含参数的构造器了,
  • 一个类中可以编写多个构造方法,构造方法之间构成重载关系。

5.如何理解方法的重载和重写??

对于方法的重载和重写,这是两个非常容易混淆的概念,所以在这里做了一个表格的对比:

重载 重写
发生在同一个类中 发生在父子类中
方法名必须相同、参数不同,包括类型、个数、顺序,方法返回值和访问修饰符可以不同。 方法名、参数列表必须相同
发生在编译时 返回值范围小于等于父类
访问修饰符范围大于等于父类
抛出的异常范围小于等于父类

6.解释this和super关键字?

在this和super关键字使用过程中有以下这些注意事项:

  • Super关键字用于从子类访问父类的变量和构造方法,也包含构造方法

  • Super调用父类中的其他构造方法时,调用时要放在构造方法的首行

  • this关键字用于引用类的当前实例,this可以调用当前类的构造方法

  • this调用本类中的其他构造方法时,也要放在首行

  • this和super都不能用在static方法中

7.解释字符串三剑客(String、StringBuilder、StringBuffer)?

线程安全 性能
String 安全
StringBuilder 不安全 比StringBuffer性能高很多
StringBuffer 安全

8.equals和 == 的区别?

这个问题也是我们在开发时常用的两个进行比较的方法,但是这两种方法你真的了解吗?

==: 判断两个基本数据类型的值是不是相等,或两个引用类型对象的地址是不是相等

equals(): 判断是否用一个对象,更加灵活

接下来我们来看一个经典的面试题实例:

public class EqualsTest {
     
    public static void main(String[] args) {
     
        Integer x = new Integer(100);
        Integer y = new Integer(100);
        System.out.println(x == y);

        Integer i = 200;
        Integer j = 200;
        System.out.println(i == j);

        Integer a = 100;
        Integer b = 100;
        System.out.println(a == b);

    }
}

上面这个实例的运行结果如下:
false
false
true

第一个是false,原因是因为:x和y是两个新的对象,所以这两个对象的地址是不同的
而对于第二个和第三个,为什么第一个是false,而第二个是true呢?原因是因为integer在常量池中的存储范围是[-128、127],127在这个范围之内,因此直接存储于常量池中,128不在这范围之内,所以会在堆中创建一个新的对象

9.解释接口和抽象类?

  • 接口是对行为的抽象,他是抽象方法的集合

  • 接口不用被实例化,所有成员默认被public static final所修饰

  • 接口中所有的方法,要么是抽象方法、要么是静态方法

  • 抽象类和接口一样不能被实例化

  • 抽象类中可以有一个或多个抽象方法,也可以不含有抽象方法

  • 抽象类是对共有方法实现或者共有成员变量的抽取,主要通过继承的方式用于代码重用

10.简述TCP三次握手过程,并说明为什么要3次握手?

为什么不能一次握手很容易理解,TCP是面向连接的,一次握手肯定建立不了连接,一条信息发出去连个回信都没有怎么连接?

为什么不能两次握手呢,假设只有两次握手,当A想要建立连接时发送一个SYN,然后等待ACK,结果这个SYN因为网络问题没有及时到达B,所以A在一段时间内没收到ACK后,再发送一个SYN,B也成功收到,然后A也收到ACK,这时A发送的第一个SYN终于到了B,对于B来说这是一个新连接请求,然后B又为这个连接申请资源,返回ACK,然而这个SYN是个无效的请求,A收到这个SYN的ACK后也并不会理会它,而B却不知道,B会一直为这个连接维持着资源,造成资源的浪费。

你可能感兴趣的:(面试,java,设计模式,面试,程序人生)