java多线程、集合和IO面试题_02

简介: java多线程、集合和IO面试题_02 ============================================================================= 逻辑思考题: 1:你有一桶果冻,其中有黄色、绿色、红色三种,闭上眼睛抓取同种颜色的两个。

java多线程、集合和IO面试题_02

=============================================================================
逻辑思考题:

1:你有一桶果冻,其中有黄色、绿色、红色三种,闭上眼睛抓取同种颜色的两个。抓取多少个就可以确定你肯定有两个同一颜色的果冻?
    4个
-----------------------------------------------------------------------------
2:如果你有无穷多的水,一个3公升的提捅,一个5公升的提捅,两只提捅形状上下都不均匀,问你如何才能准确称出4公升的水?
    5-3+5-3
    3+3+3-5
-----------------------------------------------------------------------------
3:有8个颜色,大小一样的小球,其中的一个质量和比其他的重,给你一个天平,你最少几次就可以称出那个重的球。(不要想着自己用手拿)
    2次
    
    先分成三份3个、3个、2个,
    称3个、3个,
    若重的在其中一份,再分成三份1个、1个、1个;
    称1个、1个,若重的在其中一份,就称出了。
    若重的不在其中,那剩余的1个就是重的。
    若称的3个相等,说明在2个里面。
    
    思想:更多可能的利用推理。
=============================================================================
面试题:

1:请介绍一下自己(2-3分钟)
    姓名、家乡。
    经验(项目经验)和能力(自学能力)。
    态度:对编程有兴趣
    兴趣爱好:可提可不提
-----------------------------------------------------------------------------
2:你有男/女朋友吗?你结婚了吗?
    稳定性
    精力,加班,出差。
    你家庭和睦吗?
-----------------------------------------------------------------------------
3:你有什么要问的吗?
    对公司一定要有了解。(太偏僻的公司女同学就不要去了)
    公司的前景、业务方向。
    谈钱不伤感情。(心里有个底线6000,开口7000)
=============================================================================
面试题:

多线程:

1:多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?
    两种。
    
    继承Thread类
    实现Runnable接口
    
    两种。
  
    同步代码块
    同步方法(静态同步方法)
-----------------------------------------------------------------------------
2:启动一个线程是用run()还是start()?
    start();
    
    run():封装了被线程执行的代码,直接调用仅仅是普通方法的调用。
    start():启动线程,并由JVM自动调用run()方法。
-----------------------------------------------------------------------------
3:sleep() 和 wait() 有什么区别?
    sleep():必须指定时间,不释放锁。
            是Thread类中的一个方法,用于线程休眠,休眠时间结束后,该线程可以自动唤醒。
    wait():可以不指定时间,也可以指定时间,并立即释放锁。
            是Object类中的一个方法,用于线程等待,如果想要唤醒,必须使用notify()或notifyAll()(不能自动唤醒)。
-----------------------------------------------------------------------------
4:线程的基本概念及线程的生命周期
    线程:是进程(程序)的执行单元,执行路径。
    
    新建-->就绪-->运行-->死亡
    新建-->就绪-->运行-->阻塞-->就绪-->运行-->死亡
-----------------------------------------------------------------------------

集合:

1: HashMap和Hashtable的区别。
    历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java1.2引进的Map接口的一个实现。
    同步性:Hashtable是线程安全的,也就是说是同步的;而HashMap是线程序不安全的,不是同步的。
    值:只有HashMap可以让你将空值作为一个表的条目的key或value。
HashMap类和Hashtable类的区别注意:Hashtable的第二个单词是小写,继承了老版本jdk1.0的命名错误,如同System类下的静态方法Arraycopy()一样)
    HashMap类:不同步,线程不安全,效率高。允许null键和null值。
    Hashtable类:同步,线程安全,效率低。不允许null键和null值。
    其实HashMap类就是用来替代Hashtable类的。如同ArrayList类用来替代Vector类一样。

Hashtable是线程安全的,而且名字没有按照驼峰格式命名。Hashtable虽然是线程安全的,但是效率比较低。
HashMap是非线程安全的,在多线程修改的时候,会出现异常或者是死循环。

