面向实习面试的复习之Java

Java C++ 区别

  1. Java解释型:程序经编译器变成成字节码,由JVM解释执行;C++编译型:源代码经编译与链接后生成可执行二进制代码。
  2. Java纯面向对象:除基本类型(int,float),所有类型都是类;C++兼具面向过程与面向对象。
  3. Java无指针概念,程序更安全,避免溢出
  4. Java不支持多重继承,引入了接口概念;C++多重继承。
  5. Java提供了垃圾回收器,调用对象的finalize方法;C++开发人员管理内存分配,包括申请与释放(析构)
  6. Java不支持运算符重载
  7. Java平台无关:int类型32位

Java初始化顺序

  1. 静态优于非静态
  2. 父类优于子类
  3. 成员变量按照顺序初始化

父类静态变量、代码块 ->

子类静态变量、代码块 ->

父类非静态变量、代码块 ->

父类构造函数 ->

子类非静态变量、代码块 ->

子类构造函数

Java作用域

  • 成员变量:类被实例化,成员变量在内存分配空间并初始化,直至实例化对象生命周期结束
  • 静态变量(static):类被加载时
  • 局部变量:花括号内
当前类 本包 子类 其他包
public
protected
default
private

构造函数

没有编写构造器时,编译器提供一个无参数构造函数(默认值,数值类型-0,布尔-false,对象-null)

子类通过super显式调用父类的构造器

父类没有提供无参数的构造函数时,子类构造器函数必须显式调用父类的构造函数

clone

除基本数据按值传递,对象在函数调用与=赋值时采用引用传递

从已有对象A创建一个相同状态B,且对B修改不影响A,使用clone()

1
2
3
4
5
class Obj implements Cloneable {
public Obj clone() throws CloneNotSupportedException {
return (Obj)super.clone();
}
}

深复制:复制后的对象引用指向新的对象

浅复制:复制后的对象引用仍然指向原来的对象

反射机制

  • 得到一个对象所属的类
  • 获得一个类的所有成员变量和方法
  • 运行时创建对象
  • 运行时调用对象的方法
1
2
3
4
5
6
7
8
9
class Base {……}
class Sub extends Base {……}
try {
Class c = Class.forName("Sub");
Base b = (Base)c.newInstance();
b.f();
} catch (Exception e){
}

面向对象

继承、封装、多态

多态实现机制

  • 方法重载:同一个类中多个同名方法,不同参数(不同参数个数,不同参数类型,不同参数顺序),编译时多态
  • 方法覆盖:子类覆盖父类的方法(函数名参数相同,返回值相同,抛出异常一致,被覆盖方法不能是private),运行时多态

抽象类 extends

  • 只要包含抽象方法的类必须声明为抽象类,被声明抽象的方法不能包含方法体。
  • 抽象类使用中不能被实例化,但可以创建对象指向具体子类的一个实例。
  • 抽象类子类为父类所有抽象方法提供具体实现,否则也是抽象类。

接口 implements

接口中所有方法都是抽象

this super

  • this指向当前实例对象
  • super访问父类方法和成员变量
    • 子类构造函数显示调用父类构造函数时,super必须为构造函数中第一句语句

final

  • final 修饰类 类不能被继承
  • final 修饰方法 方法不能被重写
  • final 修饰变量 值不可被修改 (引用不可变)

static

  • static 成员变量:静态变量,为类的所有对象共享
  • static 成员方法:不需要创建对象可以被调用
  • static 代码块:静态代码块在类被加载时被被调用

volatile

volatile 修饰被不同线程访问和修改的变量,每次使用时从内存提取,而不利用缓存;不能保证原子性

基本数据类型

类型 位长 包装类
int 4 byte / 32 bit Integer
short 2 byte / 16 bit Short
long 8 byte / 64 bit Long
byte 1 byte / 8 bit Byte
float 4 byte / 32 bit Float
double 8 byte / 64 bit Double
char 2 byte / 16 bit Character
boolean 1 byte / 8 bit Boolean

不可变类

  • 基本类型的包装类是不可变类;
  • String是不可变类

字符串

String s1 = new String("abc");
String s2 = new String("abc");

内存地址不同

String s1 = "abc";String s2 = "abc";

JVM中字符串池,可以被共享使用。s1,s2引用同一个常量池中对象。
new String(“abc”) 创建了一个或者两个对象:常量池中有”abc”,一个;否则,两个。

== equals hashCode

  • ==:比较基本类型数据或者两个引用变量是否相等
  • equals:String检测两个字符串是否相等
  • hashCode:内存中地址转换成int值

equals true -> hashCode 相同整数

equals false -> hashCode 可能相等,可能不相等

String StringBuilder StringBuffer

  • String:不可变类,String对象一旦被创建,其值不能被改变
  • StringBuilder:线程非安全的
  • StringBuffer:线程安全的,同步

length length()

  • length:获取数组的长度
  • length():计算字符串的长度

try catch finally

try{ }中有return语句,但在return之前会运行finally块里的代码

finally块中有return语句时,会覆盖函数中其他return语句

Java 堆与栈

  • 栈: 基本类型 int, short, long, byte, float, double, boolean, char 以及对象的引用变量
  • 堆: new创建的对象和数组

Collections框架

List, Queue, Set, Stack继承自Collection接口

接口

  • Set : HashSet, TreeSet(有序)
  • List : LinkedList, ArrayList, Vector
  • Map : HashMap(散列表,hashCode), TreeMap(红黑树)

List

  • ArrayList 基于数组 随机访问get与set性能优,线程不安全
  • LinkedList 基于双向列表 新增与删除add与remove性能优,线程不安全
  • Vector 基于数组,线程安全

HashMap Hashtable

HashMap是Hashtable轻量级实现

  • Hashtabl线程安全
  • HashMap线程不安全,最多允许一条键值为null;
    • 添加键值对,调用key的hashCode方法生成hash值,不存在直接添加;
    • 存在,找到所有key,调用equals方法比较,true覆盖,false添加;
    • 冲突,链地址法
  • ConcurrentHashMap

Collection Collections

  • Collection是一个集合接口
  • Collections是针对集合类的一个包装类
1
2
List<Integer> list = new LinkedList<Intger>();
Collections.sort(list);