1。a.hashCode()有什么用?这与a.equals(b)有什么关系?hashCode()方法对应对象整数的哈希值。常用于基于散列的集合类,如Hashtable、HashMap、LinkedHashMap等,与equals()方法关系尤为密切。根据Java规范,使用equal()方法判断相等的两个对象必须具有相同的哈希码。2、字节流和字符流的区别将一段二进制数据一个一个输出到一个设备,或者从一个设备中一个一个读取一段二进制数据,不管输入输出设备是什么,我们都需要用统一的方法来完成这些操作,用抽象的方式描述。这个抽象描述方法命名为IO流,对应的抽象类是OutputStream和InputStream。不同的实现类代表不同的输入输出设备。它们都是供字节操作的。计算机中的一切最终都是二进制形式的字节。对于经常使用的汉字,先获取对应的字节,然后将字节写入输出流。读取时,我们首先读取的是字节,但是我们要将其显示为字符,就需要将字节转换为字符。由于如此广泛的需求,Java提供了一个特殊的字符流包装类。底层设备总是只接受字节数据。有时要向底层设备写入字符串,需要先将字符串转换为字节再写入。字符流是字节流的包装,字符流直接接受字符串,内部将字符串转换为字节,然后写入底层设备,为我们写入或读取字符串提供了一点点IO设备。方便的。字符转字节时要注意编码问题,因为将字符串转为字节数组实际上就是将字符转为某种编码的字节形式,读起来也是相反的。3、什么是java序列化,如何实现java序列化?或者请解释一下Serializable接口的作用。我们有时会将java对象传输到字节流中,或者将其从字节流中恢复为java对象。例如,要在硬盘上存储一个java对象,或者将其传输到网络上的其他计算机上,我们可以自己编写代码,将一个java对象转换成某种格式的字节流,然后进行传输。然而,jre本身提供了这种支持。我们可以调用OutputStream的writeObject方法来完成。如果我们想让java帮我们做,那么要传输的对象必须实现serializable接口。这样javac在编译的时候就会进行特殊的处理。编译后的类可以通过writeObject方法进行操作,这称为序列化。需要序列化的类必须实现Serializable接口,这是一个mini接口,不需要实现方法。implementsSerializable只是为了标记该对象可以被序列化。比如在web开发中,如果对象保存在Session中,tomcat在重启时需要将Session对象序列化到硬盘中,而这个对象必须实现Serializable接口。如果要通过分布式系统在网络上传输对象,则要传输的对象必须实现Serializable接口。4、描述一下JVM加载类文件的原理和机制?JVM中类的加载是通过ClassLoader及其子类实现的。JavaClassLoader是一个重要的Java运行时系统组件。它负责在运行时从类文件中查找和加载类。5.堆和栈有什么区别。Java内存分为两种,一种是栈内存,一种是堆内存。栈内存是指当程序进入一个方法时,会为这个方法分配一块私有的存储空间,用来存放方法内部的局部变量。当方法结束时,分配给这个方法的栈会被释放。变量也将被释放。堆是与栈功能不同的内存。一般用于存放不在当前方法栈中的数据。比如用new创建的对象是放在堆中的,所以不会随着方法结束而消失。方法中的局部变量用final修饰,放在堆上而不是栈上。6.什么是GC?为什么会有GC?GC是垃圾收集(GabageCollection)的意思。内存处理是程序员容易出问题的地方。忘记或错误的内存恢复将导致程序或系统不稳定甚至崩溃。Java提供的GC功能可以自动监测对象是否超出范围,达到自动回收内存的目的。Java语言并没有提供明确的操作方法来释放分配的内存。7、垃圾回收的优点和原理。并考虑两种回收机制。Java语言的一个显着特点是引入了垃圾回收机制,解决了C++程序员最头疼的内存管理问题。它使得Java程序员在编写程序时不再需要考虑内存管理。由于垃圾回收机制,Java中的对象不再有“作用域”的概念,只有对象引用才有“作用域”。垃圾回收可以有效防止内存泄漏,有效使用可用内存。垃圾收集器通常作为单独的低级线程运行。在不可预测的情况下,它会清除和回收内存堆中已经死亡或长时间未使用的对象。程序员无法实时调用垃圾收集器。垃圾收集的对象或所有对象。回收机制包括分代复制垃圾回收、标记垃圾回收和增量垃圾回收。8、垃圾收集器的基本原理是什么?垃圾收集器能否立即回收内存?有没有办法主动通知虚拟机进行垃圾回收呢?对于GC来说,当程序员创建一个对象时,GC就开始监控这个对象的地址、大小和使用情况。通常,GC使用有向图来记录和管理堆中的所有对象。这样就可以确定哪些对象“可达”,哪些对象“不可达”。当GC确定某些对象“不可达”时,GC负责回收这些内存空间。程序员可以手动执行System.gc()来通知GC运行,但是Java语言规范并不保证GC一定会执行。9、在Java中,throw和throws有什么区别?throw用于抛出java.lang的实例化对象。″)而throws的作用是作为方法声明和签名的一部分,方法抛出相应的异常以便调用者处理。在Java中,任何未处理的已检查异常都必须在throws子句中声明。10、java会不会有内存泄漏?请简要描述一下。先解释一下什么是内存泄漏:所谓内存泄漏就是指一个不再被程序使用的对象或变量在内存中被占用了。java中有一个垃圾回收机制,可以保证当对象不再被引用时,该对象会被垃圾回收器自动从内存中清除。因为Java使用有向图进行垃圾回收管理,可以消除引用循环的问题。比如有两个相互引用的对象,只要根进程不可达,GC也可以回收。java中内存泄漏的情况:长寿命对象持有短寿命对象的引用很可能导致内存泄漏,虽然短寿命对象不再需要,但是由于长寿命对象持有对它们的引用导致的,它不能回收。这就是java内存泄漏的场景。通俗地说,程序员可能创建了一个对象,以后再也不用这个对象了,但是这个对象一直被引用,也就是这个对象没用但是不能被垃圾回收器回收,这就是内存不足的情况泄漏可能发生在java中。比如在缓存系统中,我们在缓存中加载一个对象(比如在一个全局的地图对象中),然后就不再使用它了。该对象已被缓存引用,但不再使用。11.说说Servlet的生命周期?Servlet有很好的生命周期定义,包括加载和实例化、初始化、请求处理和服务结束。此生命周期由javax.servlet.Servlet接口的init()、service()和destroy方法表示。Servlet被服务器实例化后,容器运行它的init方法,当请求到来时运行它的service方法,service方法自动调度并运行请求对应的doXXX方法(doGet、doPost)等,以及当服务器决定销毁实例方法时调用它的销毁。Web容器加载servlet,生命周期开始。通过调用servlet的init()方法初始化servlet。它是通过调用service()方法实现的,根据不同的请求调用不同的do*()方法。为了结束服务,Web容器调用servlet的destroy()方法。12.ServletAPI中的forward()和redirect()有什么区别?(1).从地址栏的显示来看,forward表示服务器请求资源。服务器直接访问目标地址的URL,读取该URL的响应内容,然后将内容发送给浏览器。浏览器根本不知道服务器。发送的内容是从哪里来的,所以它的地址栏还是原来的地址。重定向就是服务器根据逻辑发送一个状态码,告诉浏览器重新请求那个地址。所以地址栏会显示新的URL。所以Redirect就是客户端向服务器发送两个请求,同时接受两个响应。(2).在数据共享方面,转发:被转发的页面和被转发的页面可以共享请求中的数据。重定向:无法共享数据。重定向不仅可以重定向到当前应用的其他资源,还可以重定向到一个站点上其他应用中的相同资源,甚至可以使用绝对URL重定向到其他站点的资源。forward方法只能在同一Web应用程序内的资源之间转发请求。转发是服务器内部的操作。重定向是服务器通知客户端,要求客户端重新发起请求。因此,你可以说redirect是一个间接请求,但你不能说“一个请求是属于forward还是redirect”(3)。从应用的角度Forward:一般用于用户登录时根据角色转发到相应的模块。redirect:一般用于用户注销登录时返回主页面和跳转到其他网站。(4).在效率方面,forward:high.redirect:low.13request.getAttribute()和request.getParameter()有什么区别?(1)、request.getParameter()是通过容器的实现来获取通过类似post、get等方法传入的数据。request.setAttribute()和getAttribute()只是在Web容器内部流动,只是请求处理阶段。(2)、getAttribute返回一个对象,getParameter返回一个字符串(3)、getAttribute()一直是和setAttribute()一起使用的,只有先用setAttribute()设置后,才能通过getAttribute()获取到值,他们传递的数据是Object类型。并且必须在同一个请求对象中使用才有效。,而getParameter()是接收到的表单get或post提交的参数14,jsp静态包含和动态包含的区别(一),<%@includefile="xxx.jsp"%>是编译指令在jsp中,其文件的包含发生在从jsp到servlet的转换期间,而在jsp中是一个action命令,其文件的包含发生在编译期间,即java文件被编译为class文件期间(2),使用静态包含只会生成一个class文件,而使用动态包含会生成多个class文件(3),使用静态包含,请求对象的包含页面和被包含页面是同一个对象,因为静态包含只是将被包含页面的内容复制到被包含页面;而动态包含包含页面和被包含页面不是同一个页面,被包含页面的请求对象可以获取的参数范围比较大,不仅可以获取到传递给包含页面的参数,还可以获取到包含页面的参数从包含页面传下来的可以得到。Model代表应用程序的业务逻辑(由JavaBean、EJB组件实现),View是应用程序的表现面(由JSP页面生成),Controller提供应用程序的流程控制(通常是Servlet)。通过这种设计模型将应用逻辑、处理和显示逻辑分成不同的组件来实现。这些组件可以交互和重用。16、jsp的内置对象有哪些?它们的功能是什么?JSP有以下9个内置对象:(1)、request客户端请求,这个请求会包含来自GET/POST请求的参数(2)、response网页返回客户端的response(3)、网页的pageContext属性是这里管理(4),session是请求相关的会话周期(5),applicationservlet正在执行的内容(6),out用来传输response的输出(7),结构configservlet的组件(8)、页面JSP网页本身(9)、错误网页的异常、未捕获的异常17、Http中get和post方法的区别(1),get是向服务器A发送数据请求,而Post是向服务器提交数据的请求(2),Get是获取信息,不是修改信息,类似于数据库查询功能,不会修改数据(3),Get的参数request会和url传递后,在URL后面追加请求的数据,URL和传输数据用?分隔,参数用&连接。%XX中的XX是符号的十六进制ASCII表示。如果数据是英文字母/数字,则按原样发送。如果它们是空格,它们将被转换为+。如果是中文/其他字符,字符串直接用BASE64加密。(4)、Get传输的数据是有大小限制的,因为GET是通过URL提交数据的,那么GET可以提交的数据量是和URL的长度直接相关的,不同的浏览器有不同的限制URL的长度。(5)、GET请求的数据会被浏览器缓存,用户名和密码会以明文形式出现在URL上。其他人可以查看历史浏览记录,数据不是很安全。在服务器端,使用Request.QueryString获取Get方法提交的数据。Post请求作为http报文的实际内容发送给web服务器,数据放在HTMLHeader中提交。post不限制提交的数据。Post比Get更安全。当数据是中文或不敏感数据时,使用get,因为使用get,地址中会显示参数。对于敏感数据和非汉字的数据,使用post。(6)、POST代表一个可能修改服务器资源的请求。在服务器端,Post提交的数据只能通过Request.Form获取。(仅供参考,如有更好的答案,欢迎讨论)18、什么是cookie?session和cookie有什么区别?Cookie是一种会话技术,它将用户的信息保存到浏览器对象中。区别:(1)cookie数据保存在客户的浏览器,session数据保存在服务器(2)cookie不是很安全,别人可以分析保存在LocalCOOKIE和COOKIEspoofing,如果主要考虑安全性,你应该使用session(3)session会在服务器上保存一段时间。当访问量增加时,它会占用你的服务器的性能。如果主要考虑是降低服务器性能,应该使用COOKIE(4)。客户端单个cookie的限制是3K,也就是说一个站点客户端存储的COOKIE不能是3K。结论:将登录信息等重要信息存储为SESSION;如果您需要保留其他信息,可以将其存储在COOKIE中。19、jsp和servlet有什么区别,它们有什么共同点,各自的应用范围?JSP是Servlet技术的扩展,本质上是Servlet的一种简单方式。JSP编译后就是一个“servlet-like”。Servlet与JSP的主要区别在于Servlet的应用逻辑在Java文件中,在表现层与HTML完全分离。对于JSP,Java和HTML可以合并为一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。在struts框架中,JSP位于MVC设计模式的视图层,而Servlet位于控制层。20、tomcat容器如何创建servlet类实例?使用什么原理?容器启动时会读取webapps目录下所有web应用中的web.xml文件,然后解析xml文件,读取servlet注册信息。然后,通过反射加载并实例化每个应用程序中注册的servlet类。(有时也是在第一次请求时实例化)在servlet注册的时候加上1,如果是正数,会在最开始实例化,如果notWriteornegative,第一次请求实例化。21、JDBC访问数据库的基本步骤是什么?(1)、加载驱动(2)、通过DriverManager对象获取连接对象Connection(3)、通过连接对象获取session(4)、通过session增删改查数据,封装对象(5)、关闭资源22、说一下preparedStatement和Statement的区别(1)、效率:预编译session优于普通session对象,数据库系统不会重新编译同一条sql语句(2)、安全:有效避免sql注入攻击!sql注入攻击就是从客户端输入一些非法的特殊字符,使得服务器端仍然可以正确构造sql语句,从而收集程序和服务器端的信息和数据。例如:"select*fromt_userwhereuserName='"+userName+"'andpassword='"+password+"'"如果用户名和密码为'1'或'1'='1';那么输出的sql语句是:"select*fromt_userwhereuserName='1'or'1'='1'andpassword='1'or'1'='1'这个语句的where部分不玩一个作用于数据过滤的功能。23、谈谈事务的概念,JDBC编程中处理事务的步骤。(1)事务是作为一个单一的逻辑工作单元执行的一系列操作。(2)、一个逻辑工作单元必须有四个属性,分别称为Atomicity、consistency、isolation和durability(ACID)属性,只有这样才能成为一个transaction事务处理步骤:(3)、conn.setAutoComit(false);设置提交方式到手动提交(4),conn.commit()提交事务(5),如果有异常,回滚conn.rollback();24、数据库连接池的原理。为什么要使用连接池。(1)、数据库连接是一个耗时的操作,连接池可以让多个操作共享一个连接。(2)、数据库连接池的基本思想是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,用完后再放回去。我们可以通过设置连接池的最大连接数来防止系统无休止地连接数据库。更重要的是,我们可以通过连接池的管理机制来监控数据库连接的数量和使用情况,为系统的开发、测试和性能调整提供依据。(3)、连接池的使用是为了提高数据库连接资源的管理25、什么是JDBC的脏读?哪种数据库隔离级别可以防止脏读?我们在使用事务的时候,可能会发生一行数据刚刚被更新,同时另一个查询读取到新更新的值。这样就导致了脏读,因为更新的数据还没有持久化,更新这行数据的业务可能会回滚,从而导致这条数据失效。数据库的TRANSACTIONREADCOMMITTED、TRANSACTIONREPEATABLEREAD和TRANSACTION_SERIALIZABLE隔离级别可防止脏读。26、什么是幻读,哪个隔离级别可以防止幻读?幻读是指一个事务多次执行查询但返回不同的值。假设一个事务正在根据某个条件查询数据,然后另一个事务插入一行满足查询条件的数据。之后,这个事务再执行这个查询,返回的结果集中会包含刚刚插入的新数据。这一新的数据行称为幻像行,这种现象称为幻读。只有TRANSACTION_SERIALIZABLE隔离级别可以防止幻读。27.JDBCDriverManager有什么用?JDBC的DriverManager是一个工厂类,我们通过它创建数据库连接。当JDBCDriver类被加载时,它会在DriverManager类中注册自己,然后我们将数据库配置信息传递给DriverManager.getConnection()方法,DriverManager会使用注册在其中的驱动来获取数据库连接和返回调用程序。28.execute、executeQuery、executeUpdate有什么区别?(1)、Statement的execute(Stringquery)方法用于执行任何SQL查询。如果查询的结果是ResultSet,则此方法返回true。如果结果不是ResultSet,例如插入或更新查询,它将返回false。我们可以通过它的getResultSet方法获取ResultSet,也可以通过getUpdateCount()方法获取更新记录的条数。(2)、Statement的executeQuery(Stringquery)接口用于执行selectquery并返回ResultSet。即使没有找到记录,返回的ResultSet也不会为null。我们通常使用executeQuery来执行查询语句。这样如果传入insert或者update语句,就会抛出java.util.SQLException,错误信息是“executeQuery方法不能用于update”。(3)、Statement的executeUpdate(Stringquery)方法用于执行insert或update/delete(DML)语句,或者什么都不返回。对于DDL语句,返回值为int类型。如果是DML语句,就是更新条目的个数,如果是DDL,则返回0应使用方法。29、如何显示SQL查询的分页结果?Oracle:select*from(select*,rownumastempidfromstudent)twheret.tempidbetween”+pageSize*(pageNumber-1)+”和”+pageSize*pageNumberMySQL:select*fromstudentslimit”+pageSize*(pageNumber-1)+“,”+pageSize; sqlserver:selecttop”+pageSize+”*fromstudentswhereidnotin+(selecttop”+pageSize*(pageNumber-1)+idfromstudentsorderbyid)+》orderbyid;30、JDBC的ResultSet是什么?查询数据库后,会返回一个ResultSet,就像是查询结果集的数据表。ResultSet对象维护了一个游标,指向当前行数据。一开始,光标指向第一行。如果调用ResultSet的next()方法,游标将向下移动一行。如果没有更多数据,next()方法将返回false。它可以在for循环中使用以遍历数据集。默认的ResultSet不能更新,只能下移游标。也就是说只能从第一行遍历到最后一行。但是,您也可以创建一个可以回滚或更新的ResultSet。当生成ResultSet的Statement对象要关闭或重新执行或获取下一个ResultSet时,ResultSet对象也会自动关闭。通过ResultSet的getter方法传入列名或从1开始的序号即可获取列数据。