出处不详原文地址:Java基础面试题-20211228欢迎访问我的博客:http://blog.duhbb.com/题目转发和重定向的区别HashMap和HashTable的区别什么是死锁,死锁的必要性条件是什么?如何避免死锁?深拷贝和浅拷贝的区别java注释的代码永远不会执行吗?没有注释的代码会被执行吗?转发和重定向的区别RequestForwarding:客户端浏览器发送一个http请求,web服务器接受这个请求,调用一个内部方法完成容器内部的请求处理和转发动作,将目标资源发送给客户端;这里的转发路径必须是同一个web容器下的url,不能转向其他web路径,中间传递自己容器内的请求。客户端浏览器的路径栏中显示的路径仍然是它第一次访问的路径,也就是说客户端感觉不到服务端做了转发。转发行为是浏览器只做了一次访问请求。重定向过程:客户端浏览器发送http请求,web服务器收到后向客户端浏览器发送302状态码响应和对应的新位置。客户端浏览器发现是302响应,则自动发送新的http请求,请求url为新的location地址,服务器根据这个请求找到资源发送给客户端。这里的location可以重定向到任意的URL,既然浏览器重新发出了请求,那么就没有请求投递的概念了。重定向后的路径显示在客户浏览器的路径栏中,客户可以观察到地址的变化。重定向行为是浏览器至少进行了两次访问请求。下面用一张图来对比一下两者的区别:区分重定向请求转发在客户端完成(可以在不同服务器下完成)服务器端完成(必须在同一服务器下完成)的次数浏览器发送请求2次或2次以上1地址栏中的URL是否改变地址栏中的地址是否改变地址栏中的地址是否保持不变是否共享请求不共享数据(重定向后,请求中的对象将不可用)共享数据(之前的请求中存储的变量不会失效,就像把两个页面放在一起一样)第二次发起者的浏览器服务器的请求路径模式request绝对路径相对路径速度因为浏览器需要发送第二个请求,Redirection比较慢声明response.sendRedirect("success.jsp");request.getRequestDispatcher("success.jsp").forward(请求,响应);原文链接:https://blog.csdn.net/Weixiao...HashMap和HashTable的区别HashMap不是线程安全的HashMap是map接口的实现类。它是一个将键映射到值的对象。键和值都是对象,不能包含重复的键,但可以包含重复的值。HashMap允许空键和空值,而HashTable不允许。HashTable是一个线程安全的Collection。HashMap是HashTable的轻量级实现。它们都完成了Map界面。主要区别在于HashMap允许空键和空值。由于非线程安全,效率可能比Hashtable高。区别如下:HashMap允许null作为一个条目的键或值,而Hashtable则不允许。HashMap去掉了Hashtable的contains方法,改为containsValue和containsKey。因为contains方法容易引起误解。HashTable继承自Dictionary类,而HashMap是Java1.2引入的Map接口的实现。HashTable的方法是Synchronize,而HashMap不是。当多个线程访问Hashtable时,不需要同步它的方法,但是HashMap必须为其提供外部同步。Hashtable和HashMap使用的hash/rehash算法大致相同,所以性能上不会有太大差异。作者:hunter886链接:https://www.jianshu.com/p/5c3...来源:简书Copyright归作者所有。商业转载请联系作者授权,非商业转载请注明出处。为什么HashTable的key或者value不能为null?以下答案摘自stackoverflow:Hashtable是一个较旧的类,通常不鼓励使用它。在后来的使用中,设计者发现在开发中通常需要一个空的key或value,于是在HashMap中加入了对null的支持。HashMap是在HashTable类之后实现的,具有更高级的功能,基本上只是对Hashtable功能的改进。在创建HashMap的时候,专门设计用来把null值当作key来处理,作为特例来处理。补充:作者在JDK源代码中的注释:要成功地从Hashtable中存储和检索对象,用作键的对象必须实现hashCode方法和equals方法。要成功地从Hashtable中存储和检索对象,用作键的对象必须实现hashCode方法和equals方法。由于null不是对象,因此不能对其调用equals()或hashCode(),因此Hashtable不能使用它来计算哈希值作为键。作者:王力宏链接:https://www.zhihu.com/questio...来源:知乎版权归作者所有。商业转载请联系作者授权,非商业转载请注明出处。死锁什么是死锁?所谓死锁是指进程在运行过程中由于多个进程竞争资源而导致的一种死锁,当进程处于这种僵持状态时,如果没有外力作用,它们将无法继续前进。那么我们举个例子来说明一下,如果此时有一个线程A,按照先锁a再获取锁b的顺序获取锁,同时还有另一个线程B,它获取了锁按照先锁定b再锁定a的顺序进行锁定。死锁的原因?可以归结为以下两点:竞争资源系统中的资源可以分为两类:可剥夺资源,即一个进程获得此类资源后,该资源可以被其他进程或系统剥夺。CPU和主存都是可剥夺资源;另一类资源是不可剥夺的资源,当系统把这类资源分配给一个进程后,就不能再强行收回,只能在进程用完后释放,比如磁带机、打印机等。死锁中的竞争资源之一是指给不可让渡的竞争资源(例如:系统中只有一台打印机,可供进程P1使用,假设P1已经占用了打印机,如果P2继续请求打印机打印,就会阻塞另一种资源是指对临时资源的竞争(临时资源包括硬件中断、信号、消息、缓冲区中的消息等),通常消息通信顺序不当会造成死锁进程间的非法进程顺序如P1保留资源R1,P2保留资源R2,系统处于不安全状态,因为两个进程往前走,可能会出现死锁。比如P1运行到P1:Request(R2)时,会因为R2已经被P2占用而阻塞;当P2运行到P2:Request(R1)时,也会被阻塞,因为R1已经被P1占用,所以进程死锁发生的四个必要条件分配资源,即资源在一段时间内只被一个进程占用。请求和持有条件:当进程请求资源和阻塞时,保持获取的资源。无剥夺条件:进程已经获取的资源在用完之前不能被剥夺,只有用完了才能自己释放。循环等待条件:当死锁发生时,必须有一个过程——资源的循环链。解决死锁的基本方法是防止死锁:一次性分配资源:一次性分配所有资源,这样就不会再有请求了:(破坏请求条件)只要有一个资源就没有已分配,且没有其他资源分配给该进程:(destroy请保持条件)可剥夺资源:即当一个进程获得了一些资源但不能获得其他资源时,释放占用的资源(destroyInalienable条件)资源有序分配方法:系统为每一类资源分配一个编号,每个进程按照编号递增的顺序申请资源,相反释放(打破循环等待条件)1.必要时按一定顺序获取锁多把锁,设计时需要充分考虑不同线程获取锁的顺序。对于两把特定的锁,开发者可以尝试按照锁对象的hashCode值的顺序获取两把锁,这样总的锁数如果按照特定的顺序获取锁,那么就不会出现死锁。问题变得更加复杂。如果此时有多个线程在竞争不同的锁,单纯的按照锁对象的hashCode排序(单纯的按照HashCode顺序排序会造成“循环等待”),可能达不到要求。这时候开发者可以使用银行家算法,所有的锁都是按照特定的顺序获取的,这样也可以防止死锁。算法在里面就不细说了,有兴趣的可以自行了解。2当使用synchronized关键字超时时放弃当提供内置锁时,只要线程没有获取到锁,就会一直等待下去。但是Lock接口提供了booleantryLock(longtime,TimeUnitunit)throwsInterruptedException方法,可以按照固定的时间长度等待锁,这样线程就可以在获取锁超时后,主动释放所有之前获得的锁。这样也可以有效避免死锁。避免死锁和防止死锁的几种策略会严重损害系统性能。因此,在避免死锁发生时,应该施加更弱的限制以获得更令人满意的系统性能。在避免死锁的策略中,允许进程动态申请资源。因此,系统在资源分配前会预先计算资源分配的安全性。如果分配不会导致系统进入不安全状态,则资源分配给进程;否则,进程等待。最具代表性的死锁避免算法是银行家算法。银行家算法:首先需要定义状态和安全状态的概念。系统的状态是当前分配给进程的资源。因此,状态包含两个向量Resource(系统中每个资源的总量)和Available(每个资源未分配给进程的总量)和两个矩阵Claim(代表进程的资源需求)和Allocation(表示当前分配给进程的资源)。安全状态是指至少有一种资源分配顺序不会造成死锁。当进程请求一组资源时,假设请求被授予,从而改变系统的状态,然后判断结果是否仍处于安全状态。如果是,同意请求;如果不是,则阻止该进程,直到在授予请求后系统状态仍然安全。检测死锁首先为每个进程和每个资源分配一个唯一的编号;然后建立资源分配表和进程等待表。死锁检测工具jstack命令jstack是java虚拟机自带的堆栈跟踪工具。jstack用于打印输出给定java进程ID或核心文件或远程调试服务的Java堆栈信息。Jstack工具可以用来生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机中各个线程正在执行的方法栈生成线程快照的主要目的是定位线程长时间停顿的原因,比如线程间死锁、死循环、请求导致的长时间等待外部资源等。当线程暂停时,使用jstack查看各个线程的调用栈,可以知道是否响应线程在后台做什么,或者它们在等待什么资源?JConsole工具Jconsole是JDK自带的监控工具,可以在JDK/bin目录下找到。它用于连接到正在运行的本地或远程JVM。监控运行Java应用程序的资源消耗和性能,绘制大量图表,提供强大的可视化界面。并且服务器内存本身占用非常少,甚至可以说是几乎不消耗。解除死锁:当一个进程发现死锁后,应该立即解除死锁状态。常用的方法有:剥夺资源:从其他进程剥夺足够数量的资源给死锁进程,以解除死锁状态;取消进程:可以直接取消死锁进程或者取消成本最小的进程,直到有足够的资源可用,死锁状态消除;所谓成本是指进程的优先级、运行成本、重要性和价值等。原文链接:https://www.cnblogs.com/crazy...深拷贝和浅拷贝的区别so-所谓深拷贝和浅拷贝就是复制,所以主要区别在于复制的新对象和原对象是否会相互影响。会改变。浅拷贝:对于只是拷贝引用(地址),也就是说拷贝之后,原变量和新变量指向同一个东西,彼此之间的操作会互相影响,就是浅拷贝。DeepCopy:而如果在堆中重新分配内存,地址不同,但值是一样的。复制的对象与原对象完全隔离,互不影响。这是一个深拷贝。深拷贝和浅拷贝的主要区别在于:是拷贝引用(地址)还是拷贝实例。https://github.com/YvetteLau/...java评论觉得这个问题有点弱智:评论的代码坑不会执行,如果能执行那就怪了;没有注释的代码可能不会执行if(1==2){System.out.println("nevergethere!");}你认为这会被执行吗?原文地址:Java基础面试题-20211228欢迎访问我的博客:http://blog.duhbb.com/
