java基础面试题-----集合/线程/IO流详细版

一、集合

  1. 集合是什么?
    答:集合可以看作是一个容器,例如:java类的书可以看作是一个集合;联想品牌的电脑也可以看作是一个集合;也就是分类存放的一个容器。对于集合中的对象可以很方便的存入和取出,还可以按照一定的顺序进行摆放。java中提供了不同的集合类,这些类具有不同的存储对象的方式,并提供了相应的方法以方便用户对集合进行遍历、添加、删除以及查找指定的对象。java集合类存放于java.util包中。

  2. 常用的集合有哪些?
    答:常用的集合有List、Set集合(Map是映射.现在一部分人认为是集合,一部分人认为它不是);
    其中List和Set继承了Collection接口,各接口还提供了不同的实现类;下图是集合类的继承关系图,便于更好理解
    在这里插入图片描述
    Collection接口的常用方法:
    Iterator:迭代器.它是java集合的顶层接口(不包括map系列);用于遍历集合对象
    next():返回迭代器刚越过的元素的引用,返回值是 Object,需要强制转换成自己需要的类型
    remove():将指定对象从该集合移除
    size():返回int类型,获取该集合中元素的个数(数据的数量)
    isEmpty():返回boolean值,判断当前集合是否是空
    add():添加数据
    List集合常用方法: 包含Collection接口的所有方法--------(list集合中允许元素重复,元素顺序就是对象插入的顺序)
    get():获取指定索引位置的元素
    set():将集合中指定索引位置的对象修改为指定的对象
    实现类:
    ArrayList:底层数据结构是数组,查询快,增删慢;线程不安全,效率高
    案例: List list1 = new ArrayList();
    LinkedList:底层数据结构是链表,查询慢,增删快;线程不安全,效率高
    案例: List list2 = new LinkedList();
    **Set集合:**包含Collection接口的所有方法--------------------- (set集合中不能包含重复的对象.不按特定的方式排序)
    实现类:
    HashSet:由哈希表支持.不保证set的迭代顺序,特别是不保证该顺序恒久的不变.此类允许使用null元素;
    TreeSet:不仅实现了set接口,还实现了java.util.sortedset接口,在遍历集合时按照自然顺序递增排序,也可以按比较器递增排序.
    TreeSet类增加的方法:
    first():返回当前第一个(最低)元素
    last():返回当前最后一个(最高)元素
    comparator():返回排序的比较器.如果是自然顺序,则返回null
    headSet():返回一个新的集合,新集合是toElement(不包含)之前所有对象
    subSet():返回一个新集合,是fromElement(包含于不包含)对象之间的所有对象
    tailSet():返回新对象,是fromElement(包含)之后的所有对象

        **Map集合:**提供了将key映射到值得对象.key-value 的键值对,key 不允许重复,value 可以. 不能进行遍历.
        map接口中常用的方法:
                       put(key,value):添加指定的key和value的映射关系
                       containsKey(object key):如果此映射包含指定key的映射关系,则返回true
                       containsValue(object value):如果此映射将一个或者多个key映射到指定值,则返回true
                       get(object key):如果key存在,则返回对应的值,否则返回null
                       keySet():返回所有key对象形成的set集合
                       values():返回所有的值对象形成的Collection集合
       map实现类:
                        HashMap:一般使用hashmap类来实现map集合.因为添加和删除映射关系效率高.通过哈希码对内部映射关系进行快速查找;并允许使用null值和null键,但必须保证键的唯一性.不保证顺序
                        TreeMap:如果希望map集合中的对象存在一定的顺序,使用Treemap;不能使用null;      
    
  3. 集合类与数组的区别?
    答:数组的长度是固定的,集合的长度是可变的;
    数组用来存放基本类型的数据,集合用来存放对象的引用;

  4. 集合注意事项?
    答:(1)集合只能存放对象。比如:存了一个int类型的5放入集合中,它会自动转换成Integer类后存入的,java中每种基本类型都有对应的引用类型.
    (2) 集合存放的是多个对象的引用,对象本身还是放在堆内存中.
    (3) 集合可以存放不同类型,不限数量的数据类型.

