面试实战题-并发异步多线程

Java

Map的有序无序

(1) HashMap是有无序的,LinkedHashMap和TreeMap都是有序的(LinkedHashMap记录了添加数据的顺序;TreeMap默认是自然升序)。 (2) LinkedHashMap底层存储结构是哈希表+链表,链表记录了添加数据的顺序。 (3). TreeMap底层存储结构是二叉树,二叉树的中序遍历保证了数据的有序性。 (4). LinkedHashMap有序性能比较高,因为底层数据存储结构采用的哈希表。

Java后端各种小知识点_属性 不同方法调用 值不保留吗-CSDN博客

hashCode方法的作用

1、HashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,HashCode经常用于确定对象的存储地址。 2、如果我们只重写HashCode方法,那么就会调用Object默认的equals方法,显示这是两个不同的对象。HashSet中相同的(适用于equals方法)的对象只会存放一个,但是这里实际上是两个都被放到了HashSet中,HashSet失去了本身的意义了。

Java面试——HashCode的作用原理和实例解析_java hashcode原理-CSDN博客  hash算法原理详解_哈希算法-CSDN博客  (hash算法原理)

HashMap

1、链表长度小于6时红黑树 2、1.8中扩容采用尾插法,避免形成环形链表 3、多线程put会导致数据不一致

一文读懂HashMap - 简书

HashMap和HashTable区别

1、HashMap是继承自AbstractMap类,而HashTable是继承自Dictionary类 2、HashMap中,null可以作为键和value。Hashtable既不支持Null key也不支持Null value 3、Hashtable默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。HashMap默认的初始化大小为16。之后每次扩充,容量变为原来的2倍。

HashMap 与HashTable的区别_hashmap和hashtable的区别-CSDN博客

ConcurrentHashMap

1.8中抛弃了原有的Segment 分段锁,而采用了 CAS + synchronized 来保证并发安全性。不采用segment而采用node,锁住node来实现减小锁粒度。

https://www.jianshu.com/p/5dbaa6707017

注解原理

● @Target:注解的作用目标 ● @Retention:注解的生命周期 ● @Documented:注解是否应当被包含在 JavaDoc 文档中 ● @Inherited:是否允许子类继承该注解 注解的本质就是一个继承了 Annotation 接口的接口 编译器将在编译期扫描每个类或者方法上的注解,会做一个基本的检查,你的这个注解是否允许作用在当前位置,最后会将注解信息写入元素的属性表。 然后,当你进行反射的时候,虚拟机将所有生命周期在 RUNTIME 的注解取出来放到一个 map 中,并创建一个 AnnotationInvocationHandler 实例,把这个 map 传递给它。 最后,虚拟机将采用 JDK 动态代理机制生成一个目标注解的代理类,并初始化好处理器。

https://www.cnblogs.com/yangming1996/p/9295168.html

JNI介绍以及DEMO

就是JAVA调用C/C++函数的接口.如果你要想调用C系列的函数,你就必须遵守这样的约定

JNI详解------完整Demo_jni demo-CSDN博客

SPI机制

Java SPI 实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制。 是一种服务发现机制。它通过在ClassPath路径下的META-INF/services文件夹查找文件,自动加载文件里所定义的类。 

高级开发必须理解的Java中SPI机制 - 简书

TreeSet

1、不能有重复的元素; 2、具有排序功能; 3、TreeSet中的元素必须实现Comparable接口并重写compareTo()方法,TreeSet判断元素是否重复 、以及确定元素的顺序 靠的都是这个方法; 4、依赖TreeMap。

Java集合类(四)—TreeSet - 简书

BIO、NIO、AIO介绍

1、传统的 java.io 包,它基于流模型实现,交互方式是同步、阻塞的方式,在读、写动作完成之前,线程会一直阻塞在那里,容易成为应用性能的瓶颈。 2、在 Java  1.4 中引入了 NIO 框架(java.nio 包),提供了 Channel、Selector、Buffer 等新的抽象,可以构建多路复用的、同步非阻塞 IO 程序,同时提供了更接近操作系统底层的高性能数据操作方式。 3、在 Java 7 中,NIO 有了进一步的改进,也就是 NIO 2,引入了异步非阻塞 IO 方式,也有很多人叫它 AIO(Asynchronous IO)。异步 IO 操作基于事件和回调机制,可以简单理解为,应用操作直接返回,而不会阻塞在那里,当后台处理完成,操作系统会通知相应线程进行后续工作。

