面试题(java&mysql)

一、java:

1.ArrayList和LinkedList的区别

ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 (LinkedList是双向链表,有next也有previous)对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。 对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

2.HashSet的原理

hashset是基于HashMap实现的,默认构造函数是构建一个初始容量为16,负载因子为0.75 的HashMap。封装了一个 HashMap 对象来存储所有的集合元素,所有放入 HashSet 中的集合元素实际上由 HashMap 的 key 来保存,而 HashMap 的 value 则存储了一个 PRESENT,它是一个静态的 Object 对象。

当我们试图把某个类的对象当成 HashMap的 key,或试图将这个类的对象放入 HashSet 中保存时,重写该类的equals(Object obj)方法和 hashCode() 方法很重要,而且这两个方法的返回值必须保持一致:当该类的两个的 hashCode() 返回值相同时,它们通过 equals() 方法比较也应该返回 true。通常来说,所有参与计算 hashCode() 返回值的关键属性,都应该用于作为 equals() 比较的标准。

HashSet的其他操作都是基于HashMap的。

3.Throw和Thrwos的区别

  • 抛出的东西不同:throw抛出的是具体的异常对象,而throws抛出的是抽象的异常类;
  • 使用位置不同:throw一般用在方法体中,也可用在代码块中,但是如果抛出的是检查时异常类创建的对象,则必须使用try-catch自行处理;

4.多线程的实现方式

  • 继承Thread类
    定义一个类直接继承Thread类,重写run方法即可实现多线程,但是由于java单继承的特点,那么此类不能再继承其它的类。
  • 实现Runnable接口
    通过实现runnable接口中的run方法即可实现多线程,而且不受单继承特点的限制
  • 实现Callable接口,通过FutureTask包装器创建Thread线程
    Callable接口和Runnable接口是类似的,但是需要实现的是call方法,而且从上面的代码中我们可以看到run()方法执行的任务是没有返回值的,但是call方法有返回值,可以自定义返回值的类型,这就是两个接口最大的区别。

5.sleep和wait的区别

  • 使用限制
    使用 sleep 方法可以让让当前线程休眠,时间一到当前线程继续往下执行,在任何地方都能使用,但需要捕获 InterruptedException 异常。
    而使用 wait 方法则必须放在 synchronized 块里面,同样需要捕获 InterruptedException 异常,并且需要获取对象的锁。
    而且 wait 还需要额外的方法 notify/ notifyAll 进行唤醒,它们同样需要放在 synchronized 块里面,且获取对象的锁。
    当然也可以使用带时间的 wait(long millis) 方法,时间一到,无需其他线程唤醒,也会重新竞争获取对象的锁继续执行。
  • 使用场景
    sleep 一般用于当前线程休眠,或者轮循暂停操作,wait 则多用于多线程之间的通信。
  • 所属类
    sleep 是 Thread 类的静态本地方法,wait 则是 Object 类的本地方法。
    为什么要这样设计呢?
    因为 sleep 是让当前线程休眠,不涉及到对象类,也不需要获得对象的锁,所以是线程类的方法。wait 是让获得对象锁的线程实现等待,前提是要楚获得对象的锁,所以是类的方法。
  • 释放锁
    如上代码所示,wait 可以释放当前线程对 lock 对象锁的持有,而 sleep 则不会。
  • 线程切换
    sleep 会让出 CPU 执行时间且强制上下文切换,而 wait 则不一定,wait 后可能还是有机会重新竞争到锁继续执行的。

6.常见的设计模式

  • 单例模式。
    单例模式对实例个数的控制并节约系统资源.在它的核心结构中只包含一个被称为单例类的特殊类,通过构造函数私有化和静态块以及提供对外访问的接口来实现.
    饿汉模式:单例实例在类的加载中就被创建.不需要判断,安全. 饿汉式直接创建了对象.
    懒汉模式:单例实例在第一次使用时被创建.需要if判断,不安全.懒汉式静态块中会进行判断

  • 工厂模式。
    工厂模式主要是为创建对象提供了接口。
    应用场景如下:
    (1)在编码时不能预见需要创建哪种类的实例。
    (2)系统不应依赖于产品类实例如何被创建、组合和表达的细节

  • 观察者模式。(一个学生对应多个老师,一个老师对应多个学生).
    定义了对象间一对多的依赖关系,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
    应用场景如下:
    (1)对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。
    (2)对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。

  • 迭代器模式。
    迭代器模式提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
    应用场景如下:
    当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,就应该考虑用迭代器模式。其实stl容器就是很好的迭代器模式的例子。

  • 代理模式
    为其他对象提供代理来控制对该对象的访问.
    应用场景如下:
    ngnix的反向代理(隐藏服务器)运用的就是代理模式.

  • 适配器模式
    将一类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作那些类可以一起工作。
    应用场景如下:
    别人开发的控件要用咱们的应用服务(不识别啊),这时候适配器模式起作用了.让不兼容变为兼容.

7.冒泡排序,选择排序等等

  • 冒泡排序法原理:
    对数组进行排序,冒泡排序法的原理就是将一组无序数组进行排序,同过把值较小的数逐渐向数组的顶部(即朝第一个元素)冒出来,就像水中的气泡上升一样。同时,值较大的数据逐渐向数组的底部(即朝最后一个元素)沉下去。这种算法用嵌套的循环对整个数组进行数次遍历,每次遍历都要比较数组中相邻的一对元素,如果这对元素以升序(或者值相等)的顺序排列,
    那么保持它们的位置不变;如果这对元素以降序的顺序排列,那么交换他们的值。

  • 选择排序
    选择排序是最简单直观的一种算法,每一趟从待排序的数据元素中选择最小(或最大)的一个元素作为首元素,直到所有元素排完为止,简单选择排序是不稳定排序。
    在算法实现时,每一轮确定最小元素的时候会通过不断地比较交换来使得首位置为当前最小,交换是个比较耗时的操作。其实我们很容易发现,在还未完全确定当前最小元素之前,这些交换都是无意义的。
    因此可以通过设置一个变量min,每一次比较出存储较小元素,并且记录当前元素的数组下标,当本轮循环结束之后,那这个变量min存储的就是当前最小元素的下标,此时再执行交换操作,以此确定本轮遍历的最小元素放到了数组前部。

二、算法分析

简单选择排序通过上面优化之后,无论数组原始排列如何,比较次数是不变的;对于交换操作,在最好情况下也就是数组完全有序的时候,无需任何交换移动,在最差情况下,也就是数组倒序的时候,交换次数为n-1次。综合下来,时间复杂度为O(n2)

二、mysql

1.事务的特征(ACID)

事务是并发控制的单位,是用户定义的一个操作序列。这些操作要么都做,要么都不做,是一个不可翻个的工作单位
原子性:表示操作事务内操作不可分割。要么都成功,要么都失败。
隔离性:一个事务开始后,不能受其他事务干扰。
一致性:要么都成功,要么都失败。后面的失败了要对前面的操作进行回滚。
持久性/持续性:表示事务开始了,就不能终止了。

2.数据库的优化

3.事务的隔离级别

  • Read uncommitted (读未提交):最低级别,以上问题均无法解决。
  • Read committed (读已提交):读已提交,可避免脏读情况发生。
  • Repeatable Read(可重复读):确保事务可以多次从一个字段中读取相同的值,在此事务持续期间,禁止其他事务对此字段的更新,可以避免脏读和不可重复读,仍会出现幻读问题。
  • Serializable (串行化):最严格的事务隔离级别,要求所有事务被串行执行,不能并发执行,可避免脏读、不可重复读、幻读情况的发生。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值