基础
1.jsp内置对象
- request 封装客户端的请求,其中包含来自GET或POST请求的参数 作用域 一次请求
- response 封装服务器对客户端的响应 作用域 只在jsp界面有效
- session 封装用户会话的对象 作用域 一次会话 直到关闭浏览器
- application 封装服务器运行环境的对象; 生命周期很长 类似全局变量
- out 输出服务器响应的输出流对象;可以对数据缓冲区进行操作 输出完毕后 积极地及时关闭输出流
- pageContext 通过该对象可以获取其他对象, pageContext对象是容器完成的
- config Web应用的配置对象;
- page JSP页面本身(相当于Java程序中的this)
- exception 封装页面抛出异常的对象 只有在**isErrorPage= true** 的页面才可以被使用
2.==和equals的区别
==判读对象的地址是否相同,基本数据类型比较的是值 引用数据类型比较的是内存地址
equals分两种情况 如果没有覆盖的话 和 双等于无异 如果覆盖了的话,的就是两个对象的内容
3.final
- final修饰的类不可被继承
- final修饰的方法可以被继承,不可被重写
- final修饰的变量 不可被改变
4.JDK 常用包
- java.lang :系统的基础类
- java.io :所有输入输出相关的类,文件操作等
- java.nio:为了完善io包中的功能,提高io包中性能而写的一个新包
- java.net :这个是和网络有关的类
- java.util :这个是系统的辅助类,特别是集合类
- 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类的常用方法
- indexOf():返回指定字符的索引
- charAt():返回指定索引处的字符
- replace():字符串替换
- trim():去除字符串两端空白
- split():分割字符串,返回一个分割后的字符串数组
- getBytes():返回字符串的byte类型数组
- length():返回字符串长度
- toLowerCase():将字符串转成小写字母
- toUpperCase():将字符串转成大写字符
- substring():截取字符串
- equals():字符串比较
2.String和StringBuffer、StringBuilder的总结
- String:适用于操作少量数据
- StringBuilder:单线程操作字符串缓冲区 操作大量数据
- StringBuffer:多线程操作字符串缓冲区 操作大量数据
3.字符串反转
使用StringBuilder或者StringBuffer的==reverse==方法
反射
1.什么是反射
java反核机制是在运行状态中,对于任意一个类,都能够知道这个类的所有方法和属性,对于任意一个对象,都能够调用他的任意一个方法和属性,这种动态获取的信息以及动态调用对象的方法的功能称之为java语言的反射机制
- 静态编译 :在编译时却行类型,绑定对象
- 动态编译 :运行时确定类型,绑定对象
2.反射机制的优缺点
- 优点:运行期类型的判断,动态加载类,提高代码的灵活度
- 缺点: 性能瓶颈,反射相当于一系列解释操作,通知JVM要做的事情,性能比直接的java代码要慢很多
3.反射机制应用的场景
- JDBC连接数据库使用的**Class.forName()**就是通过反射加载数据库驱动
- Spring框架最经典的就是xml配置模式,Spring通过XML配置模式装在Bean的过程
- 将程序中所有的XML或者Properties配置文件家载入内存中
- Java类里面解析xml或peopertis里面的内容得到对应实体类的字节码字符串以及相关的属性信息
- 使用反射机制,根据这个字符串获得某个类的Class实例
- 动态配置实体的属性
4.Java获取反射的三种方法
- 通过==new对象==实现反射机制
- 通过==路径==实现反射机制
- 通过==类名==实现反射机制
集合
1.集合的特点
- 对象封装数据,对象多了也需要存储,集合用于存储对象
- 对象的个数确定可以使用数据,对象的个数不确定可以使用集合,集合长度可变
2.集合和数组的区别
- 数组长度固定,集合长度可变
- 数组可以存储基本数据类型,也可以存储引用数据类型。集合只能存储引用数据类型
- 数组存储的元素必须是同一个数据类型,集合存储的对象可以是不同数据类型
3.常用集合类有哪些
Map接口和Collection接口是所有集合框架的父框架
- Collection接口的子接口:Set接口和List接口
- Map接口的实现类主要有:HashMap,TreeMap,Hashtable、ConcurrentHashhMap以及Properties等
- Set接口的实现类主要有:HashSet、TreeSet、LinkedHashSet等
- List接口的实现类主要有:ArrayList、LinkedList、Stack以及Vector等
4.Collection和Collections的区别
- Collection:是集合接口,提供了集合对象进行基本操作的通用接口方法,Collection接口的意义是为了各种具体的集合提供最大化的统一操作方式。直接继承接口有 List和Set
- Collectiongs:是集合类的一个工具类,提供了一系列的静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。
5.List、Set、Map之间的区别
List
- 可以允许重复对象
- 可以插入多个null元素
- 是一个有序的容器,保持了每个元素按的插入顺序,输出的顺序就是插入的顺序
- 常用的实现类是ArrayList、LinkedList和Vector。
- ArrayList最为流行,提供了使用索引的所有访问
- LinkedList对于经常需要从List**添加或者删除的元素场合更加适合**
- 常见方法:add()、remove()、clear()、get()、contains()、size()
Set
- 不允许重复对象
- 无序容器,无法保证每个元素的存储顺序,TreeSet通过Comparator或者Comparable维护了排序顺序
- 只允许一个null元素
- 最流行的几个实现类是HashSet、LinkedHashSet以及TreeSet。最流行的是基于HashMap实现的HashSet。
Map
- Map不是collection的子接口,或者实现类。Map是一个接口
- Map是由键值对组成,map可能存在相同的值对象但是键对象必须是唯一的
- Map里可以拥有随意个null值,但是最多只能有一个null键
- Map接口最流行的几个实现类,HashMap、LinkedHashMap,HashTable和TreeMap。(HashMap、TreeMap最常用)
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.阻塞状态
线程运行过程中可能由于各种原因进入阻塞状态
-
线程通过调用==sleep==()方法进入睡眠 suspen和wait等方法都可以
-
线程调用一个在一个I/O上被阻塞的操作,在输入输出之前不会返回到他的调用者
-
线程试图得到一个锁,而该锁正被其他线程持有
-
线程在等待某个触发条件
阻塞状态就是正在运行的线程没有运行结束,暂时让出CPU,让其他处于就绪状态的线程运行
5.死亡状态
- run方法正常退出而自然死亡
- 一个未捕获的异常终止了run方法,是的线程猝死
判断线程是否存活,可以使用isAlive方法,只有在运行或阻塞的时候返回为true