Java基础

Object有哪些方法?

hashcode equals wait() tostring

hashcode 和equals有什么关系?

Java中规定,hashcode相同equals不一定相同equals相同那么hashcode一定相同如果违反这种规则hashMap和hashSet不能正常使用

wait和sleep有什么区别?

  1. sleep()方法线程不会释放对象锁,wait()方法线程会释放对象锁
  2. sleep可以在任何地方使用,而wait只能在同步方法或者同步块中使用
  3. sleep是Thread线程类的静态方法,而wait是Object顶级类的普通方

String、StringBuilder和StringBuffer的区别?

  1. String类是不可变类,String对象一旦创建,其值是不能修改的
  2. StringBufferr类是可变,用synchronized同步了,是线程安全的
  3. StringBuilder类是可变非线程安全的

==equals的区别

  1. ==比较的是对象地址
  2. equals比较的是对象内容

Arraylist和Linkedlist有什么区别

Arraylist是基于数组的,在查询效率比较高插入删除效率比较低

Linkedlist是基于链表的,插入删除效率比较高查询效率比较低

对于添加和删除的时候,linkedlist优于arraylist,因为arraylist在做数据的添加和删除的时候需要有数据的位置的移动

List数据去重的几种有效方法?

HashSet去重

JDK1.8的distinct去重

BIO、NIO、AIO的区别

BIO:是同步阻塞式,是传统的IO,使用简单,但是没有办法处理并发

NIO:是同步非阻塞,是传统IO的升级,服务端和客户端通过channel通道,实现一个多路复用

AIO:是NIO的升级,也可以叫NIO2,是异步非阻塞,实现回调机制

重载和重写的区别?

重载是:方法名相同参数列表不同

重写是:方法名和参数列表都相同,一般是子类重写父类的方法

jdk1.7和jdk1.8有什么区别?

  1. jdk1.8新增了lambda表达式,还有stream
  2. HashMap底层做了改进。jdk1.7是数组加链表,jdk1.8是数组加链表加红黑树
  3. jdk1.8的接口里面可以写默认的方法

对称加密和非对称加密有什么区别?

对称加密:加密和解密必须使用同一个密钥,算法有DES,AES

非对称加密:加密和解密不是同一个密钥,一般有一个公钥,一个私钥,公钥加密,私钥解密,算法有RSA

HashMap底层原理?

Jdk1.7是基于数据加链表实现,jdk1.8是数据加链表,长度大于8转红黑树

发生hash碰撞时,java 1.7 会在链表的头部插入而java 1.8会在链表的尾部插入

Java的堆和栈分别存的什么

堆里面存的是new的对象

栈地址对象引用地址,8大基本数据类型(int,long,short,byte,char,double,float,boolean),线程运行栈,方法栈

HashMap 和 HashTable 有什么区别

HashMap 是线程不安全的,HashTable 是线程安全的;

由于线程安全,所以 HashTable 的效率比不上 HashMap;

HashMap最多只允许一条记录的键为null,允许多条记录的值为null,而 HashTable不允许;

HashMap 默认初始化数组的大小为16,HashTable 为 11,前者扩容时,扩大两倍,后者扩大两倍 +1

为什么 ConcurrentHashMap 比 HashTable 效率要高?

HashTable 使用一把锁(锁住整个链表结构)处理并发问题,多个线程竞争一把锁,容易阻塞;

ConcurrentHashMap

JDK 1.7 中使用分段锁(ReentrantLock + Segment + HashEntry),相当于把一个 HashMap 分成多个段,每段分配一把锁,这样支持多线程访问。锁粒度:基于 Segment,包含多个 HashEntry。

JDK 1.8 中使用 CAS + synchronized + Node + 红黑树。锁粒度:Node(首结点)(实现 Map.Entry<K,V>)。锁粒度降低了。

HashMap 的 table 的容量如何确定?loadFactor 是什么?该容量如何变化?这种变化会带来什么问题

table 数组大小是由 capacity 这个参数确定的,默认是16,也可以构造时传入,最大限制是1<<30;

loadFactor 是装载因子,主要目的是用来确认table 数组是否需要动态扩展,默认值是0.75,比如 table 数组大小为 16,装载因子为 0.75 时,threshold 就是12,当 table 的实际大小超过 12 时, table就需要动态扩容;

扩容时,调用 resize() 方法,将 table 长度变为原来的两倍(注意是 table 长度,而不是 threshold)

如果数据很大的情况下,扩展时将会带来性能的损失,在性能要求很高的地方,这种损失很可能很致命。

HashMap到jdk1.8为什么到8转红黑树?

之所以选择红黑树是为了解决二叉查找树的缺陷,二叉查找树在特殊情况下会变成一条线性结构(这就跟原来使用链表结构一样了,造成很深的问题),遍历查找会非常慢。

而红黑树在插入新数据后可能需要通过左旋,右旋、变色这些操作来保持平衡,引入红黑树就是为了查找数据快,解决链表查询深度的问题,我们知道红黑树属于平衡二叉树,但是为了保持“平衡”是需要付出代价的,但是该代价所损耗的资源要比遍历线性链表要少,所以当长度大于8的时候,会使用红黑树,如果链表长度很短的话,根本不需要引入红黑树,引入反而会慢。

HashMap负载因子为什么选择0.75?

如果负载因子过高,比如1的情况下,虽然空间开销减少了,提高了空间利用率

如果负载因子过低,例如0.5虽然可以减少时间的成本,但是空间利率用低

主要是时间和空间做一个权衡

Hashmap 与 ConcurrentHashMap区别?

hashmap本质是数组+链表  根据key去获取hash值 然后计算出对应的下标,如果有多个key对应同一个下标,就用链表的形式存储

ConcurrentHashMap在hashmap的基础上 ConcurrentHashMap将数据分成了多个数据段(segment 默认是16)  主要是对segment去加锁

hashmap的键值允许null值,但是ConcurrentHashMap不允许

在jdk1.7 ConcurrentHashMap是由segment数组和hashentry数组结构组成

在jdk1.8 ConcurrentHashMap放弃了segment用node+cas+synchronize保证

ConcurrentHashMap是线程安全 hashmap线程不安全

HashMap的线程不安全主要体现在下面两个方面

1、JDK1.7中,当并发执行扩容操作时会造成环形链和数据丢失的情况

2、JDK1.8中,当并发执行put的时候会对数据造成覆盖的情况

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值