- 博客(143)
- 收藏
- 关注
原创 20240122面试练习题10
跳表是一个随机化的数据结构,实质就是一种可以进行二分查找的有序链表。跳表在原有的有序链表上面增加了多级索引,通过索引来实现快速查找。跳表不仅能提高搜索性能,同时也可以提高插入和删除操作的性能。
2024-01-25 17:44:51
1557
原创 20240119面试练习题9
事务是一系列操作的集合,这些操作要么都做,要么都不做,是一个不可分割的工作单位,是数据库环境中的最小工作单元。事务包含了一组操作,这些操作可以是可以是一条SQL语句、一组SQL语句或整个程序。如果其中一个操作不成功,这些操作就都不会执行,前面执行的操作也会回滚原状态,保证了数据的一致性和完整性。如:银行的转账,张三给李四转账,只有当张三账户的钱转走了,并且李四账户的钱收到了之后转账事务才能提交。否则,如果张三账户钱转走了,在李四还没收到钱之前忽然断电或者断网了,本次转账就不会成功。
2024-01-22 10:38:16
979
原创 20240117面试练习题7
第一范式(1NF):每个列都不可以再拆分。第二范式(2NF):在第一范式的基础上消除非主键对主键的部分依赖。第三范式(3NF):在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键。为什么遵循三范式:减少数据冗余: 避免同一数据在多个地方重复存储,节省存储空间,减少数据一致性维护的复杂度。提高数据完整性: 通过外键约束来维护不同数据表之间的一致性,确保数据库的引用完整性。简化数据维护: 更新、删除操作更简单,因为数据不重复,更新单个记录即可。
2024-01-20 15:43:13
965
原创 20240116面试练习题6
在多线程编程中,为了保证数据的一致性和线程安全,锁是必不可少的工具。锁可以分为两大类:乐观锁和悲观锁。乐观锁假设多个线程之间很少会发生冲突,因此在读取数据时不会加锁,而在更新数据时会检查是否有其他线程修改了数据。如果没有冲突,就执行更新操作;如果有冲突,则进行相应的处理。悲观锁则相反,它假设多个线程之间经常会发生冲突,因此在读取数据时会加锁,防止其他线程修改数据,直到操作完成后才释放锁。乐观锁的实现方式有很多种,其中比较常见的有版本号和CAS(比较并交换)机制。
2024-01-19 16:18:36
908
原创 20240115面试练习题5
在 Java 编程中内存分为两种类型:工作内存和主内存,而工作内存使用的是 CPU 寄存器实现的,而主内存是指电脑中的内存,我们知道 CPU 寄存器的操作速度是远大于内存的操作速度的。在 Java 语言中,为了提高程序的执行速度,所以在操作变量时,会将变量从主内存中复制一份到工作内存(为了效率更快),而主内存是所有线程共用的,工作内存是每个线程私有的,这就会导致一个线程已经把主内存中的公共变量修改了,而另一个线程不知道,依旧使用自己工作内存中的变量,这样就导致了问题的产生,也就导致了线程安全问题。
2024-01-18 16:21:34
836
原创 20240113面试练习题4
例如,存在一个对象 u 持有 ID 和 NAME 两个字段,假如写入线程在写对象的过程中,只完成了对 ID 的赋值,但没来得及为 NAME 赋值,就被 stop() 导致锁被释放,那么当读取线程得到锁之后再去读取对象 u 的 ID 和 Name 时,就会出现数据不一致的问题。如果队列也已满,则会去创建一个新线程来出来这个处理。设想这样一种场景,我们需要一个线程池,并且对于线程池中的线程对象,赋予统一的线程优先级、统一的名称、甚至进行统一的业务处理或和业务方面的初始化工作,这时工厂方法就是最好用的方法了。
2024-01-15 15:29:17
1039
原创 20240111面试练习题3
加载因子就是表示Hash表中元素的填满程度。加载因子 = 填入表中的元素个数 / 散列表的长度加载因子越大,填满的元素越多,空间利用率越高,但发生冲突的机会变大了;加载因子越小,填满的元素越少,冲突发生的机会减小,但空间浪费了更多了,而且还会提高扩容rehash操作的次数。默认的负载因子(0.75)在时间和空间成本之间提供了很好的权衡。更高的值减少了空间开销,但增加了查找成本(反映在HashMap类的大多数操作中,包括get和put)。
2024-01-14 15:20:42
1365
原创 2023.08.15作业五十题
不相等,float是32位的单精度,double是64位双精度,精度越大表示的小数越精确注:回文数即正反读都是一个数,5位数的话,只要个位与万位相同,十位与千位相同就是一个回文数。i
2023-08-15 16:06:01
1384
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人