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