1、String、StringBuffer、StringBuilder
- 操作少量数据->String
- 单线程操作字符串缓冲区下操作大量数据->StringBuilder
- 多线程操作字符串缓冲区下操作大量数据->StringBuffer
- 可变性:String类中使用final关键字
private final char value[]
,所以String对象是不可变的。而StringBuilder和StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuiler类中也是使用字符数组保存字符串char[] valur
,但是没有用到final关键字,所以StringBuilder和StringBuffer都是可变的。 - 线程安全性:String中的对象是不可变的,也就可以理解为常量,所以String是线程安全的。AbstractStringBuilder是StringBuilder和StringBuffer的公共父类,它定义了一些字符串的基本操作,如:append、insert、indexOf等公共方法。StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以StringBuffer是线程安全的。而StringBuilder并没有对方法进行加同步锁,所以StringBuilder是线程不安全的。
- 性能:每次对String类型进行改变的时候,都会生成一个新的String对象,然后将指针指向新的String对象。StringBuffer每次都会对StringBuffer对象本身进行操作,而不是生成新的对象并改变对象引用。相同的情况下使用StringBuilder相对比StringBuffer能获得10%-15%左右的性能提升,但要冒线程不安全的险。
2、装箱、拆箱
- 装箱:将基本类型用它们对应的引用类型包装起来
- 拆箱:将包装类型转换为基本数据类型
3、无参构造函数的作用
程序在执行子类的构造方法之前,如果没有用super()来调用父类特定的构造方法,则会调用父类中没有参数的构造方法。因此,如果父类中只定义了有参数的构造方法,而在子类的构造方法中又没有用super()来调用父类中特定的构造方法,则编译时会发生错误。而且需要注意一点:如果没有定义任何构造函数,那么程序会帮我们自动定义一个默认无参的构造函数;如果只定义了有参构造函数,那么程序就不会帮我们定义无参构造函数。所以最保守的方法还是手动定义无参的构造函数。
4、java包、javax包
起初JavaAPI所需的包时java包,javax包当时只是扩展API包来使用。随着时间的推移,javax包逐渐扩展成为JavaAPI的组成部分。但是直接迁移比较麻烦,会破坏许多原有的代码,因此最终决定javax包成为标准API的一部分。
5、接口、抽象类
- 接口的方法默认是public,所有方法在接口中不能有实现(java8开始接口方法可以用默认实现),抽象类可以有非抽象的方法,抽象方法必须只能声明,子类实现
- 接口中的实例变量默认是final类型的,而抽象类中不一定
- 一个类可以实现多个接口,但最多只能继承一个抽象类
- 一个类实现接口的话就要实现接口的所有方法,而继承抽象类的话不一定
- 接口不能用new实例化,但可以声明,但是必须引用一个实现该接口的对象
- 抽象是对类的抽象,是一种模板设计;接口是行为的抽象,是一种行为的规范
- 注:java8中,接口可以定义静态方法,可以直接用接口名调用,实现类和实现不可以调用。如果同时实现两个接口,接口中定义了一样的默认方法,必须重写。
6、成员变量、局部变量
- 语法形式:成员变量属于类,局部变量属于方法(在方法中定义or方法的参数);成员变量可以被public、private、static等修饰符所修饰,而局部变量不能被访问控制修饰符和static修饰;但是,两者都可以被final修饰
- 在内存中存储方式:局部变量,如果是基本数据类型,那么就直接存在栈中,如果是包装类型,比如
Integer i = new Integer (12);
,会把对象存在堆中,对象的引用存在栈中。 成员变量,类的成员在不同对象中各不相同,基本数据类型和引用数据类型都存储在这个对象中,作为整体一并存储在堆中。而类的方法是所有对象共享的,方法是存在方法区的,只用当调用的时候才会被压栈,不用的时候是占内存的。 - 生存时间:成员变量是对象的一部分,它随着对象的创建而存在;局部变量随着方法的调用完毕而自动消失
- 没有赋初始值:成员变量会按照类型的默认值而赋值(除了被final修饰的变量);局部变量不会自动赋值
7、创建一个对象用什么运算符?对象实体、对象引用的差异?
使用new运算符,new创建对象实例(对象实例在堆内存中),对象引用指向对象实例(对象引用存在栈内存中)。把对象实体比作气球,把对象引用比作绳子:一根绳子可以不系气球,也可以系一个气球;一个气球可以被n条绳子系住。结论:一个对象引用可以指向0个/1个对象实体;一个对象实体可以有n个对象引用指向它。
8、构造方法的特性
- 名字与类名相同
- 虽然没有返回值,但是也不能用void声明
- 生成对象时自动执行,不用手动调用
9、静态方法、实例方法
在外部调用静态方法时,可以使用类名.方法名的方式,也可以使用对象名.方法名的方式。而实例方法只能通过对象名.方法名来调用。静态方法在访问本类的成员时,只允许访问静态变量、静态方法,不允许访问实例成员变量、方法,而实例方法没有这样的限制
10、final 关键字
- 变量:对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
- 类:当用final修饰一个类时,表明这个类不能被继承。final类中的所有成员方法都会被隐式地指定为final方法。
- 方法:第一个原因是把方法锁定,以防任何继承类修改它的含义,不能重写;第二个原因是效率。在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升(现在的Java版本已经不需要使用final方法进行这些优化了)。类中所有的private方法都隐式地指定为final。