面试总结(四)——如涵


上次(一两周了,一直没写)去面了杭州如涵,一家网红孵化公司,公司不大,难度却不小,唯一让我感到刮目相看的是这家公司的面试官,非常nice,是一个年轻且非常和蔼,技术应该也很扎实的那种程序员,最后要走的时候还指出了我的漏洞,跟我稍微说了一下我该学习的重点。

这家公司是先笔试再面试,笔试共二十五题,Java基础只占一小部分,三成左右吧,有很多是多线程和数据库,这家公司多数据库非常看重,要求面试者必须会数据库。我下面把我觉得有价值的笔试题和面试题总结在下面。

笔试题

1. String中的intern方法做什么用的

博客

2. String和StringBuffer以及StringBuilder的区别

简单地说,String是不可变字符串,另外两个是可变字符串,StringBuffer有一个用了synchronized关键字修饰,是线程安全的,但效率也会下降,StringBuilder是线程不安全。

3. 计算一个字符串中某个字符出现的次数

我觉得创建一个HashMap,再将字符作为键,出现次数作为值存放进去。

4. 两个对象之间互相equals的话,hashcode一定相同吗?什么时候需要重写hashcode方法

两个对象相互equals,则hashcode一定相同;如果重写了equals方法,则hashcode方法也要重写,为的是保证一致性。

5. Java创建对象的四种方式

Java有5种方式来创建对象:

  • 使用 new 关键字(最常用):
        ObjectName obj = new ObjectName();
  • 使用反射的Class类的newInstance()方法:
        ObjectName obj = ObjectName.class.newInstance();
  • 使用反射的Constructor类的newInstance()方法:
        ObjectName obj = ObjectName.class.getConstructor.newInstance();
  • 使用对象克隆clone()方法:
        ObjectName obj = obj.clone();
  • 使用反序列化(ObjectInputStream)的readObject()方法:
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FILE_NAME))) {

            ObjectName obj = ois.readObject();

        }

引用自博客

6. Collection,set,list,map这哪些集合类的接口以及区别

老生常谈,必会的问题。

7. 什么是TreadLocal

ThreadLocal的实例代表了一个线程局部的变量,每条线程都只能看到自己的值,并不会意识到其它的线程中也存在该变量。

它采用采用空间来换取时间的方式,解决多线程中相同变量的访问冲突问题。

8. 什么是线程安全,并介绍哪些集合类是线程安全的

线程安全指的是,在堆内存中的数据由于可以被任何线程访问到,在没有限制的情况下存在被意外修改的风险。即堆内存空间在没有保护机制的情况下,对多线程来说是不安全的地方,因为你放进去的数据,可能被别的线程“破坏”。

HashTable,Vector,ConcurrentHashMap……

9. Java中CyclicBarrier和CountDownLatch有什么不同

网上搜到的资料
CyclicBarrier和CountDownLatch 都位于java.util.concurrent 这个包下,用于多线程。

CountDownLatchCyclicBarrier
减计数方式加计数方式
计算为0时释放所有等待的线程计数达到指定值时释放所有等待线程
计数为0时,无法重置计数达到指定值时,计数置为0重新开始
调用countDown()方法计数减一,调用await()方法只进行阻塞,对计数没任何影响调用await()方法计数加1,若加1后的值不等于构造方法的值,则线程阻塞
不可重复利用可重复利用

10. Java中堆和栈有什么区别

堆:主要用于存储实例化的对象,数组。由JVM动态分配内存空间。一个JVM只有一个堆内存,线程是可以共享数据的。

栈:主要用于存储局部变量和对象的引用变量,每个线程都会有一个独立的栈空间,所以线程之间是不共享数据的。
详细的看这里

11. 什么是线程池,常用的线程池有哪些

《核心技术》上这样说,“构建一个新的线程是有一定代价的,因为涉及与操作系统的交互。如果程序中创建了大量的生命期很短的线程,应该使用线程池(thread pool)。”线程池就是首先创建一些线程,它们的集合称为线程池。使用线程池可以很好地提高性能,线程池在系统启动时即创建大量空闲的线程,程序将一个任务传给线程池,线程池就会启动一条线程来执行这个任务,执行结束以后,该线程并不会死亡,而是再次返回线程池中成为空闲状态,等待执行下一个任务。

  1. newFixedThreadPool 定长线程池
    一个有指定的线程数的线程池,有核心的线程,里面有固定的线程数量,响应的速度快。正规的并发线程,多用于服务器。固定的线程数由系统资源设置。核心线程是没有超时机制的,队列大小没有限制,除非线程池关闭了核心线程才会被回收。
  2. newCachedThreadPool 可缓冲线程池
    只有非核心线程,最大线程数很大,每新来一个任务,当没有空余线程的时候就会重新创建一个线程,这边有一个超时机制,当空闲的线程超过60s内没有用到的话,就会被回收,它可以一定程序减少频繁创建/销毁线程,减少系统开销,适用于执行时间短并且数量多的任务场景。
  3. newScheduledThreadPool 周期线程池
    创建一个定长线程池,支持定时及周期性任务执行,通过过schedule方法可以设置任务的周期执行
  4. newSingleThreadExecutor 单任务线程池
    创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行,每次任务到来后都会进入阻塞队列,然后按指定顺序执行。

12. RuntimeException和Exception区别,并写出至少5个RuntimeException

RuntimeException是Exception的子类,关系如下图
在这里插入图片描述
常见的RuntimeException:

  • ArithmeticException(算术异常)

  • ClassNotFoundException(类没找到时,抛出该异常)

  • FileNotFoundException(文件未找到异常)

  • SQLException(操作数据库异常)

  • NullPointerException(空指针异常)

13. 简要介绍两到三种Java日志框架

14. 简要介列出你工作中用到的设计模式

引用这篇文章

面试题

1. Memcached和Redis的区别

这个问题前面已经总结过好几次了,这里就不再赘述了。

2. solr怎么去建立索引,用的是哪个分词器

倒排索引,IK分词器

3. JVM的内存模型

这个问题也在之前的文章里总结过了,不多说。

4. JDK从1.7到1.8JVM有什么区别

元数据区取代了原来的永久代。

5. 枚举类能不能被继承

不能,看这里

6. 重载和重写

一样不再多说。

7. 如何去设计一个秒杀系统(秒杀避免超卖)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值