![](https://img-blog.csdnimg.cn/20190927151124774.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
面试修炼
修炼永无止境
才疏学浅的小缘同学
知足且上进,温柔而坚定。
展开
-
说一说JDBC连接数据库的步骤
1.加载JDBC驱动程序。2.建立与数据库的连接。3.创建一个PreparedStatement,相对于Statement具有预处理SQL语句的功能,可以避免SQL注入。4.执行SQL语句。5.遍历结果集。6.处理异常, 关闭JDBC对象资源。...原创 2021-12-27 14:07:22 · 554 阅读 · 0 评论 -
使用索引的注意事项
1.在需要经常搜索的列上使用索引,可以加快搜索的速度。2.在经常使用WHERE子句的列上创建索引,可以加快条件的判断速度。3.在需要经常排序的列上创建索引,因为索引已经排好序,所以可以加快查询时间。4.在中大型表上建立索引很有效,在特大表上上维护开销大,不适合创建索引。5.在需要经常连接的列上创建索引,可加快连接速度。6.不要再WHERE子句中对字段添加函数,这样可能导致无法命中索引。7.将加索引的列设为NOT NULL,不然会导致引擎放弃使用索引进行全局扫描。8.移除长期未使.原创 2021-12-14 00:03:02 · 934 阅读 · 0 评论 -
索引优点这么多,为什么不给表中的每列都创建一个索引呢?
1.当表中数据增加、删除和修改的时候,索引也需要动态的维护,降低了数据的维护速度。2.索引需要占用物理空间。3.创建索引和维护索引都要耗费时间,而且数据量越多时间越长。原创 2021-12-13 23:52:41 · 788 阅读 · 0 评论 -
了解过MySQL的索引吗?为什么要使用索引?
索引是一种特殊的数据库结构 ,由数据库中的一列或多列组合而成,可以用来快速查询数据库中有某一特定值的记录。使用索引的好处:1.通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性2.可以大大加快数据的检索速度3.帮助服务器避免排序和临时表4.将随机IO变成顺序IO5.可以加快表和表之间的连接...原创 2021-12-13 23:35:40 · 644 阅读 · 0 评论 -
TCP四次挥手常见问题
目录哪四次挥手为什么要四次挥手?哪四次挥手第一次:客户端发送一个FIN,用来关闭客户端到服务端的数据传送。第二次:服务端收到FIN后发回一个ACK,确认序号为收到的序号加1,。一个FIN占用一个序号。第三次:服务器关闭连接后发送一个FIN给客户端。第四次:客户端发送ACK报文确认,并将确认序号设置为收到序号加1.为什么要四次挥手?两边都可以给对方一个连接释放的通知,给出通知后自己进入半关闭状态。当另一方没有数据再发送时,则也发出连接释放通知,对方确认后就完全关闭了T原创 2021-12-13 17:35:30 · 1894 阅读 · 0 评论 -
TCP三次握手常见问题
目录哪三次握手为什么要三次握手?为什么接收端要传回SYN?哪三次握手第一次:客户端发送带有SYN标志的数据包给服务端第二次:服务端发送带有SYN/ACK标志的数据包给客户端第三次:客户端发送带有ACK标志的数据包给服务端SYN:TCP/IP建立连接时使用的握手信号,在客户机和服务器之间建立正常的TCP网络连接时,客户机首先发送一个SYN信号,服务器使用SYN-ACK应答表示接收到了这个消息,最后客户机以ACK消息响应。从而建立起可靠的TCP连接。ACK:确认字符,在数据原创 2021-12-13 17:25:07 · 1682 阅读 · 0 评论 -
说一说JDK 1.6之后的synchronized关键字底层做了哪些优化,可以详细介绍一下这些优化吗?
使用了偏向锁、自旋锁、适应性自旋锁、轻量级锁、锁消除、锁粗化等技术来减少锁操作的开销。锁主要有四种状态:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态。锁可以升级不可降级,目的是为了提高获得锁和释放锁的效率。...原创 2021-12-13 17:07:14 · 416 阅读 · 0 评论 -
说一说synchronized关键字的使用。
synchronized关键字有最主要的三种使用方式:修饰实例方法:给当前对象实例枷锁,进入同步代码前要先获得当前对象实例的锁。修饰静态方法:给当前类对象枷锁,进入同步代码前要先获得当前类对象的锁。即给当前类加锁,作用于类的所有对象实例。因为静态成员不属于任何一个实例对象,是类成员。修饰代码块:对给定对象加锁, 进入同步代码前要先获得给定对象的锁。修饰代码块也是锁定当前对象的。...原创 2021-12-13 16:46:44 · 468 阅读 · 0 评论 -
说一说对synchronized关键字的理解
synchronized表示同步,可以解决多个线程之间访问资源的同步问题,能够保证被它修饰的方法或者代码在任意时刻只能有一个线程执行。在Java的早期版本中,synchronized属于重量级锁,效率很低。因为监视器锁依赖底层操作系统的Mutex Lock实现,Java的线程映射到操作系统的原生线程上。所以挂起和唤醒一个线程都需要操作系统帮忙完成,时间成本很高。在Java6以后从JVM层面对synchronized有了较大的优化。...原创 2021-12-11 14:30:54 · 344 阅读 · 0 评论 -
集合框架底层数据结构总结
目录CollectionListArrayListVectorLinkedListSetHashSetLinkedHashSetTreeSetMapHashMapLinkedHashMapHashtableTreeMapCollectionList元素可重复,有序ArrayList动态数组实现,线程不安全Vector数组实现,线程安全LinkedList双向链表实现,线程不安全Set不可重复,无序Ha原创 2021-12-11 14:11:11 · 457 阅读 · 0 评论 -
说一说ConcurrentHashMap线程安全的底层实现方式
目录JKD1.8以前在JDK1.8以后JKD1.8以前首先将数据分为一段一段的来进行存储,然后给每一段数据分配一把锁,当一个线程占用锁访问一段数据时,其他数据也能被其他线程访问。ConcurrentHashMap由Segment和HashEntry组成。一个ConcurrentHashMap里包含一个Segment数组,一个Segment又包含一个HashEntry。在JDK1.8以后ConcurrentHashMap取消了Segment分段锁,采用synchron原创 2021-12-11 13:38:20 · 2400 阅读 · 0 评论 -
ConcurrentHashMap和Hashtable的区别
目录从底层数据结构来看ConcurrentHashMapHashtable从实现线程安全的方式上看ConcurrentHashMapHashtable从底层数据结构来看ConcurrentHashMapJDK1.8以前采用分段数组+链表实现JDK1.8以后采用数组+链表+红黑树实现。Hashtable采用数组+链表。从实现线程安全的方式上看ConcurrentHashMap在JDK1.8以前对整个桶数组进行了分段,每一个锁只锁其中的一原创 2021-12-11 13:17:17 · 234 阅读 · 0 评论 -
HashSet和HashMap的区别
1.HashMap实现了Map接口,而HashSet实现了Set接口。2.HashMap用于存储键值对,而HashSet用于存储对象。3.HashMap不允许有重复的键,可以允许有重复的值。HashSet不允许有重复元素。4.HashMap允许有一个键为空,多个值为空,HashSet允许有一个空值。5.HashMap中使用put()将元素加入map中,而HashSet使用add()将元素放入set中。6.HashMap比较快,因为其使用唯一的键来获取对象。...原创 2021-12-11 12:48:11 · 9288 阅读 · 1 评论 -
说一说HashMap为什么在多线程操作时会导致死循环
HashMap采用链表来解决Hash冲突,而链表容易形成闭合的链路,在循环的时候只要有线程对这个HashMap进行了get操作就会产生死循环。 HashMap是非线程安全的,在多线程并发的情况下,put操作时可能会有两个线程同时触发rehash操作,从而导致闭合的回路。 在单线程的情况下,一个线程对HashMap的数据结构进行操作产生不了闭合的回路。...原创 2021-12-11 12:27:47 · 486 阅读 · 0 评论 -
说一说HashMap的长度为什么是2的幂次方
答:HashMap长度为2的幂次方的原因是为了减少Hash碰撞,尽量使Hash算法的结果均匀。首先看一下HashMap中putVal方法的源码其中有个( n - 1) & hash的方法,那么这个方法是干什么的呢?HashMap为了存取高效,就要尽量减少碰撞,将数据分配均匀,那么如何分配均匀,此时主要靠将数据存入到那个链表中的算法,这个算法就是( n - 1) & hash。& 是按位与运算,是一个位运算,而在计算机中位运算的效率很高,这就...原创 2021-12-10 23:11:37 · 8121 阅读 · 4 评论 -
HashMap和Hashtable的区别
目录1.从线程安全上2.从效率上3.从键值能否为空上4.从初始容量大小和扩容容量大小上5.从底层的数据结构上1.从线程安全上HashMap是非线程安全的,Hashtable是线程安全的。2.从效率上因为线程安全的问题,HashMap要比Hashtable效率高。3.从键值能否为空上HashMap的键可以有一个为空,HashTable可以有多个为空;Hashtable的键值都不能为空,否则抛出NullPointer异常。4.从初始容量大小和扩容容原创 2021-12-10 22:12:13 · 442 阅读 · 0 评论 -
说一说HashMap的底层实现
在JDK1.8以前HashMap的底层结构是数组+链表,HashMap通过key的HashCode然后通过hash方法(扰动函数)处理过的hash值,然后通过( 数组长度 - 1 ) & hash 判断当前元素存放的位置,如果当前位置已有元素,则判断该元素与要存入元素的hash值和key是否相同,如果相同直接覆盖,不同则通过拉链法解决冲突。使用扰动函数可以减少碰撞。拉链法即将数组和链表相结合。创建一个链表数组,如果遇到哈希冲突,将冲突的值加到链表中即可。在JDK1.8之后H原创 2021-12-10 21:50:14 · 215 阅读 · 0 评论 -
ArrayList和Vector的区别是什么?
Vector类上的所有方法都是同步的,可以由两个线程安全地访问一个Vector对象,一个线程访问Vector需要在同步操作上耗费大量时间。ArrayList不是同步的,在不需要考虑线程安全时建议使用ArrayList。...原创 2021-12-10 16:42:38 · 1122 阅读 · 0 评论 -
ArrayList和LinkedList的区别
目录1.从线程安全上2.从底层数据结构上3.从是否支持快速随机访问上4.从内存上5.从插入和删除效率上在头部插入时在中部插入时在尾部插入时1.从线程安全上ArrayList和LinkedList都是不同步的,即都不是线程安全的。2.从底层数据结构上ArrayList底层采用的是动态数组,LinkedList底层采用的是双向链表。3.从是否支持快速随机访问上ArrayList支持快速随机访问的方式快速获取元素对象,而LinkedList不支持。原创 2021-12-10 16:08:28 · 646 阅读 · 1 评论 -
说一说获取键盘输入的常用的两种方法
1.通过ScannerScanner scanner = new Scanner(System.in);String s = scanner.nextLine();2.通过BufferedReaderBufferedReader input = new BufferedReader(new InputStreamReader(System.in));String s = input.readLine();原创 2021-12-10 11:30:26 · 528 阅读 · 0 评论 -
面试时遇到的关于异常方面的问题
目录说一说Java里的异常和错误的区别以及常见的异常有哪些?异常处理中try - catch - finally的作用是什么?说一下哪些情况finally块不会被执行。面试体会说一说Java里的异常和错误的区别以及常见的异常有哪些?在Java中,Exception和Error都继承了Throwable类,两者都是Java异常处理的重要子类。Error是程序无法处理的错误,一般是代码运行时JVM出现的问题。Exception是程序本身可以处理的异常。Exception中又原创 2021-12-10 10:49:33 · 134 阅读 · 0 评论 -
java中所有类都继承了哪一个类?那个类有哪些常见方法?
java中所有类都有一个父类Object类。Object类中常见方法有getClass(),用于返回当前运行时对象的Class对象。hashCode(),用于返回对象的哈希码,主要使用在哈希表中。equals(),用于比较两个对象的内存地址是否相等。clone(),用于创建并返回当前对象的一份拷贝。toString(),返回类名实例的哈希码的16进制的字符串。notify(),用于唤醒一个在此对象监视器上等待的线程。notifyAll(),和notify类似,唤醒所有等待的原创 2021-12-10 10:20:35 · 1033 阅读 · 0 评论 -
说一说final关键字
final关键字主要使用在三个地方:变量、方法和类上。对于final修饰的变量,如果是基本数据类型,则其值不可改变;如果是引用数据类型,则对其初始化之后便不能让其指向另一个对象。对于final修饰的方法,不可被重写。对于final修饰的类,不可被继承,final类中的所有成员方法都会被隐式地指定为final方法。...原创 2021-12-10 10:03:55 · 74 阅读 · 0 评论