java基础面试题

hashcode 与 equals 区别

equals是object自带的方法,默认是==来比较对象的可重写;
hashcode方法是获取对象的hash值
---------------------------------------------------------------------
hash 算法:将任意长度的数映射成一个固定长度的数据结构
实现方式一:取余法
H: 0 1 2 3 4 5 6 7 8 9 
除以5取余数 h=H % 5
h:  0 1 2 3 4
    | | | | |
    5 6 7 8 9
这是0 和 5 有相同的hashcode,所以
---------------------------------------------------------------------
** hashcode相同equals不一定相等;equals相等hashcode一定相等

hashcode 方法作用

可以加快查找效率;
hashtable通过先比对hashcode;如果相同在进行equals这样可以大大提升效率

面向对象的特征

封装:将类的某些信息隐藏,提供对外的方法进行修改,增加代码可维护性
继承: 子类继承父类,增加代码复用性
多态:条件-继承,重写,父类引用指向子类对象 增加代码灵活性

实例化变量时java内存怎么分配的,修改变量值,内存是怎么变化的。

1. 当为基本数据结构时 ,如 int a =0 此时会在栈内存开辟一个内存空间存放a的值0;
当修改a的值,就是把该内存存放的值改变。

2. 当为非基本数据结构,如 T t = new T();此时会在栈内存和堆内存都开辟内存空间,
栈内存存放的是堆内存的内存地址,堆内存存的是数据值;当修改t的值时是修改堆内存的值,栈内存对应不变。
**当为String类型,String a = "1"
堆内存有一片区域叫常量池,创建a时,先在常量池里找有没有“1”没有就创建“1”,栈内存存储的引用是常量池中“1”的内存地址
当修改a="2",栈内存的引用就是改成常量池“2”的地址

String a=“1” 与 String b= new String(“1”)有什么区别? a==b为什么是false

String a="1"的引用是存放常量池“1”的地址;
new String("1")的引用是存放堆内存地址,所以不相等
这时创建流程:首先从常量池找"1",有就不创建;然后在堆内存创建“1”的内存空间;栈内存里的引用指向堆内存的“1”而不是常量池的“1”

java基本数据类型

int long short double float char byte boolean

String StringBuffer StringBuilder区别

String是final类型的,所以每次修改String变量值都会重新生成新的变量,比较占用内存,频繁操作字符串时不建议使用;
StringBuffer 底层方法都是synchronized的线程安全
StringBuilder 效率更高点

抽象类 与 接口 区别

1.抽象类只能单继承,接口可以多继承(接口可以继承多个接口)
2.抽象类有构造函数,接口没有
3.抽象类里可以有非抽象的方法,接口里的方法都是抽象的
4.在jdk1.8之前 接口是只能定义方法不能实现,jdk1.8后接口加上default后可以实现方法
5.接口里定义的变量都是final static类型无法被修改 ,抽象类里的变量可以通过子类来修改
6.接口是like a ;抽象类是is a

集合类

几种基本集合类

collection
1.List:ArrayList LinkedList
    ArrayList 实现了list与queue接口
2.Queue: ArrayList BlockingDeque
3.Set:HashSet TreeSet
    HashSet底层是HashMap,通过map的key唯一性确保set的唯一性

map
HashMap TreeMap

序列化 与 反序列化

序列化:java对象转成io流
反序列化:io流转化成java对象
实现方法:
    实现Serializable接口

深克隆 与 浅克隆

浅克隆:引用数据类型拷贝引用
深克隆:引用数据类型拷贝值
深克隆的方法:使用序列化 反序列化实现

ArrayList 与 LinkedList 区别

一般来说ArrayList查找快,插入和删除慢;LinkedList查找慢,插入和删除快
ArrayList:底层是动态数组,当容量不够会自动扩容,扩容需要复制原数组到新数组,降低性能;
初始化合适的长度使用尾插法插入可以提高效率,甚至高于LinkedList
LinkedList:插入时需要新建一个node,影响效率

HashMap 与 HashTable区别?底层原理是什么?

HashMap:数组+链表,允许key和value为空存在下标为0
1.插入一个数时,先对key值的hash值二次hash,然后对数组长度取模对应数组下标
2.如何没有产生hash冲突直接创建Node存入数组
3.产生冲突了,先进行equals比较,如果相同则替换;如果不同则插入链表,当链表长度大于8,数组大于64时则转化为红黑树,低于6就转化成链表。(jdk1.8)

HashTable: 线程安全的 ,方法都加了synchronized
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值