接口和抽象类的区别

接口和抽象类的区别
相同:
1.抽行类和接口都不能被实例化
2.可以将抽象类和接口类型作为引用类型
3.一个类继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法进行重写实现
否则该类任然需要被声明为抽象类
不同:
接口:
1.interfa修饰
2.不能定义构造器
3.定义的方法全是public修饰的,抽象方法
4.不能有静态方法
5.一个类可以实现多个接口
抽象类:
1.abstact修饰
2.可以定义构造器
3.有抽象方法必有和具体方法
4.可以包含静态方法
5.可以定义成员变量
6.有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法
7.抽象方法不能同时是静态的,也不是本地方方法(需要c代码实现),不能同时被synchronized修饰

静态变量和实例变量:
静态变量:static修饰的变量,不属于任何对象,一个类不管创建多少个对象,静态变量在内存中只有一个拷贝
实例变量;必须依赖某个实例,需要先创建对象然后通过对象才能访问到他

HashMap底层代码实现
1.类的属性
初始容量16、最大容量2^30、加载因子0.75f、
桶的节点数大于等于8时,转为红黑树
桶的节点数小于等于6时,转为链表
存储元素的数组 :node<k,v>[] table
存放具体元素的值:set<map.entry<k,v>> entryset

2.hashmap的实现原理:
	1.首先有一个每个原素都是链表的数组
	2.当添加一个元素(key-value)时,
	就首先计算key的hash值,以此确定插入数组中位置
	3.但是可能存在同一hash值得元素已经被放在数的同一位置了,这是就添加放到
	同一hash值元素的后面
	4.他们在数组的同一位置,但是形成了链表,同一链表上的hash值是相同的,所以说
	数组存放的是链表。
	5.而当链表长度太长时,链表就转换为红黑树,这样大大提高了查找的效率
	
3.底层实现
	JDK1.7中HashMap采用位桶(数组)+链表
	JDK1.8中HashMap采用位桶(数组)+链表+红黑树实现,当链表长度超过阈值时会转换成红黑树
4.HashMap的存取机制
	public V get(Object key)
		通过get(key)的方法获取可以的hash值,计算hash&(n-1)的到在链表数组中位置
		first=tab[hash&(n-1)],先判断first的key是否与参数key相等,不相等就遍历后面的链表
		找到相同的key值返回对应的value值即可。
	public V put(K key, V value) 
		1.判断键值对数组tavb[]是否为null,否则默认大小resize();
		2.根据键值key计算hash值得到插入数组的位置(索引),如果tab[i]==null,直接新建节点添加
		3.否则判断当前数组中处理的hash冲突的方式为链表还是红黑树,分别处理。

5.hashMap的遍历方式:keySet()和entitySet()
6.单线程下完美的,多线程下是不安全的
7.key和value可以为null

HashTable底层代码实现:
1.hashtable的key和value不能为null
2.线程安全:通过synchronize方法保证线程安全
3.线程安全但是效率低(锁住整个hashtable)
ConcurrentHashMap底层代码实现:
1.采用分段锁实现线程安全,提高效率
原因:
1.ConcurrentHashMap的put 方法采用分段锁
2.Node<>数组中使用volatile保证变量的可见性,保证每次读到的都是主内存里面最新的值
3.扩容:段内扩容(段内元素超过该段对应Entry数组长度的75%触发扩容,不会对整个Map进行扩容),插入前检测需不需要扩容,有效避免无效扩容
4.ConcurrentHashMap默认将hash表分为16个桶,诸如get、put、remove等常用操作只锁住当前需要用到的桶。这样,原来只能一个线程进入,现在却能同时有16个写线程执行,并发性能的提升是显而易见的。

Volatile与synchronize的区别
仅靠Volatile不能保证线程的安全性(原子性)
1、Volatile轻量级的,只能修饰变量。synchronize重量级的,还可以修饰方法
2、Volatile只保证数据的可见性,不能用来同步,因为多线程访问Volatile变量不会阻塞
3、synchronize不仅保证可见性,而且保证原子性,因为自由获得了锁的线程才能到达临界区,从而保证了临界区中的所有语句被执行,多个线程抢夺synchronize锁的时候,会出现阻塞。
4、volatile是变量在多线程之间的可见性;synchronize是多线程之间访问资源的同步性;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值