面试八股-Java基础

1.数据类型和运算

1.1.基本数据类型

每种基本类型都有对应包装类型,包装类型有对应的xxValue方法,不同包装类型可以转换成同样的类型进行比较。

new Integer会新建对象,Integer.valueOf会使用缓存池中对象,多次调用会取得同一个对象引用。

缓冲池范围如下

  • boolean values true and false
  • all byte values
  • short values between -128 and 127
  • int values between -128 and 127
  • char in the range \u0000 to \u007F

Integer的缓冲池可以调整,启动jvm时通过-XX:AutoBoxCacheMax=<size>来指定缓冲池大小。会根据JVM的java.lang.IntegerCache.high 实现。

1.2.String

1.2.1.不可变

内部用char数组存储数据,J8和J9不太一样。声明为final,所以不可变。

不可变会有四种好处

  1. 可以缓存 hash 值
  2. String Pool的需要
  3. 安全性,因为String经常作为参数,不可变保证安全性
  4. 线程安全

1.2.2.String,StringBuffer和StringBuilder

1. 可变性

  • String 不可变
  • StringBuffer 和 StringBuilder 可变

2. 线程安全

  • String 不可变,因此是线程安全的
  • StringBuilder 不是线程安全的
  • StringBuffer 是线程安全的,内部使用 synchronized 进行同步

String Pool为String类型的缓冲池,使用new会创建新的,使用intern()会使用缓冲,如果直接="xxx"默认是使用缓存。Java7之后String Pool被放在堆中。

new String("abc")在String Pool没有"abc"的时候创建两个字符串对象,否则创建一个字符串对象。

1.2.3.字符串拼接

  • 两个都是常量,直接用"+"
    • 都是常量直接编译器优化为完成字符串
    • 包含变量编译器用StringBuilder优化,但是如果是循环中,每次都会创建SB实例,效率会很低
  • 有变量,不要求线程安全,使用StringBuilder
    • 缓冲区默认为16,过大会扩容,建议一次指定最终长度
  • 有变量,要求线程安全,使用StringBuffer
  • 只对两个字符串拼接,包含变量,使用concat
    • 先创建足够容纳最终字符串的字节数组,然后把字符串拼接到数组中,转化为字符串
    • 只有两个字符串的时候拼接效率高于StringBuilder

1.3.运算

Java参数以值传递到方法中,如果传入对象,本质上是传入了地址。

+++=会进行隐式类型转换。

switch支持string,int等简单类型,但是不支持其他复杂类型。

1.4.成员变量和局部变量

  • 成员变量在类范围定义,拥有初始值,可以是static或者非static
  • 局部变量是在方法里定义的变量,没有默认初始值,存储栈内存,过期释放

2.关键字

2.1.final

  • 修饰基本数据类型 不可变
  • 修饰引用对象 指向不可变,但是引用值可改
  • 修饰方法 不可被子类重写,重写会报错(private方法隐式被指定为final,如果有相同方法本质是定义新方法)
  • 修饰类 不允许被继承

2.2.static

  • 修饰变量 成为类变量,可以用类名.xxx访问,内存中只有一份。static修饰的类可以被集成。
  • 修饰方法 只能访问静态字段和静态方法 不能为抽象方法,不能this和super
  • 语句块 在类初始化时运行一次
  • 内部类 不需要依赖外部类实例,不能访问外部类非静态变量和方法
  • 修饰导包语句 使用不用指明Class代码,简化代码,可读性降低
import static com.xxx.ClassName.*

和static相关的初始化顺序为

  • 父类(静态变量、静态语句块)
  • 子类(静态变量、静态语句块)
  • 父类(实例变量、普通语句块)
  • 父类(构造函数)
  • 子类(实例变量、普通语句块)
  • 子类(构造函数)

3.Object方法

3.1.equals()

表示等价关系,需要满足5个条件

  1. 自反性
  2. 对称性
  3. 传递性
  4. 一致性 多次调用结果不变
  5. 与null比较永远为false

==代表相等,对于对象,==比较地址,equals则判断是否等价。

  • 检查是否为同一个对象的引用,如果是直接返回 true;
  • 检查是否是同一个类型,如果不是,直接返回 false;
  • 将 Object 对象进行转型;
  • 判断每个关键域是否相等。

3.2.hashCode()

hashCode返回哈希值,等价的两个对象散列值一定相同,但散列值相同却不一定等价。HashSet和HashMap等存入的对象需要实现hashCode方法。

理想的hash函数应该具有均匀性,最好将每个域放到R进制的某一位,R一般取31避免乘法溢出信息丢失。

@Override
public int hashCode() {
   
   
    int re
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值