二、线程

  1. 线程是什么?为什么使用线程?
    操作系统中,并行执行的任务叫进程;而在进程内部,并行执行的任务叫线程;
    使用线程的好处:
    (1)并行执行任务,提高效率;(生活中很多这样的例子;比如同时下载很多文件)
    (2)阻塞的代码与其他代码并行,避免影响其他代码的执行;
  2. 线程创建的2种方式?
    继承Thread //线程
    实现Runnable //可运行状态,就绪状态
  3. 线程的方法:
    Thread.currentThread() //获得正在执行的线程
    Thread.sleep(毫秒时长) //暂停指定的毫秒时长
    getName() //获取名字
    setName(线程名) //设置名字
    start() //开始,启动
    interrupt() //打断指定线程的暂停状态,被打断的线程,会出现InterruptedException
    join() //当前线程暂停,等待被调用的线程结束
    getPriority() //获取调度的优先级
    setPriority(优先级) //优先级1到10,默认5
    setDaemon(true) //把线程设置成后台线程、守护线程,虚拟机等待所有前台线程结束后,自动退出,而不会等待后台线程结束
  4. 线程的生命周期?
    新生(new)-----可执行(start)------执行(执行后有3种情况:等待/休眠/阻塞)-------消亡(run())结束
  5. 什么是线程安全?这么预防线程安全?
    线程安全是确保程序能够正确实现业务,确保不出错.现实生活中使用多线程的情况很多,例如火车售票系统.假如这时就剩一张票,但同时有2个人在购买.系统同时执行了售出操作,这时候就会产生负数,违背了实际的业务逻辑,导致出现错误.所以说线程安全是很重要的.
    如何进行预防呢?
    (1)线程同步(加锁)
    (2)原子性—一个操作(有可能包含有多个子操作)要么全部执行(生效),要么全部都不执行(都不生效)。
    (3)可见性—当多个线程并发访问共享变量时,一个线程对共享变量的修改,其它线程能够立即看到。
    (4)顺序性—程序执行的顺序按照代码的先后顺序执行。
  6. 线程同步
    Java中任何对象,都有一个同步锁;多个线程如果争夺同一个对象的锁;获得锁的线程可以执行;得不到锁的线程等待;
    (1)synchronized
    执行到synchronized同步代码块时,必须先获得锁才能执行
    synchronized(对象) {

    }
    (2)synchronized方法
    synchronized void f() {
    } //需要当前对象的锁
    static synchronized void f() {
    } //需要“类对象”的锁
    synchronized为了保证多线程共享数据的安全(线程安全),要降低效率
  7. 多线程的理解?
    可以在程序中执行多个线程,每一个线程完成一个功能,并与其它线程并发执行,这个机制被称为多线程;
    也可以理解为: 当程序同时完成多件事情时,就是所谓的多线程;

三、IO流

  1. 流的概述:
    流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。
  2. 流的种类:2种
    输入流:字节输入流—InputStream、字符输入流—Reader ; 读取磁盘文件数据,读入到内存,进行运算处理
    输出流:字节输出流—OutputStream、字符输出流—Writer ; 内存数据输出保存到磁盘文件
  3. 字节流和字符流的区别:
    读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。
    处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。
    字节流:一次读入或读出是8位二进制。
    字符流:一次读入或读出是16位二进制。
    只要是处理纯文本数据,就优先考虑使用字符流。 除此之外都使用字节流
  4. File类:
    File类是java.io包中唯一代表磁盘文件本身的对象,可以实现创建、删除、重命名文件等操作。主要用来读取文件本身的一些信息,如文件所在目录、文件长度、文件读写权限等。
    文件、文件夹属性方法:
    length() //字节量,对文件夹无效
    exists() //判断路径是否存在
    getName() //获得文件名
    getAbsolutePath() //完整路径
    getParrent() //父目录
    lastModified() //最后修改时间毫秒值
    创建、删除方法:
    createNewFile() //创建文件,如果文件存在,返回false,如果文件夹不存在,会出现异常
    mkdirs() //新建多层文件夹
    delete() //删除文件、或删除空文件夹
    File.createTempFile() //再系统的临时目录中,创建临时文件
    文件列表方法:
    list() //得到文件名称数组 String[]
    listFiles() //得到File对象数组 File[]
  5. 高级流,操作流:
    与其他流相接,来提共特定的数据处理功能
    对高级流的操作,会对相接的流,执行相同操作
  6. 常见的IO包:
    File //文件流
    InputStream/OutputStream //父类的字节输入输出流
    FileInputStream/FileOutputStream //文件节点流
    BufferedInputStream/BufferedOutputStream //缓冲流,增加缓冲功能,避免频繁读写硬盘
    ObjectInputStream/ObjectOutputStream //对象输入输出流
    PrintStream //字节打印流
    Reader/Writer //字符输入和输出流
    IntputStreamReader/OutputStreamWriter //转换流,实现从字节流到字符流的转换
    BufferedReader //字符缓冲流
    PrintWriter

猜你喜欢

转载自blog.csdn.net/weixin_44458228/article/details/86649406