不全的面试题

基础

1.jsp内置对象

  1. request 封装客户端的请求,其中包含来自GET或POST请求的参数 作用域 一次请求
  2. response 封装服务器对客户端的响应 作用域 只在jsp界面有效
  3. session 封装用户会话的对象 作用域 一次会话 直到关闭浏览器
  4. application 封装服务器运行环境的对象; 生命周期很长 类似全局变量
  5. out 输出服务器响应的输出流对象;可以对数据缓冲区进行操作 输出完毕后 积极地及时关闭输出流
  6. pageContext 通过该对象可以获取其他对象, pageContext对象是容器完成的
  7. config Web应用的配置对象;
  8. page JSP页面本身(相当于Java程序中的this)
  9. exception 封装页面抛出异常的对象 只有在**isErrorPage= true** 的页面才可以被使用

2.==和equals的区别

==判读对象的地址是否相同基本数据类型比较的是值 引用数据类型比较的是内存地址

equals分两种情况 如果没有覆盖的话 和 双等于无异 如果覆盖了的话,的就是两个对象的内容

3.final

  1. final修饰的类不可被继承
  2. final修饰的方法可以被继承,不可被重写
  3. final修饰的变量 不可被改变

4.JDK 常用包

  1. java.lang :系统基础类
  2. java.io :所有输入输出相关的类,文件操作等
  3. java.nio:为了完善io包中的功能,提高io包中性能而写的一个新包
  4. java.net :这个是和网络有关的类
  5. java.util :这个是系统的辅助类,特别是集合类
  6. java.sql :这个是数据库操作类

5.Files的常用方法

  • Files.exist() :检测文件路径是否存在
  • Files.createFile() :创建文件
  • Files.createDirectory():创建文件夹
  • Files.delete() :删除文件或者目录
  • Files.copy():复制文件
  • Files.move():移动文件
  • Files.size():查看文件个数
  • Files.read():读取文件
  • Files.write():写入文件

6.BIO,NIO,AIO有什么区别

  • BIO:Block IO同步阻塞式IO,就是平时常用的传统IO,特点是模式简单使用方便并发处理能力低
  • NIO:New IO同步非阻塞IO传统的升级版客户端服务器端通过Channel**(通道)通讯**,实现了多路复用
  • AIO:Asynchronous IO ,NIO的升级版,实现了异步非阻塞IO,异步 IO 的操作基于事件和回调机制

String

1.String类的常用方法

  1. indexOf():返回指定字符的索引
  2. charAt():返回指定索引处的字符
  3. replace():字符串替换
  4. trim():去除字符串两端空白
  5. split():分割字符串,返回一个分割后的字符串数组
  6. getBytes():返回字符串的byte类型数组
  7. length():返回字符串长度
  8. toLowerCase():将字符串转成小写字母
  9. toUpperCase():将字符串转成大写字符
  10. substring():截取字符串
  11. equals():字符串比较

2.String和StringBuffer、StringBuilder的总结

  • String:适用于操作少量数据
  • StringBuilder:单线程操作字符串缓冲区 操作大量数据
  • StringBuffer:多线程操作字符串缓冲区 操作大量数据

3.字符串反转

使用StringBuilder或者StringBuffer的==reverse==方法

反射

1.什么是反射

java反核机制是在运行状态中,对于任意一个类,都能够知道这个类的所有方法和属性,对于任意一个对象,都能够调用他的任意一个方法和属性,这种动态获取的信息以及动态调用对象的方法的功能称之为java语言的反射机制

  • 静态编译在编译时却行类型,绑定对象
  • 动态编译运行时确定类型,绑定对象

2.反射机制的优缺点

  • 优点:运行期类型的判断动态加载类提高代码的灵活度
  • 缺点: 性能瓶颈,反射相当于一系列解释操作,通知JVM要做的事情,性能比直接的java代码要慢很多

3.反射机制应用的场景

  1. JDBC连接数据库使用的**Class.forName()**就是通过反射加载数据库驱动
  2. Spring框架最经典的就是xml配置模式,Spring通过XML配置模式装在Bean的过程
    1. 将程序中所有的XML或者Properties配置文件家载入内存中
    2. Java类里面解析xml或peopertis里面的内容得到对应实体类的字节码字符串以及相关的属性信息
    3. 使用反射机制,根据这个字符串获得某个类的Class实例
    4. 动态配置实体的属性

4.Java获取反射的三种方法

  1. 通过==new对象==实现反射机制
  2. 通过==路径==实现反射机制
  3. 通过==类名==实现反射机制

集合

1.集合的特点

  • 对象封装数据,对象多了也需要存储,集合用于存储对象
  • 对象的个数确定可以使用数据,对象的个数不确定可以使用集合,集合长度可变

2.集合和数组的区别

  • 数组长度固定集合长度可变
  • 数组可以存储基本数据类型,也可以存储引用数据类型集合只能存储引用数据类型
  • 数组存储的元素必须是同一个数据类型集合存储的对象可以是不同数据类型

3.常用集合类有哪些

Map接口Collection接口是所有集合框架的父框架

  1. Collection接口的子接口:Set接口和List接口
  2. Map接口的实现类主要有:HashMapTreeMapHashtableConcurrentHashhMap以及Properties
  3. Set接口的实现类主要有:HashSetTreeSetLinkedHashSet
  4. List接口的实现类主要有:ArrayListLinkedListStack以及Vector

4.Collection和Collections的区别

  • Collection:是集合接口,提供了集合对象进行基本操作的通用接口方法,Collection接口的意义是为了各种具体的集合提供最大化的统一操作方式直接继承接口有 List和Set
  • Collectiongs:是集合类的一个工具类,提供了一系列的静态方法,用于对集合中元素进行排序搜索以及线程安全等各种操作

