| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 滴滴面试题-1 -> 正文阅读 |
|
[数据结构与算法]滴滴面试题-1 |
concurrenthashmap的size函数是不是线程安全的?我们都知道Hash表的结构是数组加链表,有时候我们甚至可以把每个元素称为“桶”。在插入元素的时候,首先通过对传入的键进行hash处理。 hashMap并不是线程安全的,因为扩容容易导致数据丢失。 聊聊HashMaphashMap是由 数组+链表组成的数据结构,1.8 数组加链表+红黑树,数组的每个地方都存了key-value这样的对象,1.7是hashEntry 在1.8中叫做node。 当链表长度大于8的时候为了提高查询效率会转换成红黑树(链表定位数据的时间复杂度是O(N) 红黑树是O(logN))。 聊一聊HashMap的get和Putput的底层实现原理:
再转回concurrenthashmap线程安全的hashmap : hashtable 和 concurrentHashMap 代码上也和jdk1.8很像,也是将原来的HashEntry改为Node类,但是还是使用了volatile修饰了当前值和next的值。从而保证了在获取数据的时候高效。
JDK1.8的concurrentHashMap的get方法就比较简单了 concurrentHashMap的size方法
sumCount 中的basecount是private transient volatile long baseCount 总结无论是JDK1.7 还是JDK1.8 ConcurrentHashMap的size()方法都是线程安全的,都是准确的计算出实际数量,但是这个数据在并发场景下是随时都在变的。 项目里使用了缓存,能说一下关于redis的应用场景
java中常用的数据结构?MyISAM和InnoDB的区别
java锁的使用场景以及原理
synchronized关键字1.互斥性:确保线程互斥的访问同步代码 Lock接口
AQS(AbstractQueuedSynchronizer)java中的大部分同步类(Lock、Semaphore、ReentrantLock)都是基于AQS实现的。AQS是一种提供了原子式管理同步状态、阻塞和唤醒线程功能以及队列模型的简单框架。 ReentrantLockReentrantLock 实现了Lock接口,是Lock 的实现类。 通过内部抽象类 Sync 实现了公平锁和非公平锁。Sync继承 AbstractQueuedSynchronizer 实现了锁的可重入,并且是独享锁模式。ReentrantLock意思为可重入锁,指的是一个线程能够对一个临界资源重复加锁 ReenTrantLock的实现是一种自旋锁,通过循环调用CAS操作来实现加锁。它的性能比较好也是因为避免了使线程进入内核态的阻塞状态。 锁类型:ReentrantLock可以指定构造函数的boolean类型来创建公平锁和非公平锁(默认) 可重复:每次加锁都是对state加1,可重入则是对state叠加,每次unlock都会对state减1,当减到0时表示线程释放锁。 Synchronized为什么还需要Lock呢?因为synchronized太严格了,除非代码块异常或者结束,否则不释放锁影响了效率。 New 一个对象的时候会发生什么?操作符new 在执行的时候会做四件事:
JAVA的内存回收算法判断对象状态JAVA的垃圾回收是指回收内存中已经“死亡”的对象的内存空间 1.1 引用计数法引用计数法是一种比较简单直接的算法,即在虚拟机中保存每个对象的被引用次数,例如对象 A 被对象 B 引用,则对象 A 的引用次数加一;当对象 B 释放对对象 A 的引用时,对象 A 的引用次数减一。当某个对象的引用次数为 0 时表示该对象已经死亡,会在下一次垃圾回收时被系统回收。 缺点: 无法解决循环引用的问题,例如对象 A 引用了对象 B,而对象 B 中又引用了对象 A,此时对象 A 和对象 B 之间就形成了循环引用,两者的引用次数一直不为 0,也就一直无法被回收。 1.2 可达性算法可达性算法又叫根搜索算法,该算法由每一个根节点触发,根据对象之间的引用关系遍历所有与根节点关联的对象节点,在遍历完成后那些没有被遍历到的对象即为死亡的对象,会在下一次垃圾回收时被系统回收。
垃圾回收算法上面介绍了如何判断内存中对象状态,接下来介绍虚拟机在垃圾回收时是如何回收这些死亡的对象的。 2.1 标记-清除算法标记-清除算法即每次垃圾回收时直接从内存空间中回收那些已经死亡的对象,使用此算法进行垃圾回收会在内存中留下一段段不连续的大小不一致的内存空间,当需要创建新对象时,就从这些零碎的内存空间中寻找一片足够大的内存空间用于存放该对象。 2.2 复制算法复制算法将内存空间一分为二,每次只使用其中的一半内存,在这一半内存满了的时候就将这块内存中存活的对象复制到另一半的内存中,然后释放这一半的内存空间。 缺点:会浪费一半的内存空间。有可能遇到一半内存满了,并且这一半内存中的所有对象都是存活着的情况。 注:由于大部分对象的存活时间很短,因此大部分虚拟机按照 8:1:1 的比例将内存空间划分为 Eden 和两个 Survivor 空间,每次使用Eden和一块Survivor空间,垃圾回收时将存活的对象一次性复制到另一块Survivor空间上。 2.3标记-整理算法标记-清除算法即在垃圾回收时从内存空间中回收那些已经死亡的对象,然后将剩下的存活的对象整理到一起,留下一片连续的内存空间。即在标记-清除的基础上加上整理的步骤。 缺点:整理阶段,由于移动了可用对象,需要去更新引用。 2.4 分代收集算法现代虚拟机中一般会对内存区域进行划分:新生代,老年代。然后根据各个年代的特点选择合适的收集算法:对于新生代,每次垃圾回收都会有大量的对象死去,因此可以选用复制算法,只需要付出少量存活对象的复制成本就可以完成垃圾回收;在老年代中,对象的存活率比较高,所以一般使用“标记-清除”算法或者“标记-整理”算法进行回收。
GC和FullGCGC一般是新生代,FullGC发生在老年代,一般FULLGC伴随一次GC但是不绝对。 线程池的面试题什么是线程池?线程池的好处?所谓的线程池,通俗来讲,就是一个管理线程的池子。他可以容纳多个线程,其中的线程可以反复利用,省去了频繁创建线程对象的操作。
Integer之间的== 以及如何放到常量池子Integer常量池大小为-128到127默认,如果是常量池子就==成功,否则就new。如果直接new 127以内的数,也是放到堆里面的。所以Integer = 127 和 new 也是不一样的 Java BIO NIO AIO 三者的区别 (JAVA网络编程的三个模型)阻塞:进行读写操作时,没有东西可读可写时,程序就进入等待的状态,直到可读或可写为止。(简单的理解就是一根筋,必须要等这件事做完才去做其他的事情,否则一直处于等待的状态。) BIO:同步并阻塞,服务实现模式为一个连接对应一个线程,即客户端发送一个连接,服务端需要有一个线程来处理。如果连接多了,线程数量不够,就只能等待,即会发生阻塞。 应用场景BIO:适用于连接数目比较小且固定的架构,对服务器要求比较高,并发局限在应用中
单例模式懒汉式:只有在getInstance的时候发现为null才创建,否则不创建。线程不安全,如果想安全需要加synchronized关键字 饿汉式:在一开始就创建引用,不需要加锁,执行效率比较高 如果涉及到反序列化问题,可以考虑定义成枚举类型。 前后端如何交互get post 之类的方法,传输一个json格式的字符串,然后最后给前端返回相应数据return值即可 项目中哪些地方会用到设计模式?单例模式:数据库连接池。多线程中的线程池。 应用:在一个系统中,如果有多个相同的对象,那么只共享一份就ok了。不必每个都去实例化一个对象,可以节省大量的内存空间。 在Java中,String类型的使用了享元模式,String对象是final类型的,对象一旦创建就不可以被改变。在Java中字符串常量都是存在常量池中的,Java会确保一个字符串常量在常量池中只有一个拷贝 transactional注解增加菜品的时候需要增加口味信息,修改菜品的时候也需要修改口味信息,所以说必须要是事务级别的,否则就会出错。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 1:56:16- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |