面试二:
1. String str = "123"会创造几个对象
一个,在常量池中创建一个“123”对象。
2. JVM的配置参数有自己设置过吗,知道哪些
- -Xms:设置JVM初始内存。
- -Xmx:设置JVM最大可用内存。
- -Xmn:设置新生代大小。
- -Xss:设置每个线程的栈大小。
- -XX:PermSize:设置永久代初始大小。
- -XX:MaxPermSize:设置永久代最大大小。
- -XX:MetaspaceSize:设置元空间初始大小。
- -XX:MaxMetaspaceSize:设置元空间最大大小。
- -verbose:gc:输出GC日志。
- -Xloggc:file:将GC日志输出到文件。
3. 如果我自己写一个String类,然后new一个String,你觉得new出来的对象是什么?
在Java中,所有的类都是Object类的子类,因此所有的类都有一个共同的超类Object。当你使用new关键字创建一个对象时,实际上是在调用Object类的构造函数来创建一个新的对象实例。因此,无论你创建的是哪个类的实例,最终都会得到一个Object类型的对象。
4. 重写了equals(),还要重写hashCode()?
重写equals()方法时,通常也需要重写hashCode()方法;
这是因为Java中的Object类要求如果两个对象相等(即equals()方法返回true),它们的hashCode()方法必须返回相同的值。
5. 介绍一下MySQL里面的索引?
MySQL索引是一种帮助MySQL高效获取数据的数据结构。这些数据结构以某种方式引用数据,这种结构就是索引。可简单理解为排好序的快速查找数据结构。如果要查“mysql”这个单词,我们肯定需要定位到m字母,然后从下往上找到y字母,再找到剩下的sql 。
MySQL索引主要有两种结构:B+Tree 索引和 Hash 索引。我们平常所说的索引,如果没有特别指明,一般都是指 B 树结构组织的索引 (B+Tree 索引)。
6. 简单介绍几种常见的垃圾收集器
Java中常见的垃圾收集器有以下几种:Serial、ParNew、Parallel Scavenge、CMS、Serial Old、Parallel Old和G1。
- Serial是一种单线程新生代复制算法的垃圾回收器,适用于小内存应用。
- ParNew是Serial的老年代版本,也是一种单线程新生代复制算法的垃圾回收器,适用于大内存应用。
- Parallel Scavenge是一种多线程新生代复制算法的垃圾回收器,适用于大内存应用。
- CMS是一种多线程老年代标记整理算法的垃圾回收器,适用于大内存应用。
- Serial Old是CMS的老年代版本,也是一种单线程老年代标记整理算法的垃圾回收器,适用于大内存应用。
- Parallel Old是CMS的老年代版本,也是一种多线程老年代标记整理算法的垃圾回收器,适用于大内存应用。
- G1是一种面向服务端应用的垃圾回收器,适用于大内存应用。
7. 为什么既要用synchronized又要用CAS,哪些地方用了CAS
CAS和synchronized都是用于实现多线程同步的机制,但它们的实现方式和应用场景有所不同。
CAS(Compare And Swap)是一种乐观锁机制,它通过比较内存中的值和期望值是否相等来判断是否需要更新,如果相等则更新,否则不更新。
而synchronized是悲观锁机制,它通过获取锁来保证线程安全,当一个线程获得锁时,其他线程就必须等待 。
在Java中,很多原子操作类都使用了CAS机制,例如AtomicInteger(原子整型类,它提供了一种线程安全的加减操作接口)和AtomicStampedReference(带有时间戳的对象引用,能很好的解决CAS机制中的ABA问题)等。
在使用CAS机制时,需要注意一些问题,例如ABA问题、CPU缓存一致性问题等。因此,在实际应用中,需要根据具体情况选择合适的同步机制 。
面试一:
1. 有几种网络io模型?
网络IO模型一共有五种,分别是:阻塞IO,非阻塞IO,IO复用,信号驱动IO和异步IO。其中前四种都属于同步IO,而异步IO则是一种不同的风格。
- 阻塞IO:为了完成IO,发起IO调用,此时若不具备调用条件,则一直等待,直到条件满足,完成IO调用。对于资源未能完全充分利用,大部分时间处于等待状态;
- 非阻塞IO:若当前不具备IO条件,则立即报错返回。资源利用更加充分,但IO操作不具备实时性;
- IO多路复用:一个线程处理多个IO请求;
- 信号驱动IO:操作系统会将该请求放入一个就绪队列中。然后应用程序会阻塞在那里等待IO操作完成。但是当应用程序接收到某个信号时(例如数据已经准备好或者出现错误),就会从就绪队列中取出该请求并执行相应的操作。;
- 异步IO:当应用程序发起一个IO请求时,它会立即得到一个标识符(例如文件描述符),并且可以在这个标识符上设置一个事件掩码来表示哪些事件需要响应。这样可以避免应用程序在等待IO操作完成时浪费时间
2. 异步网络模型在什么场景下你了解有应用过?
- 不涉及共享资源,或对共享资源只读,即非互斥操作。
- 没有时序上的严格关系。
- 不需要原子操作,或可以通过其他方式控制原子性。
- 常用于IO操作等耗时操作,因为比较影响客户体验和使用性能。
- 不影响主线程逻辑。
3. 除了用线程完成,还有什么操作可以完成异步操作?
可以使用协程、事件循环、异步I/O等技术 。这些技术都可以在不阻塞主线程的情况下执行耗时操作,从而提高程序的性能和响应速度。
4. 同步阻塞和同步非阻塞在java层面怎么实现?
在Java中,多线程可以用于实现同步阻塞,而NIO可以用于实现同步非阻塞。下面是它们的详解:
多线程:多线程是Java中实现同步阻塞的一种方式。在多线程中,每个线程都有自己的执行路径,当一个线程占用了临界区资源时,其他需要使用这个资源的线程都必须在这个临界区上等待。这样就形成了阻塞。
NIO:NIO是Java中实现同步非阻塞的一种方式。在NIO中,不管是服务端还是客户端,都会将自己注册到Selector中。如果哪个Channel有请求连接事件(ServerSocketChannel)或者是读写事件(SocketChannel),那么这个Channel就会处于就绪状态;接着会被Selector轮询出来,进行后续的操作。这样就可以实现非阻塞的IO操作。
5. 描述一下一次完整的http请求
- DNS解析:将域名转换为IP地址。
- TCP三次握手:建立TCP连接。
- 发起HTTP请求:客户端向服务器发送HTTP请求。
- 服务器响应HTTP请求:服务器处理请求并返回响应。
- 浏览器解析:浏览器接收HTML代码并加载页面。
- 浏览器进行页面渲染:浏览器解析HTML代码并生成可视化页面。
- 服务器关闭TCP连接:浏览器关闭TCP连接。
6. 长连接和短连接的区别,分别有哪些实现方式?
长连接和短连接的区别在于连接的持续时间。长连接是指客户端与服务端建立连接后,保持连接状态,直到客户端或服务端主动关闭连接。而短连接则是指客户端与服务端建立连接后,传输数据完成后立即关闭连接 。
- 长连接:
- HTTP持久连接(①使用TCP keepalive机制,通过发送空闲探测报文来检测连接是否存活; ②使用心跳机制,在应用层上定时发送心跳包来检测连接是否存活);
- TCP长连接(在请求头中设置Connection字段为keep-alive,表示希望保持连接,在响应头中设置Connection字段为keep-alive,表示同意保持连接);
- WebSocket长连接等 ;
- 短连接:
- HTTP短连接;
- TCP短连接等;
7. 一个http请求包含哪几部分内容?
HTTP请求包含三个部分:请求行、请求头和请求体。
- 请求行包括请求方法、URL和HTTP协议版本;
- 请求头包括客户端信息、服务器信息和其他信息;
- 请求体包括传输的数据 。
8. http 状态码
- 100 - Continue:客户端应当继续发送请求。这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应。
- 101 - Switching Protocols:服务器已经理解了客户端的请求,并将通过Upgrade消息头通知客户端采用不同的协议来完成这个请求。
- 200 - OK:请求成功。这个响应是由OK标记的值组成的,例如:200 OK。
- 201 - Created:请求已经被实现,而且有一个新的资源已经根据请求被创建。
- 202 - Accepted:服务器已经接受请求,但尚未处理。
- 203 - Non-Authoritative Information:服务器已经接受了请求,但返回的信息不一定是最新的或者最准确的,并且可能不会随着其他信息的更新而更新。
- 204 - No Content:请求已经被实现,并且没有返回任何内容。
- 205 - Reset Content:请求已经被实现,并且返回了指定类型和长度的内容。
- 206 - Partial Content:服务器已经接受了部分GET请求。
- 300 - Multiple Choices:请求已经被实现,并且有多个可供选择的选项。
- 301 - Moved Permanently:所请求的资源已经被永久移动到新位置。
- 302 - Found:所请求的资源已经被找到,并且被存储在一个不同的URL中。
- 303 - See Other:所请求的资源已经被找到,并且提供了一个不同的URL来访问它。
- 304 - Not Modified:所请求的资源未被修改过。
- 305 - Use Proxy:所请求的资源必须通过代理服务器才能被访问。
- 307 - Temporary Redirect:所请求的资源已经被临时移动到一个新位置,并且将会在另一个位置上重新出现。
- 400 - Bad Request:服务器无法理解客户端发送的请求语法格式,因此无法处理该请求。
- 401 - Unauthorized:请求未经授权。
- 402 - Payment Required:付款已经被要求,但是服务器无法处理该请求。
- 403 - Forbidden:服务器拒绝提供请求页面。
- 404 - Not Found:请求的资源不存在。
- 500 - Internal Server Error:服务器在执行请求时发生了错误,并且无法完成对该请求的处理。
- 501 - Not Implemented:服务器已经实现了请求的功能,但是没有实现请求中指定的所有功能。
- 502 - Bad Gateway:网关或代理服务器从上游服务器接收到了一个无效的响应。
- 503 - Service Unavailable:由于临时的服务器维护或者过载,服务器当前无法处理请求。
- 504 - Gateway Timeout:网关或代理服务器在等待上游服务器的响应时超时。
9. Java里面的几种集合框架尽可能地描述清楚一点
-
ArrayList:ArrayList是基于动态数组实现的,它可以根据需要自动扩展和缩小。它提供了快速的随机访问和修改元素的能力,但在插入和删除元素时性能较差。
-
LinkedList:基于链表实现的双向链表,它提供了快速的插入和删除元素的能力,但在随机访问和修改元素时性能较差。
-
HashSet:HashSet是基于哈希表实现的集合,它不保证元素的顺序,也不允许重复元素。HashSet提供了快速的插入、删除和查找元素的能力。
-
HashMap:HashMap是基于哈希表实现的键值对集合,它不保证键值对的顺序,也不允许重复的键(重复会覆盖)。HashMap提供了快速的插入、删除和查找键值对的能力。
-
TreeSet:TreeSet是基于红黑树实现的有序集合;
-
TreeMap:TreeMap是基于红黑树实现的有序键值对集合
10. 设计一个hashSet
关键步骤:
private int getIndex(T e) {
int hashCode = e.hashCode();
return hashCode & (elements.length - 1);
}
11. 用代码打开一个文件和用鼠标打开一个文件有什么区别?
方式不同:用代码打开文件是通过编程语言中的文件操作函数来实现的,而用鼠标打开文件则是通过操作系统提供的文件选择对话框来实现的。
可控性不同:用代码打开文件可以更加精确地控制文件的打开方式、读取方式等,而用鼠标打开文件则只能按照操作系统默认的方式打开文件。
适用场景不同:用代码打开文件适用于需要频繁操作文件的场景,例如程序中的文件读写操作;而用鼠标打开文件适用于需要快速选择文件的场景,例如在资源管理器中选择文件进行复制、粘贴等操作。
12. 1T的数据怎么加载到200M的内存中,并且找到两行一样的数据?
分批加载数据:将1TB的数据分成多个较小的批次,每次只加载部分数据到内存中进行处理。可以使用流式处理的方式,逐行读取数据并进行处理。
使用哈希算法进行数据分组:对于每个数据行,使用哈希算法计算出一个哈希值。将具有相同哈希值的数据行分到同一个分组中。这样可以将具有相同哈希值的数据行聚集在一起,减少需要比较的数据量。