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 黑泽明军
【转载文章务必保留出处和署名,谢谢!】
相关文章
|
15小时前
|
安全 Java 调度
深入理解Java并发编程:线程安全与性能优化
【5月更文挑战第12天】 在现代软件开发中,多线程编程是提升应用程序性能和响应能力的关键手段之一。特别是在Java语言中,由于其内置的跨平台线程支持,开发者可以轻松地创建和管理线程。然而,随之而来的并发问题也不容小觑。本文将探讨Java并发编程的核心概念,包括线程安全策略、锁机制以及性能优化技巧。通过实例分析与性能比较,我们旨在为读者提供一套既确保线程安全又兼顾性能的编程指导。
|
15小时前
|
Java 程序员 调度
Java中的多线程编程:从理论到实践
【5月更文挑战第14天】在现代计算机技术中,多线程编程是一个重要的概念。它允许多个线程并行执行,从而提高程序的运行效率。本文将从理论和实践两个角度深入探讨Java中的多线程编程,包括线程的基本概念、创建和控制线程的方法,以及如何处理线程同步和通信问题。
|
15小时前
|
Java
Java中的多线程编程:基础知识与实践
【5月更文挑战第13天】在计算机科学中,多线程是一种使得程序可以同时执行多个任务的技术。在Java语言中,多线程的实现主要依赖于java.lang.Thread类和java.lang.Runnable接口。本文将深入探讨Java中的多线程编程,包括其基本概念、实现方法以及一些常见的问题和解决方案。
|
15小时前
|
安全 算法 Java
深入理解Java并发编程:线程安全与性能优化
【5月更文挑战第13天】 在Java开发中,并发编程是一个复杂且重要的领域。它不仅关系到程序的线程安全性,也直接影响到系统的性能表现。本文将探讨Java并发编程的核心概念,包括线程同步机制、锁优化技术以及如何平衡线程安全和性能。通过分析具体案例,我们将提供实用的编程技巧和最佳实践,帮助开发者在确保线程安全的同时,提升应用性能。
10 1
|
15小时前
|
Java 调度
Java一分钟之线程池:ExecutorService与Future
【5月更文挑战第12天】Java并发编程中,`ExecutorService`和`Future`是关键组件,简化多线程并提供异步执行能力。`ExecutorService`是线程池接口,用于提交任务到线程池,如`ThreadPoolExecutor`和`ScheduledThreadPoolExecutor`。通过`submit()`提交任务并返回`Future`对象,可检查任务状态、获取结果或取消任务。注意处理`ExecutionException`和避免无限等待。实战示例展示了如何异步执行任务并获取结果。理解这些概念对提升并发性能至关重要。
17 5
|
15小时前
|
存储 缓存 安全
Java 中 IO 流、File文件
Java 中 IO 流、File文件
|
15小时前
|
Java Unix Windows
|
15小时前
|
监控 Java
Java一分钟之-NIO:非阻塞IO操作
【5月更文挑战第14天】Java的NIO(New IO)解决了传统BIO在高并发下的低效问题,通过非阻塞方式提高性能。NIO涉及复杂的选择器和缓冲区管理,易出现线程、内存和中断处理的误区。要避免这些问题,可以使用如Netty的NIO库,谨慎设计并发策略,并建立标准异常处理。示例展示了简单NIO服务器,接收连接并发送欢迎消息。理解NIO工作原理和最佳实践,有助于构建高效网络应用。
8 2
|
15小时前
|
Java 开发者
Java一分钟之-Java IO流:文件读写基础
【5月更文挑战第10天】本文介绍了Java IO流在文件读写中的应用,包括`FileInputStream`和`FileOutputStream`用于字节流操作,`BufferedReader`和`PrintWriter`用于字符流。通过代码示例展示了如何读取和写入文件,强调了常见问题如未关闭流、文件路径、编码、权限和异常处理,并提供了追加写入与读取的示例。理解这些基础知识和注意事项能帮助开发者编写更可靠的程序。
17 0
|
15小时前
|
存储 缓存 Java
Java IO 流详解
Java IO 流详解
17 1