面向过程和面向对象的区别

面向过程:性能比面向对象高,由于类调用时需要实例化,资源开销比较大。
面向对象:易维护、易复用、易扩展,由于面向对象有封装、继承、多态的特性,可以设计出低耦合的系统,使系统更灵活、更易于维护

Java的特点

  1. 面向对象(继承、多态、封装)
  2. 一次编译,处处运行
  3. 安全性
  4. 支持多线程
  5. 支持网络编程
  6. 编译与解释共存

    为什么编译与解释共存

    主要是引入了即时编译器的原因,当程序运行时会使用解释器对代码解析解释执行,当部分代码的解释次数达到阈值时会成为热点代码并触发编译,存入codeCache中。当下次再使用这段代码时会直接存codeCatch中读取机器码,直接执行。

JVM、JDK和JRE的区别

JVM

JVM是运行Java字节码的虚拟机,JVM有针对不同系统的特定实现,目的就是使用相同的字节码并给出相同的实现

什么是字节码?

由.java文件经过编译后的class后缀的文件就是字节码,字节码是JVM可读的,只面向虚拟机。字节码的好处就是在保留了跨平台的特性的同时也保证了Java程序运行时的高效。

JDK和JRE

JDK

JDK是Java开发的套件,有着功能齐全的Java SDK,JDK包含了JRE。能够创建和编译程序。

JRE

JRE是Java运行时环境。他是运行已编译Java程序的基础。

重载和重写的区别

重载:发生在同一个类中,方法名必须相同,参数的类型、个数、顺序不同,方法返回值和访问修饰符不同。发生在编译期间
重写:发生在父子类中,方法名、参数必须相同,返回值范围小于或等于父类,抛出异常范围小于或等于父类,访问修饰符范围大于等于父类。如果父类方法的修饰符为private则不能进行重写

String的特性

String类是由final修饰符修饰的以字符数组形式存储的一个类。所以String类是不可变的、线程安全的。如果要改变String对象的话只能依据原有对象生成一个新的String对象,而使用同样是线程安全的StringBuffer则会在原有对象上进行操作。

Java中为什么要定义一个无作用的无参构造

每个类在创建的初始阶段都会有一个隐式的无参构造方法,当程序员添加了一个构造方法后会覆盖这个隐式的无参构造方法,我的理解是:子类继承父类后,构造函数会使用super()方法调用父类的隐式无参构造方法,如果没有这个方法,会在编译时报错。

抽象类和接口的区别

  1. 接口的方法默认是public的,且接口类中的方法不能有实现;抽象类可以有非抽象的方法
  2. 接口中的实例变量默认为final,而抽象类中可以为多种类型
  3. 一个类可以实现多个接口,但却只能实现一个抽象类
  4. 一个类实现接口的话必须实现接口中的所有方法,而抽象类不一定
  5. 抽象类可以声明但不嫩实例化

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

  1. 成员变量是属于类的;局部变量是在方法中定义的变量或是方法的参数
  2. 成员变量可以被public、private、static等修饰而局部变量不行,但除final外
  3. 成员变量是对象的一部分,而对象存在于堆内存中,局部变量存在于栈中
  4. 成员变量在未被final修饰的情况下会自动以类型的默认值进行赋值,而局部变量不会自动赋值;

对象相等与引用相等的区别

对象相等指的是两者在内存中存放的内容是否相等;
引用相等是指两者指向的内存地址是否相等

==与equals的区别

==:==比较的作用是判断两个对象的地址是否相等(是否为同一对象),值得注意的是,基本数据类型使用==比较的是值,引用数据类型比较的是内存地址
equals:equals的作用是判断两个对象是否相等,使用equals比较时会有两种情况:

  1. 类未重写equals方法: 当类未重写equals方法时,使用equals方法就是使用==进行比较
  2. 类重写了equals方法: 重写equals方法后时会比较对象的引用地址、值、类的映射地址。

    重写equals例子

    ```java public int id;

    public String name;

@Override public boolean equals(ThisClass otherObj){ if(!this == otherObj){ return false; } if(null == otherObj){ return false; } if(this.getClass() != otherObj.getClass()){ return false; }

  1. ThisClass newObj = new ThisClass();
  2. return id == newObj.id
  3. && Objects.equals(name, newObj.name);

} ```

为什么要有hashCode

由实际结论可以导出:因为两个对象如果hashCode相等但这两个对象并不一定会完全相等,但是如果使用重写后的equals方法进行比较后相等则两者的hashCode一定相等。两者的关系是并集关系:
Java基础 - 图1

  1. 所以如果两个对象的hashCode不相等,那么这两个对象一定不相等,就不需要诸位比较,节省了资源。
  2. 使用hashCode可以显著的提高查找、比对的效率


值传递和引用传递

值传递:传递给形参时会创建副本,且函数中无法改变原始的值
引用传递:传递给形参时不会创建副本,函数中可以改变原始的值

线程、进程的概念

线程:但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享同一块内存空 间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间作切换工 作时,负担要比进程小得多。
进程:进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态
的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,
一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行
着,同时,每个进程还占有某些系统资源如 CPU 时间,内存空间,文件,文
件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系
统载入内存中。 线程是进程划分成的更小的运行单位。线程和进程最大的不同
在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有
可能会相互影响。从另一角度来说,进程属于操作系统的范畴,主要是同一段时间内,可以同时执行一个以上的程序,而线程则是在同一程序内几乎同时执
行一个以上的程序段。

进程的基本状态
  1. 就绪态
  2. 执行态
  3. 阻塞态

ProcessBaseStatus.png

线程的基本状态
  1. NEW(新建)
  2. RUNNABLE(运行)
  3. BLOCKED(阻塞)
  4. TIMED_WAITING(定时等待)
  5. WAITING(等待)
  6. TERMINATED(结束)

ThreadStatus.png