第11讲 | Java提供了哪些IO方式? NIO如何实现多路复用?-Java核心技术面试精讲-极客时间

字符和字节的区别

Java采用unicode来表示字符,java中的一个char是2个字节,一个中文或英文字符的unicode编码都占2个字节,但如果采用其他编码方式,一个字符占用的字节数则各不相同。 

https://www.cnblogs.com/wgblog-code/p/11334052.html

强弱软虚引用的理解

1、强引用,还有强引用指向一个对象,就能表明对象还“活着”,垃圾收集器不会碰这种对象。 2、软引用,是一种相对强引用弱化一些的引用,可以让对象豁免一些垃圾收集,只有当 JVM 认为内存不足时,才会去试图回收软引用指向的对象。软引用通常用来实现内存敏感的缓存 3、弱引用,并不能使对象豁免垃圾收集,仅仅是提供一种访问在弱引用状态下对象的途径。 4、幻象引用,有时候也翻译成虚引用,你不能通过它访问对象。幻象引用仅仅是提供了一种确保对象被 finalize 以后,做某些事情的机制,比如,通常用来做所谓的 Post-Mortem 清理机制

JAVA语言核心精讲3-强引用、软引用、弱引用、幻象引用的区别-CSDN博客

stringbuilder原理

    String 类不可变,内部维护的char[] 数组长度不可变,为final修饰,String类也是final修饰,不存在扩容。字符串拼接,截取,都会生成一个新的对象。频繁操作字符串效率低下,因为每次都会生成新的对象。     StringBuilder 类内部维护可变长度char[] , 初始化数组容量为16,存在扩容, 其append拼接字符串方法内部调用System的native方法,进行数组的拷贝,不会重新生成新的StringBuilder对象。非线程安全的字符串操作类, 其每次调用 toString方法而重新生成的String对象,不会共享StringBuilder对象内部的char[],会进行一次char[]的copy操作。     StringBuffer 类内部维护可变长度char[], 基本上与StringBuilder一致,但其为线程安全的字符串操作类,大部分方法都采用了Synchronized关键字修改,以此来实现在多线程下的操作字符串的安全性。其toString方法而重新生成的String对象,会共享StringBuffer对象中的toStringCache属性(char[]),但是每次的StringBuffer对象修改,都会置null该属性值。

String,StringBuilder,StringBuffer 实现原理解析 - 简书

hashmap为什么16或2的次方

index = HashCode(Key) & (Length - 1) 长度16或者其他2的幂,Length-1的值是所有二进制位全为1,这种情况下,index的结果等同于HashCode后几位的值。只要输入的HashCode本身分布均匀,Hash算法的结果就是均匀的

HashMap中的为什么hash的长度为2的幂而&位必须为奇数_hash 为什么 2的幂-CSDN博客

ClassLoader类加载

按照双亲委派机制加载类,每当需要加载一个新的类时,当前的类加载器会先委托其父加载器,查询有没有加载该类。如果父类加载器已近加载该类,那么直接返回加载的class对象,如果没有那么继续向上寻找父类加载器,如果在祖宗类加载器Bootstrap都没有加载该类,那么需要当前的类加载器自己加载,如果当前的类加载器也不能加载则会跑出ClassNotFoundException异常 (PS:类加载器没有向下寻找,没有getChild只有getParent)。 自定义加载器,需要继承ClassLoader,并重写里面的protected Class findClass(String name)

https://dandanlove.com/2017/02/23/java-classloader/

Deque

Deque同时扩展了Queue接口,当Deque作为队列的时候,会产生FIFO(先进先出)行为。元素添加在双端队列的末尾并从头开始删除。  Deque也可以作为LIFO(后进先出)堆栈,此接口优于传统的Stack类使用。

深入理解Java集合之---Deque - 简书

字符串为什么是final的

1.为了实现字符串常量池 2.为了线程安全 3.为了实现String可以创建HashCode不可变性

Java String类为什么是final的? - 简书

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值