牛旺面试问题
目录
一、JAVA
二、计算机网络
三、操作系统
四、项目
五、数据库
第六部分 框架
第七部分 设计模式
第八部分 数据结构和算法
第九部分 Linux
################################################################################################################################
第一部分 JAVA
JVM
谈谈JVM的内存模型。
Java8中的JVM运行时数据区
说一下 Java 方法执行的过程,说详细一点。编译、加载(类加载)、执行解释
Java 8的新特性
怎么调整堆的大小要修改哪个参数
你知道信号驱动IO和多路复用IO吗?
字符串s=新字符串(' ABC ');运行代码后,您在内存中存储了什么?变量S在哪里?
String str=新字符串(' ABC ');
字符串str=' abc
/*
第一种是用new()创建一个对象,它将存储在堆中,每次调用它时都会创建一个新对象。
第二种方法是先在栈中为String类创建一个对象引用变量str,然后找出栈中是否有‘ABC’。如果没有,将“abc”放入堆栈,并使str指向“abc”。如果有“abc”,请直接将字符串指向“abc”。
比较类中的值是否相等时,请使用equals()方法;当测试两个包装类的引用是否指向同一个对象时,使用==
*/
内存溢出的可能原因是什么?
类型:频繁内存泄漏、偶尔内存泄漏、一次性内存泄漏和隐式内存泄漏。
1.内存中加载的数据量太大,比如一次从数据库中取出的数据太多;
2.集合类中有对对象的引用,使用后不清空,使JVM无法回收;
3.代码或对象实体中存在无限循环,循环导致重复次数过多;
4.使用的第三方软件中的Bugs
5.启动参数的内存值设置得太小。
什么样的物品不能回收?如何决定物品是否可以回收?
1.引用计数法:引用与对象相关。如果要操作对象,必须使用引用。如果没有与之关联的引用,则可以回收该对象。
2.可达性分析:解决引用计数法的循环引用问题;如果“GC根”和一个对象之间没有可达路径,则称该对象不可达;无法接近的物体必须经过至少两个标记过程才能成为可回收的物体。
Java中的类加载过程是加载、验证、准备、解析和初始化。
父母分配模型有什么机制可以打破双亲委派模型
JAVA集合
谈谈数组列表和链表的区别:数组和链表的区别——查找和修改插入。
Hashmap扩展机制,为什么HashMap在定义一个大小HashMap的时候一般会初始化它的底层原理?HashMap线程安全吗?为什么Java中Hashmap的扩展因子是0.75?
说说ConcurrentHashMap
LinkedHashmap是如何实现的?
Java 的集合常用什么一般在什么场景下用到
JAVA线程和多线程
谈谈Java中线程的六种状态及其转换。
1.**初始(新)**:已创建新的线程对象,但尚未调用start()方法。
2.**正在运行* *:在Java线程中,就绪和运行状态一般称为“正在运行”。
创建线程后,其他线程(如主线程)调用对象的start()方法。处于这种状态的线程位于可运行线程池中,等待被线程调度选中获得CPU使用权,现在处于就绪状态。处于就绪状态的线程在获得CPU时间片后开始运行。
3.**阻塞* *:表示线程在锁中被阻塞。
4.**等待
**:进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。
5. **超时等待(TIMED_WAITING)**:该状态不同于WAITING,它可以在指定的时间后自行返回。
6. **终止(TERMINATED)**:表示该线程已经执行完毕。
讲一下Java里面的线程安全、概念、如何实现。写一个两个线程死锁的案例,或者表述一下
volatile关键字的作用什么场景下会使用volatile举个实际的场景volatile 的底层实现,如何防止指令重排线程,有哪些状态,说一下,并且说一下这些状态之间如何转移。
线程池用过吗说一下四种常用线程池。如果让你实现具有缓存功能的线程池的类怎么实现
- CachedThreadPool:创建一个可根据需要创建新线程的线程池
- FixedThreadPool:创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程
- ScheduledThreadPool:创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行
- SingleThreadExecutor:返回一个线程池(这个线程池只有一个线程),这个线程池可以在线程死后(或发生异常时)重新启动一个线程来替代原来的线程继续执行下去
sleep和wait有什么区别run()和start()方法的区别
1. 对sleep()方法属于 Thread 类中的。而 wait()方法属于Object 类中的
2. sleep()方法导致了程序暂停执行指定的时间,让出 cpu 该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。
3. 在调用 sleep()方法的过程中,线程不会释放对象锁。
4. 而当调用 wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用 notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。
1. start()方法来启动线程,真正实现了多线程运行。这时无需等待 run 方法体代码执行完毕,可以直接继续执行下面的代码。
2. 通过调用 Thread 类的 start()方法来启动一个线程, 这时此线程是处于就绪状态, 并没有运行。
3. 方法 run()称为线程体,它包含了要执行的这个线程的内容,线程就进入了运行状态,开始运行 run 函数当中的代码。 Run 方法运行结束, 此线程终止。然后 CPU 再调度其它线程。
Callable()和Future用过吗****使用Callable()创建线程比另外两种方式有什么优势吗
volatile int a=1,写一个方法对a进行累加,这个方法是有多个线程去访问的,这样实现能保证线程安全吗详细讲下为什么两个线程同时访问不能保证线程安全(如果线程安全a应该为3,但是线程不安全就不会是3)
有一个文件,有很多人在读。并发读,没有影响,但是当一个人在写入文件时,不允许其他人写入,如果已经在写这个文件时,是不允许读,因为在修改过程中读的不是最新的,如果有人读的情况下,不希望有人能写,如果要实现这个功能,代码应该怎么去实现,去做多线程的控制
new一个线程放在哪里
线程之间的通信方式
1.volatile和synchronized关键字
2.等待/通知机制:
//指一个线程A调用了对象O的wait()方法进入等待状态,而另一个线程B调用了对象O的notify()或者notifyAll()方法,线程A收到通知后从对象O的wait()方法返回,进而执行后续操作
//经典范例:生产者、消费者
3.管道输入/输出流:
//用于线程之间的数据传输,而传输的媒介为内存
//种具体实现:PipedOutputStream、PipedInputStream、PipedReader和PipedWriter,前两种面向字节,而后两种面向字符
4.Thread.join()
//理解成是线程合并,当在一个线程调用另一个线程的join方法时,当前线程阻塞等待被调用join方法的线程执行完毕才能继续执行
5.ThreadLocal:
//ThreadLocal,即线程变量,是一个以ThreadLocal对象为键、任意对象为值的存储结构
//将当前线程和一个map绑定,在当前线程内可以任意存取数据,减省了方法调用间参数的传递
//更像是一个线程内部的通信
JAVA基础知识
-
说下hashCode( )什么场景下会重写hashCode()
HashCode()方法和equals()方法的作用其实一样,都是比较两个对象是否相等 1.重写的equals()一般比较全面比较复杂,这样效率就比较低,而利用HashCode()进行双向对比,则只要生成一个hash值就可以进行比较,效率较高。 2.HashCode()不完全可靠:equals()相等的对象肯定相等,HashCode相等的对象不一定相等,不相等的对象一定不相等。 不重写:不重写的HashCode比较的是地址值,对于引用数据类型不能比较。所以必须重写。 重写:1.HashTable、HashMap、HashSet 2.重写了equals就一定要重写HashCode
-
在开发过程中用过到Java的反射吗你对Java反射的理解在Java命名规范中一般采用驼峰命名的方式,假设想基于反射做一件事,有一个包,包里面有很多类,找出命名不符合规范的类名、方法 名、属性名,怎么实现
-
写一个Java类,属性中可能是一个类对象,怎么解决一层一层往下扫的问题(属性是一个类,类中又有属性)
-
序列化反序列化什么情况下会使用序列化
第二部分 计算机网络
- Https和Http的区别
- ssl证书如果验证失败会有哪些原因呢
- 访问一个网址时域名解析成ip的过程
- 怎么处理跨域问题
- TCP3次握手,4次挥手为什么要3次握手不是4次,5次为什么要4次挥手
第三部分 操作系统
- 什么场景下会出现死锁怎么避免死锁
第四部分 项目
- 你写的项目中,数据库中设计了几张表
- 表中有没有用索引索引是怎么设计的
- 项目中哪个模块比较复杂技术难点
- 使用Redis做缓存,缓存中的数据是怎么来的
- 项目优化前QPS多少,优化后QPS多少
- 用什么工具做的测试在什么环境下部署的,做的压测Jmeter是在哪里执行的压测时本地的配置是怎么的做性能压测在环境部署上要考虑哪些点
- 当并发量比较大时,先查 redis 中的缓存, redis 中没有就去查mysql,并发量大时会不会出现穿透
- 当并发量比较大时,面对缓存穿透问题,对于缓存空置这种解决方法,并发量大时,可能请求都直接穿透到DB中,有没有时序问题
- 大致说下加锁的解决办法如果部署到多机,怎么解决加锁问题分布式锁有没有了解过
- MySQL中执行SQL查询语句,mysql的server层的执行流程
第五部分 数据库
Redis
- redis 的基本数据类型和底层实现,Reids的String类型的底层实现
- Redis有哪些应用场景你用Redis有哪些场景使用的是哪些数据结构
- 如何保证缓存与数据库双写的一致性这种方法有没有存在什么问题
- Redis怎么实现分布式锁
MySQL
- 乐观锁和悲观锁知道吗乐观锁和悲观锁的优缺点和应用场景是什么
- 数据库是怎么使用索引的底层实现
- Innodb 的索引数据结构,回表机制,和 mysiam 的区别
- 事务的 ACID 特性,事务隔离级别,解决什么问题
- 对数据库事务是怎么理解的数据库事务的隔离级别分别介绍下这几种事务的隔离级别的使用场景或存在的问题
- 脏读和幻读的区别什么情况下会出现幻读
- MySQL的隔离级别
题目
- SQL:表A和表B,如果同时插入一条数据,如果要保证事务的一致性,要么同时成功,要么同时失败,代码在JDBC中应该怎么写
- SQL:有一张学生课程表,里面记录学生各门课程的分数,用一条SQL将每门课程的分数都大于80分,将这些学生都找出来
第六部分 框架
Spring
- Spring中AOP是怎么实现的
- Spring中Bean的初始化过程
- Spring中IOC 平时自己写代码时有什么应用场景吗
- 说一下工厂模式及使用场景
第七部分 设计模式
- 设计模式:观察者模式
- Java中常用的设计模式
第八部分 数据结构和算法
数据结构
- 树结构的好处是什么,平时有用到哪些,bst 和 avl 树有什么区别
- 尝试实现下字典树的数据结构并且尝试建立一个字典树。
算法
- 求无向图中的连通分量
- 判断二叉树是否是 bst
- 海量数据 ,查找重复单词
- 三个线程交替打印1、2、3,直到100。
- 除了B+树查找 算法 ,还了解其他的查找 算法 吗
第九部分 Linux
- 用Linux命令统计一个文件中某个单词出现的次数
- 用Linux命令查看当前有哪些进程在活跃呢
- 用Linux查看文件有哪些命令
- less和more知道吗
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/153032.html