1.Java中equals()和==的区别
equals是判断两个变量或者实例指向同一个内存空间的值是不是相同
而==是判断两个变量或者实例是不是指向同一个内存空间
举个通俗的例子来说,==是判断两个人是不是住在同一个地址,而equals是判断同一个地址里住的人是不是同一个
2.Java中equals()和HashCode()的关系
- equals(): 用来判断两个对象是否相同,再Object类中是通过判断对象间的内存地址来决定是否相同
- hashCode(): 获取哈希码,也称为散列码,返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。
hashCode主要用于提升查询效率提高哈希表性能,来确定在散列结构中对象的存储地址
重写equals()必须重写hashCode()
哈希存储结构中,添加元素重复性校验的标准就是先检查hashCode值,后判断equals()
两个对象equals()相等,hashcode()必定相等
两个对象hashcode()不等,equals()必定也不等
两个对象hashcode()相等,对象不一定相等,需要通过equals()进一步判断。https://blog.csdn.net/qq_33619378/article/details/92661494
3Java中&&和&的区别
java中&&和&都是表示与的逻辑运算符,都表示逻辑运输符and,当两边的表达式都为true的时候,整个运算结果才为true,否则为false。
&&的短路功能,当第一个表达式的值为false的时候,则不再计算第二个表达式;&则两个表达式都执行。&可以用作位运算符,当&两边的表达式不是Boolean类型的时候,&表示按位操作。
优点:
1. 简洁。2. 非常容易并行计算。3. 可能代表未来的编程趋势。
4. 结合 hashmap 的 computeIfAbsent 方法,递归运算非常快。java有针对递归的专门优化。
缺点:
1. 若不用并行计算,很多时候计算速度没有比传统的 for 循环快。(并行计算有时需要预热才显示出效率优势)2. 不容易调试。
3. 若其他程序员没有学过 lambda 表达式,代码不容易让其他语言的程序员看懂。
4. 在 lambda 语句中强制类型转换貌似不方便,一定要搞清楚到底是 map 还是 mapToDouble 还是 mapToInt
ava 8 内部Lambda 表达式的实现方式在本质是以匿名内部类的形式的实现的.
5Java map 详解 - 用法、遍历、排序、常用API等
HashMap
最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为Null(多条会覆盖);允许多条记录的值为 Null。非同步的。
TreeMap
能够把它保存的记录根据键(key)排序,默认是按升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。TreeMap不允许key的值为null。非同步的。
Hashtable
与 HashMap类似,不同的是:key和value的值均不允许为null;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtale在写入时会比较慢。
LinkedHashMap
保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.在遍历的时候会比HashMap慢。key和value均允许为空,非同步的。
https://www.cnblogs.com/lzq198754/p/5780165.html
6Java中synchronized与Lock的区别
、我把两者的区别分类到了一个表中,方便大家对比:
类别 synchronized Lock
存在层次 Java的关键字,在jvm层面上 是一个类
锁的释放 1、以获取锁的线程执行完同步代码,释放锁 2、线程执行发生异常,jvm会让线程释放锁 在finally中必须释放锁,不然容易造成线程死锁
锁的获取 假设A线程获得锁,B线程等待。如果A线程阻塞,B线程会一直等待 分情况而定,Lock有多个锁获取的方式,具体下面会说道,大致就是可以尝试获得锁,线程可以不用一直等待
锁状态 无法判断 可以判断
锁类型 可重入 不可中断 非公平 可重入 可判断 可公平(两者皆可)
性能 少量同步 大量同步
https://blog.csdn.net/qq_39521554/article/details/81130442
7wait()与sleep()的区别
简单来说wait()会释放对象锁而sleep()不会释放对象锁
8.volatile关键字
java提供了volatile关键字来保证可见性。当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。而普通的共享变量不能保证可见性,因为普通共享变量被修改之后,什么时候被写入主存是不确定的,当其他线程去读取时,此时内存中可能还是原来的旧值,因此无法保证可见性。
https://www.cnblogs.com/dolphin0520/p/3920373.html
10.使用throw和throws 引发异常
throw语句通常用在方法体中,并且抛出一个异常对象。程序在执行到throw语句时立即停止,它后面的语句都不执行。
如果一个方法可以引发异常,而它本身并不对该异常进行处理,那么该方法必须将这个异常抛给调用者可以使程序能够继续执行下去,这时候就要用到throws语句。
throw与throws的比较
1、throws出现在方法函数头;而throw出现在函数体。
2、throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常对象。
3、两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。
当Java传递是对象时,拷贝的是地址
https://www.cnblogs.com/ironHead-cjj/p/11366888.html
13.为什么使用内部类?
使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。
14Java反射机制
https://www.cnblogs.com/BalmyLee/p/10716095.html
15.java的内存模型和GC机制
https://www.jianshu.com/p/76959115d486
16.Java 字节流与字符流的区别详解