常见异常
数组脚本越界(ArrayIndexOutOfBoundsException)
NullPointerException(NullPointerException)
ClassCastException(ClassCastException)
使用临时关键字修改.
瞬时关键字的作用是防止实例中由该关键字修改的变量的序列化;反序列化对象时,瞬态修改变量的值将不会保留和恢复. 瞬态只能修改变量,不能修改类和方法
BIO正在阻止IO,就像开水一样. 他必须先将第一锅水煮沸,然后再将第二锅水煮沸,然后再进行下一锅. 会消耗很多时间. NIO是非阻塞IO. 您可以同时煮三锅水. 他需要经常走来走去,观察每壶水是否在沸腾. 在煮沸过程中别无他法. AIO异步IO是向每个锅中加水煮沸的计时器开关. 稍后我们会通知我们,我们可以在煮沸过程中做其他事情
final关键字主要在三个地方使用: 变量,方法和类.
static关键字主要具有以下四种使用场景
修改成员变量和成员方法
静态代码块
静态内部类
静态指南包
静态方法和非静态方法
静态{}静态代码块和{}非静态代码块(构造代码块)
此关键字用于引用该类的当前实例
super关键字用于从子类访问父类的变量和方法
冒泡,二分法
&&和&都表示AND,不同之处在于,只要&&的一个条件不同,就不能满足. 如果不满足第一个条件,则不判断以下条件. 并且&必须判断所有条件
||和都表示“或”,区别是||只要满足第一个条件,就不会判断以下条件,并且|必须判断所有条件
BigDecimal由任意精度的整数无标度值和32位整数标度(标度)组成
BigDecimal在银行,帐户,帐单等领域提供准确的数值计算
List,Set,Map都是接口,前两个继承自Collection接口,Map是独立接口
Set下有HashSet,LinkedHashSet,TreeSet
列表下有ArrayList,Vector,LinkedList
Map下有Hashtable,LinkedHashMap,HashMap,TreeMap
在Collection接口下还有一个Queue接口,它具有PriorityQueue类
列表是有序且可重复的
ArrayList
优点: 底层数据结构是一个数组,可以快速查询,而添加或删除则很慢.
缺点: 线程不安全高效
向量
优点: 底层数据结构是一个数组,可以快速查询,而添加或删除则很慢.
缺点: 线程安全,效率低
LinkedList
优点: 底层数据结构是一个链表,查询慢,添加和删除快.
缺点: 线程不安全高效
-设置无序,唯一
HashSet
如何确保元素的唯一性?
基础数据结构是哈希表. (无序,唯一)
1. 依靠两种方法: hashCode()和equals()
LinkedHashSet
底层数据结构是链表和哈希表. (按顺序插入FIFO,唯一)
1. 元素的顺序由链表保证
2. 哈希表保证了唯一元素
TreeSet
基础数据结构是一棵红黑树. (唯一,有序)
1. 如何确保元素的排序?
自然排序
比较器排序
2. 如何确保元素的唯一性?
根据比较的返回值是否为0来确定.
1.public void init(ServletConfig config)执行时间: 创建Servlet对象时将调用此方法
2. public void service(ServletRequest请求,ServletResponse响应)执行时间: 将为每个请求执行此方法;这种方法通常用于业务逻辑处理
3. 公共void destroy()执行时间: 销毁Servlet对象(关闭服务器)时执行此方法
JSP和Servlet之间是什么关系? JSP本质上是Servlet的一种简单形式. 服务器将JSP处理成与Servlet类似的Java程序. 有人说Servlet用Java编写HTML,而JSP用HTML编写Java代码编写,当然,这种说法是单方面的,不够准确. JSP专注于视图,Servlet更多关注于控制逻辑,在MVC架构模式中,JSP适合于视图(视图),而Servlet适合于控制器(控制器).
1. 客户端发送一个请求,该请求是JSP,Web容器将找到相应的servlet进行处理
2. 将servlet转换为字节码文件
3. 将字节码文件加载到Web容器中
4. 此时,将在Web容器中创建一个实例
5. 初始化
6. 通过服务接受请求
7. 然后,Web容器将自动生成两个对象servlet和service,最后将其销毁
request: 封装客户端的请求,其中包含来自GET或POST请求的参数;
响应: 封装服务器对客户端的响应;
pageContext: 其他对象可以通过此对象获得;
session: 封装用户会话的对象;
out: 输出服务器响应的输出流对象;
exception: 封装页面引发的异常的对象.
page: JSP页面本身(相当于Java程序中的页面);
config: Web应用程序配置对象;
应用程序: 封装服务器操作环境的对象;
jsp: include: 在请求页面时包含文件.
jsp: useBean: 查找或实例化JavaBean.
jsp: setProperty: 设置JavaBean的属性.
jsp: getProperty: 输出JavaBean的属性.
jsp: forward: 将请求转发到新页面.
jsp: plugin: 根据浏览器类型为Java插件生成OBJECT或EMBED标签
jsp: param(传递参数)
pagez命令
include指令
taglib指令
页面,请求,会话和应用程序
1. ArrayList是基于动态数组的数据结构,LinkedList是基于链表的数据结构.
2. 对于随机访问获取和设置,ArrayList感觉比LinkedList更好,因为LinkedList需要移动指针.
3. 对于添加和删除操作,LinedList更具优势,因为ArrayList需要移动数据.
摘要: 最好添加和删除LinedList,最好是找到ArrayList.
Vector类的所有方法都已同步. 两个线程可以安全地访问Vector对象,但是如果一个线程访问Vector,则代码将花费大量时间进行同步操作.
Arraylist不同步,因此建议在不需要线程安全的情况下使用Arraylist
可比的接口实际上来自java.lang包. 它具有用于排序的compareTo(Object obj)方法
比较器接口实际上来自java.util包. 它具有用于进行排序的compare(Object obj1,Object obj2)方法.
ist是一个有序列表,允许重复的元素并允许为空
Set是一个无序列表,不允许重复的元素,该元素的位置由hashCode确定,并且最多包含一个null
list和set是用于存储单列数据的集合,而Map是用于存储双列数据(例如键值对)的集合
地图存储结构不正确,键不能重复,值可以重复,并且哈希图可以具有空键
该进程具有独立的地址空间. 进程崩溃后,它不会影响处于保护模式的其他进程,线程只是进程中不同的执行路径. 线程具有自己的堆栈和局部变量,但是线程之间没有单独的地址空间. 线程的死亡意味着整个过程的死亡. 因此,多进程程序比多线程程序更健壮,但是在多个进程之间切换时,它的成本更高. 资源较大,效率较差. 但是对于某些需要同时执行并共享某些变量的并发操作,只能使用线程,而不能使用进程.
进程是资源分配的最小单位,线程是CPU调度的最小单位
程序中至少有一个进程,一个进程中至少有一个线程;线程的划分规模小于进程的划分规模(占用资源),这使得多线程程序具有较高的并发性. 进程在运行期间具有独立的内存空间,并且内存程之间共享,这大大提高了程序的效率. 线程不能独立运行,并且必须存在于进程中.
优缺点: 线程开销很小,但不利于资源管理和保护,而过程相反.
在Java中,在给定的时间点,线程只能处于一种状态. 上图中的状态是所有虚拟机状态,而不是操作系统的线程状态. 线程对象的状态存储在Thread类的内部类(状态)中,该内部类是一个枚举,并且有六个固定状态: NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING和TERMINATED.
上下文切换是指CPU上的内核(操作系统的核心)的进程或线程切换. 上下文切换过程中的信息存储在过程控制块(PCB-Process Control Block)中. PCB也称为SwitchFrame(SwitchFrame). 上下文切换信息将始终存储在CPU内存中,直到再次使用为止.
当两个线程互相等待释放资源时,就会发生死锁.
造成僵局的主要原因是
由于系统资源不足
进程运行的顺序不合适
资源分配不当等??
僵局的四个必要条件
(1)互斥条件: 资源一次只能由一个进程使用
(2)请求和保持条件: 当一个进程被请求资源阻塞时,它将保留所获取的资源.
(3)非剥夺条件: 进程已获取的资源在用尽之前不能被强行剥夺.
(4)循环等待条件: 多个进程之间形成一种循环等待资源关系.
两者都可以中止线程的执行.
两者之间的主要区别在于,sleep方法不会释放锁,而wait方法会释放锁.
等待通常用于线程之间的交互/通信,而睡眠通常用于挂起执行.
调用wait()方法后,该线程将不会自动唤醒,其他线程需要在同一对象上调用notify()或notifyAll()方法. 执行sleep()方法后,线程将自动唤醒. 或者,您可以使用wait(长时间超时)在超时后自动唤醒线程.
为什么在调用start()方法时执行run()方法,为什么不能直接调用run()方法?
新建一个线程,该线程进入新状态;调用start()方法将启动一个线程并使该线程进入就绪状态,并且可以在分配时间片后开始运行. start()将执行线程的相应准备工作,然后自动执行run()方法的内容,这是真正的多线程工作. 通过直接执行run()方法,run方法将在主线程下作为普通方法执行,并且不会程中执行,因此这不是多线程工作.
摘要: 调用start方法以启动线程并使线程进入就绪状态,而run方法只是线程的常规方法调用java多线程避免死锁,或者在主线程中执行.
①都是可重入锁
两者都是可重入锁. “可重入锁”的概念是您可以再次获取自己的内部锁. 例如,线程已获取对象的锁,而对象锁尚未释放. 当它想再次获取该对象的锁时,仍然可以获取它. 如果它是可解锁且可重入的,则将导致死锁. 每次同一线程获取一个锁时,锁计数器都会增加1,因此只有在锁计数器降至0时才能释放该锁.
②同步取决于JVM,而ReentrantLock取决于API
已同步是由JVM实现的. 前面我们还提到了虚拟机团队对JDK1.6中的synced关键字进行了很多优化,但是这些优化是在虚拟机级别实现的,并不直接暴露给我们. ReentrantLock是在JDK级别上实现的(也就是说,在API级别上,需要使用try / finally语句块来完成lock()和unlock()方法),因此我们可以查看其源代码以了解其方式已实现.
③ReentrantLock比同步功能增加了一些高级功能
与同步相比,ReentrantLock添加了一些高级功能. 有以下三点: ①等待可以打断; ②可以实现公平锁定; ③可以实现选择性通知(锁可以绑定多个条件)
ReentrantLock提供了一种机制来中断等待锁定的线程. 该机制由lock.lockInterruptible()实现. 换句话说,等待线程可以选择放弃等待并转而处理其他事情.
ReentrantLock可以指定它是公平锁还是不公平锁. 而同步只能是不公平的锁定. 所谓的公平锁是首先获得锁的第一个等待线程. 默认情况下,ReentrantLock是不公平的. 您可以使用ReentrantLock类的ReentrantLock(布尔公平)构造方法来确定它是否公平.
本文来自本站,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-284713-1.html
……