Java面试-1 java基础知识点

八基本数据类型和封装类

  • byte:1字节
  • short:2字节
  • int:4字节
  • long:8字节
  • float:4字节
  • double:8字节
  • char:2字节
  • boolean:1字节

注意:英文字符1字节,中文汉子或标点占2-3字节

equals和==

  • ==:用于比较基本数据类型值是否相等和引用类型是否指向同一个对象(内存中的地址)
  • equals:Object类的方法,默认比较两个对象的内存地址是否相等。很多类如String重写它用来比较对象内容是否相等。

字符串

String是不可变对象,实现了Serializable,Comparable,CharSequence接口,内部采用一个final的char[] 数组存放字符串,jvm对String会单独开辟字符串缓冲池来存储字符串对象。以下创建字符串有区别

  • String a = "abc",会先从字符串缓冲池检查是否已有相同对象,若存在则返回该对象引用给a,否则新建值为"abc"的对象再返回其引用
  • String a = new String("abc"), 不检查直接新建一个对象返回其引用
  • String a = b + "abc",若+连接的是字符串直接量,会检测字符串常量池有就不新建字符串;若连接的是非字符串直接量(数子,变量等),则不检查直接新建String对象。

Object类的公共方法

clone:实现对象的浅复制,需要实现Cloneable才可调用该方法

getClass:获取对象运行时的类型类,类型类就是代表一个类型的类,所有类型类都是Class类的实例。

finalize:释放资源,但无法确定什么时候调用

wait:让线程进入睡眠等待,直到其他线程调用该对象的notify/notifyAll或时间间隔到了或抛出InterruptedException。

notify/notifyAll:唤醒在该对象上等待的线程

equals:

hashcode:用于哈希查找,减少查找过程中equals次数。

equals和hashcode约定

  • 重写了equals必须重写hashcode
  • equals相等,则hashcode一定相等
  • hashcode相等,equals不一定要相等

四种引用

  • 强:创建一个对象并将其赋值给一个引用变量,只要存在则gc必定不会回收,即使抛出了OOM。若需要中断对象的关联,则需要给该引用变量赋值null
  • 软:SoftReference,描述还有用但非必须的对象。即将发生OOM时会回收其内存空间,若回收后仍然空间不足就会抛出OOM。主要用于实现类似缓存的功能,在内存足够的情况下直接通过软引用取值,内存不足时自动删除这部分数据。
  • 弱:WeakReference。发生GC时,无论内存是否充足,都必定回收。注意第一次gc标记,第二次gc才真正回收。主要用于监控对象是否被垃圾回收器标记为即将回收的垃圾,可以通过WeekReference的isEnQueued返回是否被标记的标志。
  • 虚:PhantomReference 无法通过虚引用获取对象实例,会在建立的时候就会加入到ReferenceQueue,在任何时候都可能被gc回收。每次垃圾回收的时候都会被回收,主要用于检测对象是否已经从内存中删除PhantomReference的isEnQueued

try catch

try catch finally,try里有return, finally还执行吗?

会执行,若try有return,则会先在try记录返回值,然后执行finally代码块,执行完毕后再return之前记录的返回值。所以finally里的代码块无法改变最后返回值。若finally里也有return语句,则会造成try里面的return语句不可达编译不通过。

两种情况下finally语句不会执行

try语句没有执行到;try块里有System.exit(0),即终止java虚拟机

java多态实现原理

子类对象声明为父类类型时,在形式上调用父类方法,jvm会从方法表中去查找方法地址,由于对象的实例是子类,所以方法表中存放的是子类的信息,从而定位到实际类的方法。

interface和abstract类

相同

都不可实例化;若继承抽象类或实现接口,如果没有对抽象方法进行实现则都必须声明为抽象类

不同

  • 接口含有的变量都隐式指定也必须是public static final,方法也同样为public abstract,所有方法都不能有具体实现。
  • 抽象类可以拥有成员变量和普通成员方法,可以没有抽象方法。

非静态内部类和静态内部类

  • 非静态内部类持有外部类的引用,能访问外部类静态和非静态成员,不能脱离外部类实例存在。也只有在外部类的内部方法,构造函数中才能申请内部类对象,其他的类无法访问。
  • 静态内部类:没有持有外部类的引用,只能访问外部类的静态成员,与外部类不存在依赖关系。只有在第一次创建时才加载而不是随着外部类的加载而加载。可以用来实现单例模式。

java代码执行顺序

父类静态代码块 > 子类静态代码块 > 父类构造代码块 > 父类构造函数 > 子类构造代码块 > 子类构造函数

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值