补充掌握的知识点
    java.util.concurrent.ConcurrentHashMap<K,V>
    ConcurrentHashMap类的特点:Hashtable的线程安全 + HashMap的高性能

    只针对需要修改的数据进行加锁(Hashtable线程安全的体现)
    对其它不需要修改的数据不添加锁,可以直接获取(HashMap高性能的体现)

举例理解:
    游乐场某一项项目需要维护,这个时候只针对需要维护的这个项目加锁,
    而其它无需维护的项目仍然对外开放(即不加锁),而不是一个项目需要维护就必须关掉整个游乐场。
-----------------------------------------------------------------------------
2:ArrayList和Vector的区别。 
    同步性:Vector是线程安全的,也就是说是同步的;而ArrayList是线程序不安全的,不是同步的。
    数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半。
-----------------------------------------------------------------------------
3:Collection和Collections的区别。
    Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。 
    Collection是个java.util下的接口,它是各种集合结构的父接口,有两个子接口List和Set。
-----------------------------------------------------------------------------
4:List、Set、Map是否继承自Collection接口?
    List、Set不是继承自Map接口,它们继承自Collection接口。
   Map接口本身就是一个顶层接口。
-----------------------------------------------------------------------------
5:说出ArrayList、Vector、LinkedList的存储性能和特性?
    ArrayList
        底层数据结构是数组,查询快,增删慢。
        线程不安全,效率高。
    Vector
        底层数据结构是数组,查询快,增删慢。
        线程安全,效率低。
    LinkedList
        底层数据结构是链表,查询慢,增删快。
        线程不安全,效率高。
-----------------------------------------------------------------------------
6:你所知道的集合类都有哪些?主要方法?
    ArrayList,LinkedList,HashSet,HashMap  
    
    Collection(接口):
        add()
        remove()
        contains()
        iterator()
        size()
        遍历:
            增强for
            迭代器
            
        |--List
            get()
            遍历:
                普通for
        |--Set
---------------------------------------    
    Map(接口):
        put()
        remove()
        containskey(),containsValue()
        keySet()
        value()
        get()
        entrySet()
        size()
        遍历:
            根据键找值。
            根据键值对对象分别找键和值。
-----------------------------------------------------------------------------

IO:

1: java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
    字节流,字符流。
    字节流继承于InputStream、OutputStream,
    字符流继承于Reader、Writer。
    在java.io包中还有许多其他的流,主要是为了提高性能和使用方便。
-----------------------------------------------------------------------------
2:什么是java序列化,如何实现java序列化?
    
    可以把对象写入文本文件或者在网络中传输。
    
    如何实现序列化呢?
        让被序列化的对象所属的类实现序列化接口。
        该接口是一个标记接口。没有方法需要实现。
=============================================================================

 