5.List、Set、Map之间的区别

List

  1. 可以允许重复对象
  2. 可以插入多个null元素
  3. 是一个有序的容器保持了每个元素按的插入顺序,输出的顺序就是插入的顺序
  4. 常用的实现类是ArrayListLinkedListVector
    1. ArrayList最为流行,提供了使用索引的所有访问
    2. LinkedList对于经常需要从List**添加或者删除的元素场合更加适合**
  5. 常见方法:add()、remove()、clear()、get()、contains()、size()

Set

  1. 不允许重复对象
  2. 无序容器,无法保证每个元素的存储顺序,TreeSet通过Comparator或者Comparable维护了排序顺序
  3. 允许一个null元素
  4. 最流行的几个实现类是HashSetLinkedHashSet以及TreeSet。最流行的是基于HashMap实现HashSet

Map

  1. Map不是collection的子接口,或者实现类。Map是一个接口
  2. Map是由键值对组成,map可能存在相同的值对象但是键对象必须是唯一
  3. Map里可以拥有随意个null值,但是最多只能有一个null键
  4. Map接口最流行的几个实现类,HashMapLinkedHashMapHashTableTreeMap。(HashMapTreeMap最常用

6.ArrayList和LinkedList的区别

最明显的区别就是ArayList底层的数据结构是数组支持随机访问。而LinkedList底层数据结构是双向循环链表不支持随机访问

7.如何实现数组和List之间的转换

  • List转换成数组:调用ArrayList的toArray方法
  • 数组转换成List:调用Arrays的asList方法

8.ArrayyList和Vector的区别

  • Vector同步的,而ArrayList不是。如果你寻求在迭代的时候对列表进行改变,应该使用CopyOnWriterArrayList
  • ArrayList比Vector快,他因为**同步不会过载**
  • ArrayList更加通用,因为我们可使用Collection工具类轻易的获取同步列表和只读列表

Array和ArrayList的区别

  • Array可以容纳基本类型和对象,而ArrayList只能容纳对象
  • Array指定大小的,ArrayList大小是固定的
  • Array没有提供ArrayList那么多功能,比如addAll(),removeAll()

那些集合类是线程安全的

  • vector:比arrayList多了一个同步化机制(线程安全)。到那时效率低下
  • statck:堆栈类,先进后出
  • hashtable:比hashMap多了一个线程安全
  • enumeration:枚举 相当于迭代器

线程

并行和并发的区别

  • 并行是指两个或者多个事件在同一时刻发生,多个任务之间是不互相抢占资源的。**并发是指两个或者多个事件在同一时间间隔**发生,多个任务之间是==互相抢占资源==的
  • 并行是在**不同实体上的多个事件**,并发是在**同一个实体上的多个事件**

进程和线程的区别

进程是程序运行和资源分配的基本单位,一个程序至少有一个进程一个进程至少有一个线程进程执行过程中拥有独立的内存单元,多个线程共享内存资源,减少切换次数,从而效率更高。线程是进程的一个实体。是cpu调度和分派的基本单位,是比程序跟小的能独立运行的基本单位。同一进程中的多个线程之间可以并发执行

创建线程有哪几种方式

1 继承Thread类创建线程类

  • 定义Thread类的子类,并重写该类的run方法、该run方法的方法体就代表线程要完成的任务。
  • 创建Thread子类的实例,即创建了线程对象
  • 调用线程对象的**start()**方法来启动线程

2 通过Runnable接口

  • 定义runnable接口的实现类重写run方法
  • 创建runnable实现类的实例,并依此实例作为hread的target来创建Thread对象,该对象才是真正的线程对象
  • 调用线程对象的**start**方法

3 通过Callable和Future创建线程

  • 创建Callable接口的实现类,并实现call方法,该call方法将作为线程执行体,并且有返回值
  • 创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了Callable对象的call方法的返回值
  • 使用FutureTask独享作为Thread对象的target创建并启动新线程
  • 调用FutureTask对象的get方法来获得子线程执行结果后的返回值

说一下runnable和callable的区别

  • Runnable接口中的run方法的返回值是一个void,他做的事情,就是纯粹的去执行run里边的代码
  • Callable接口中的call方法是有返回值的,是一个泛型,和Futhre、FutureTask配合可以用来获得异步执行的结果

1.线程的状态

在这里插入图片描述

1.新建状态

当用new操作符创建一个线程时。此时程序还没有开始运行线程中的代码。

2.就绪状态

新创建的线程并不自动开始运行,要执行线程,必须调用start方法启动了线程之后,start()方法创建线程运行的系统资源,并调度线程运行run()方法。当start()方法返回后,线程就处于就绪状态

处于就绪状态的线程并不一定立即运行run()方法,线程还必须同其他线程竞争CPU时间,只有获得CPU时间才可以运行线程

3.运行状态

当线程获得CPU时间后,他才进入运行状态,真正开始执行run方法

4.阻塞状态

​ 线程运行过程中可能由于各种原因进入阻塞状态

  1. 线程通过调用==sleep==()方法进入睡眠 suspen和wait等方法都可以

  2. 线程调用一个在一个I/O上被阻塞的操作,在输入输出之前不会返回到他的调用者

  3. 线程试图得到一个锁,而该锁正被其他线程持有

  4. 线程在等待某个触发条件

    阻塞状态就是正在运行的线程没有运行结束暂时让出CPU,让其他处于就绪状态的线程运行

5.死亡状态

  1. run方法正常退出自然死亡
  2. 一个未捕获的异常终止了run方法,是的线程猝死

判断线程是否存活,可以使用isAlive方法,只有在运行或阻塞的时候返回为true

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值