我的GitHub地址: https://github.com/heizemingjun
我的博客园地址: http://www.cnblogs.com/chenmingjun
我的蚂蚁笔记博客地址: http://blog.leanote.com/chenmingjun
Copyright ©2018 黑泽明军
【转载文章务必保留出处和署名,谢谢!】
相关文章
|
2月前
|
存储 监控 Java
【Java并发】【线程池】带你从0-1入门线程池
欢迎来到我的技术博客!我是一名热爱编程的开发者,梦想是编写高端CRUD应用。2025年我正在沉淀中,博客更新速度加快,期待与你一起成长。 线程池是一种复用线程资源的机制,通过预先创建一定数量的线程并管理其生命周期,避免频繁创建/销毁线程带来的性能开销。它解决了线程创建成本高、资源耗尽风险、响应速度慢和任务执行缺乏管理等问题。
213 60
【Java并发】【线程池】带你从0-1入门线程池
|
20天前
|
Java 中间件 调度
【源码】【Java并发】从InheritableThreadLocal和TTL源码的角度来看父子线程传递
本文涉及InheritableThreadLocal和TTL,从源码的角度,分别分析它们是怎么实现父子线程传递的。建议先了解ThreadLocal。
56 4
【源码】【Java并发】从InheritableThreadLocal和TTL源码的角度来看父子线程传递
|
1月前
|
缓存 安全 Java
java面试-基础语法与面向对象
本文介绍了 Java 编程中的几个核心概念。首先,详细区分了方法重载与重写的定义、发生阶段及规则;其次,分析了 `==` 与 `equals` 的区别,强调了基本类型和引用类型的比较方式;接着,对比了 `String`、`StringBuilder` 和 `StringBuffer` 的特性,包括线程安全性和性能差异;最后,讲解了 Java 异常机制,包括自定义异常的实现以及常见非检查异常的类型。这些内容对理解 Java 面向对象编程和实际开发问题解决具有重要意义。
57 15
|
1月前
|
存储 网络协议 安全
Java网络编程,多线程,IO流综合小项目一一ChatBoxes
**项目介绍**:本项目实现了一个基于TCP协议的C/S架构控制台聊天室,支持局域网内多客户端同时聊天。用户需注册并登录,用户名唯一,密码格式为字母开头加纯数字。登录后可实时聊天,服务端负责验证用户信息并转发消息。 **项目亮点**: - **C/S架构**:客户端与服务端通过TCP连接通信。 - **多线程**:采用多线程处理多个客户端的并发请求,确保实时交互。 - **IO流**:使用BufferedReader和BufferedWriter进行数据传输,确保高效稳定的通信。 - **线程安全**:通过同步代码块和锁机制保证共享数据的安全性。
99 23
|
26天前
|
数据采集 存储 网络协议
Java HttpClient 多线程爬虫优化方案
Java HttpClient 多线程爬虫优化方案
|
1月前
|
Java 调度
【源码】【Java并发】【线程池】邀请您从0-1阅读ThreadPoolExecutor源码
当我们创建一个`ThreadPoolExecutor`的时候,你是否会好奇🤔,它到底发生了什么?比如:我传的拒绝策略、线程工厂是啥时候被使用的? 核心线程数是个啥?最大线程数和它又有什么关系?线程池,它是怎么调度,我们传入的线程?...不要着急,小手手点上关注、点赞、收藏。主播马上从源码的角度带你们探索神秘线程池的世界...
158 0
【源码】【Java并发】【线程池】邀请您从0-1阅读ThreadPoolExecutor源码
|
2月前
|
Java 程序员 开发者
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
189 14
|
2月前
|
安全 Java 程序员
Java 面试必问!线程构造方法和静态块的执行线程到底是谁?
大家好,我是小米。今天聊聊Java多线程面试题:线程类的构造方法和静态块是由哪个线程调用的?构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节有助于掌握Java多线程机制。下期再见! 简介: 本文通过一个常见的Java多线程面试题,详细讲解了线程类的构造方法和静态块是由哪个线程调用的。构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节对掌握Java多线程编程至关重要。
80 13
|
2月前
|
安全 Java 开发者
【JAVA】封装多线程原理
Java 中的多线程封装旨在简化使用、提高安全性和增强可维护性。通过抽象和隐藏底层细节,提供简洁接口。常见封装方式包括基于 Runnable 和 Callable 接口的任务封装,以及线程池的封装。Runnable 适用于无返回值任务,Callable 支持有返回值任务。线程池(如 ExecutorService)则用于管理和复用线程,减少性能开销。示例代码展示了如何实现这些封装,使多线程编程更加高效和安全。
|
3月前
|
Java 程序员 调度
Java 高级面试技巧:yield() 与 sleep() 方法的使用场景和区别
本文详细解析了 Java 中 `Thread` 类的 `yield()` 和 `sleep()` 方法,解释了它们的作用、区别及为什么是静态方法。`yield()` 让当前线程释放 CPU 时间片,给其他同等优先级线程运行机会,但不保证暂停;`sleep()` 则让线程进入休眠状态,指定时间后继续执行。两者都是静态方法,因为它们影响线程调度机制而非单一线程行为。这些知识点在面试中常被提及,掌握它们有助于更好地应对多线程编程问题。
154 9

热门文章

最新文章

下一篇
oss创建bucket