累计小de面试题(1)——java基础

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_45044097/article/details/100660643

文章目录

1 web

1. servlet生命周期

1.加载和实例化
(tomcat启动的时候,查看web.xml来实例化所有servlet放入servlet容器中)
2.初始化
3.请求处理
4.服务终止

init():
在Servlet的生命周期中,仅执行一次init()方法。它是在服务器装入Servlet时执行的,负责初始化Servlet对象。可以配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet。无论有多少客户机访问Servlet,都不会重复执行init()。

service():
它是Servlet的核心,负责响应客户的请求。每当一个客户请求一个HttpServlet对象,该对象的Service()方法就要调用,而且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。在HttpServlet中已存在Service()方法。默认的服务功能是调用与HTTP请求的方法相应的do功能。
destroy():
仅执行一次,在服务器端停止且卸载Servlet时执行该方法。当Servlet对象退出生命周期时,负责释放占用的资源。一个Servlet在运行service()方法时可能会产生其他的线程,因此需要确认在调用destroy()方法时,这些线程已经终止或完成。

Web服务器在与客户端交互时Servlet的工作过程是:
1.在客户端对web服务器发出请求.
2.web服务器接收到请求后将其发送给Servlet.
3.Servlet容器为此产生一个实例对象并调用ServletAPI中相应的方法来对客户端HTTP请求进行处理,然后将处理的响应结果返回给WEB服务器.
4.web服务器将从Servlet实例对象中收到的响应结构发送回客户端.

2. session的生命周期

第一次请求就获得会话;
主动调用销毁方法的时候,或者生命时间失效(默认30分钟)—— 刷新Tomcat,浏览器关闭;
session.getMaxInactiveInterval();最大生命时间,默认1800s。

Session对浏览器的要求:
  虽然Session保存在服务器,对客户端是透明的,它的正常运行仍然需要客户端浏览器的支持。这是因为Session需要使用Cookie作为识别标志。HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一客户,因此服务器向客户端浏览器发送一个名为JSESSIONID的Cookie,它的值为该Session的id(也就是HttpSession.getId()的返回值)。Session依据该Cookie来识别是否为同一用户。

该Cookie为服务器自动生成的,它的maxAge属性一般为-1,表示仅当前浏览器内有效,并且各浏览器窗口间不共享,关闭浏览器就会失效。因此同一机器的两个浏览器窗口访问服务器时,会生成两个不同的Session。但是由浏览器窗口内的链接、脚本等打开的新窗口(也就是说不是双击桌面浏览器图标等打开的窗口)除外。这类子窗口会共享父窗口的Cookie,因此会共享一个Session。

注意:新开的浏览器窗口会生成新的Session,但子窗口除外。子窗口会共用父窗口的Session。例如,在链接上右击,在弹出的快捷菜单中选择"在新窗口中打开"时,子窗口便可以访问父窗口的Session。

如果客户端浏览器将Cookie功能禁用,或者不支持Cookie怎么办?例如,绝大多数的手机浏览器都不支持Cookie。Java Web提供了另一种解决方案:URL地址重写。

URL地址重写是对客户端不支持Cookie的解决方案。URL地址重写的原理是将该用户Session的id信息重写到URL地址中。服务器能够解析重写后的URL获取Session的id。这样即使客户端不支持Cookie,也可以使用Session来记录用户状态。HttpServletResponse类提供了encodeURL(String url)实现URL地址重写,该方法会自动判断客户端是否支持Cookie。如果客户端支持Cookie,会将URL原封不动地输出来。如果客户端不支持Cookie,则会将用户Session的id重写到URL中。

注意:TOMCAT判断客户端浏览器是否支持Cookie的依据是请求中是否含有Cookie。尽管客户端可能会支持Cookie,但是由于第一次请求时不会携带任何Cookie(因为并无任何Cookie可以携带),URL地址重写后的地址中仍然会带有jsessionid。当第二次访问时服务器已经在浏览器中写入Cookie了,因此URL地址重写后的地址中就不会带有jsessionid了。

3. 什么是会话跟踪技术

会话:客户端打开与服务器的连接发出请求到服务器响应客户端请求的全过程称之为会话;

会话跟踪 :对同一个用户对服务器的连续的请求和接受响应的监视;

为什么需要会话跟踪:
浏览器与服务器之间的通信是通过HTTP协议进行通信的,而HTTP协议是”无状态”的协议,它不能保存客户的信息,即一次响应完成之后连接就断开了,下一次的请求需要重新连接,这样就需要判断是否是同一个用户,所以才应会话跟踪技术来实现这种要求。

介绍 :当服务器响应客户端的第一次请求时,将会创建一个新的session对象(该对象实现了HttpSession接口)和一个唯一的ID分配给该请求,以后客户将此会话ID与请求一起传给服务器,此会话ID在后续的请求中会将用户与session对象进行匹配,用于识别不同的客户。

会话跟踪常用的方法:
a)URL重写:URL(统一资源定位符)是Web上特定页面的地址,URL重写的技术就是在URL结尾添加一个附加数据以标识该会话,把会话ID通过URL的信息传递过去,以便在服务器端进行识别不同的用户 ;

b)隐藏表单域:将会话ID添加到HTML表单元素中提交到服务器,此表单元素并不在客户端显示

c)Cookie:Cookie是Web服务器发送给客户端的一小段信息,客户端请求时可以读取该信息发送到服务器端,进而进行用户的识别。对于客户端的每次请求,服务器都会将Cookie发送到客户端,在客户端可以进行保存,以便下次使用。
客户端可以采用两种方式来保存这个Cookie对象,一种方式是 保存在 客户端内存中,称为临时Cookie,浏览器关闭后 这个Cookie对象将消失。另外一种方式是保存在 客户机的磁盘上,称为永久Cookie。以后客户端只要访问该网站,就会将这个Cookie再次发送到服务器上,前提是 这个Cookie在有效期内。 这样就实现了对客户的跟踪。 Cookie是可以被禁止的。

d)session:每一个用户都有一个不同的session,各个用户之间是不能共享的,是每个用户所独享的,在session中可以存放信息。 在服务器端会创建一个session对象,产生一个sessionID来标识这个session对象,然后将这个sessionID放入到Cookie中发送到客户端,下一次访问时,sessionID会发送到服务器,在服务器端进行识别不同的用户;Session是依赖Cookie的,如果Cookie被禁用,那么session也将失效。

设置session有效时间

session.setMaxInactiveInterval(3); //秒

销毁session

session.invalidate();//销毁
4. request和response应用场景

HttpServletRequset对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,请求中的所有信息都会被封装在这个对象里面,通过这个对象的相关方法可以获取请求数据。

作用
-读取和写入HTTP请求数据(请求行,和消息头等)
-取得和设置Cookies
-取得路径信息
-标志HTTP会话
-实现请求转发

HttpServletResponse对象代表提供给客户端的响应,封装了HTTP的响应数据。通过这个对象可设置状态行消息头,实体内容。

作用
-设置对客户端的输出内容,
-设置响应的状态码
-设置浏览器的解码方式
-设置Cookies
-实现重定向

5. 重定向和转发的区别
request.getRequestDispatcher("apage.jsp").forward(request, response);//转发到apage.jsp
response.sendRedirect("apage.jsp");//重定向到apage.jsp
  1. 转发携带参数;
  2. 转发地址栏没有变化,重定向地址改变;
  3. 转发在服务器端完成的;重定向是在客户端完成的;
  4. 转发的速度快;重定向速度慢;(重定向效率高)
  5. 重定向:以前的request中存放的变重全部失效,并进入一个新的request作用域。
    转发:以前的request中存放的变里不会失效,就像把两个页面拼到了一起。增加服务器压力。
  6. 转发不会执行转发后的代码;重定向会执行重定向之后的代码;
  7. 转发的是同一次请求;重定向是两次不同请求;
  8. 转发必须是在同一台服务器下完成;重定向可以在不同的服务器下完成.
6. ServletContext和Session还有request的作用域

Request域:只返回给客户信息,无需校验,一个Request占有一个Request域,其它Request不可以访问。 其主要作用携带Cookie和转发功能。
(Request.getRequestDispatcher(url).forward(req,rep)方式将请求转发给另一页面,客户端只发出一次请求,由服务器将该请求转发,所以仍是一次请求。与ServletContext对象的转发功能不同的是ServletContext.getRequestDispatcher(url).forward(req,rep)方法在携带数据转发时会有线程安全问题,所以携带数据转发使用request对象的功能。)
Session域:用于校验信息,一次会话含有多个Request, 在一个会话中多个Request占有一个Session域,相互之间可以访问。
**ServletContext:**整个webApps内的一个应用程序范围。作用于一个应用程序中的Sevlet之间的请求交互。
Page域:Jsp页面。PageContext对象,该对象保存了Jsp的其它八大隐式对象的引用:get/setRequest|Response|Config|Session|Application|Page|Exception

7.session和cookie区别

Cookie(复数形态Cookies),中文名称为小型文本文件或小甜饼,指某些网站为了辨别用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密)。Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)

Session是依赖Cookie的,如果Cookie被禁用,那么session也将失效。
1、cookie会话数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
考虑到减轻服务器性能方面,应当使用COOKIE。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
5、所以个人建议:
将登陆信息等重要信息存放为SESSION
其他信息如果需要保留,可以放在COOKIE中

8.request.getAttribute()和 request.getParameter()有何区别?

1.HttpServletRequest类有setAttribute()方法;
2.当两个Web组件之间为链接关系时,被链接的组件通过getParameter()方法来获得请求参数;
3.当两个Web组件之间为转发关系时,转发目标组件通过getAttribute()方法来和转发源组件共享request范围内的数据;
4.request.getParameter()方法传递的数据,会从Web客户端传到Web服务器端,代表HTTP请求数据。request.getParameter()方法返回String类型的数据。
5.request.setAttribute()和getAttribute()方法传递的数据只会存在于Web容器内部,在具有转发关系的Web组件之间共享。这两个方法能够设置Object类型的共享数据。
6.request.getAttribute()方法返回request范围内存在的对象,而request.getParameter()方法是获取http提交过来的数据。
一般是string型用request.getParameter
对象的引用用request.getAttribute

9.MVC的各个部分都有那些技术来实现?如何实现?

MVC分model1和model2:
Model1:
Model1的中心是JSP页面,JSP页面中结合业务逻辑、服务端处理过程和HTML等,这样就在JSP页面中同时实现了业务逻辑和流程控制。从而快速开发。
Model1的优缺点:
优点:简单,快速开发,适用小规模开发;
缺点:业务逻辑和表示逻辑混合在JSP页面中没有进行抽象和分离,JSP负载太大。所以非常不利于应用系统业务的重用和改动,不便于维护。

Model2:
Model 2表示的是基于MVC模式的框架。MVC “Model”代表的是应用的业务逻辑(通过JavaBean,EJB组件实现),“View”是应用的表示面(由JSP页面产生), “Controller ”是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。从而弥补了Model1的不足。
Model2其实是在Model1基础上又抽了一层控制层。
最经典的Model2:jsp + javabean + servlet
Model2优缺点:
优点:具有组件化的优点从而更易于实现对大规模系统的开发和管理。职责划分清晰。
缺点:不适合小项目开发

10.jsp有哪些内置对象?作用分别是什么?

九大内置对象:Page,pageContext,request,response,session,application,out,config,exception。
Page指的是JSP被翻译成Servlet的对象的引用;
pageContext对象可以用来获得其他8个内置对象,还可以作为JSP的域范围对象使用。pageContext中存的值是当前的页面的作用范围;
request代表的是请求对象,可以用于获得客户机的信息,也可以作为域对象来使用,使用request保存的数据在一次请求范围内有效;
Session代表的是一次会话,可以用于保存用户的私有的信息,也可以作为域对象使用,使用session保存的数据在一次会话范围有效;
Application代表整个应用范围,使用这个对象保存的数据在整个web应用中都有效;
Response是响应对象,代表的是从服务器向浏览器响应数据;
Out是JSPWriter是用于向页面输出内容的对象;
Config指的是ServletConfig用于JSP翻译成Servlet后 获得Servlet的配置的对象;
Exception在页面中设置isErrorPage=”true”,即可使用,是Throwable的引用,用来获得页面的错误信息。

11.Http中,get和post方法的区别

浏览器和服务器的交互是通过HTTP协议执行的,而GET和POST也是HTTP协议中的两种方法。
get:
1、GET交互方式是从服务器上获取数据,而并非修改数据,所以GET交互方式是安全的。就像数据库查询一样,从数据库查询数据,并不会影响数据库的数据信息,对数据库来说,也就是安全的。
2、GET交互方式是幂等的,幂等是一个数学概念,幂等函数就是可以使用相同参数重复执行,并且能获得相同结果的函数。在GET交互这里就是,对同一个URL的多个请求,得到的结果是相同的。就像数据库查询,不同的数据库连接对同一个数据库表用相同条件查询时,得到的结果也是一样的。

post:
1、POST交互是可以修改服务器数据的一种方式,涉及到信息的修改,就会有安全问题。就像数据库的更新,Update一个数据库表时,如果条件没有写对,就可能把不需要修改的数据给修改了,得到的数据就是错误的了。
2、一般的POST交互是必须要用到表单的,但是表单提交的默认方法是GET,如果改为POST方式,就需要修改表单提交时的Method。

区别:
GET方式:
1、GET方式是以实体的方式得到由请求URL所指定资源的信息,如果请求URL只是一个数据产生过程,那么最终要在响应实体中返回的是处理过程的结果所指向的资源,而不是处理过程的描述。也就是说,GET的到的信息是资源,而不是资源的处理过程。
2、请的求的数据会附加在URL之后,以?分隔URL和传输数据,多个参数用&连接。URL编码格式采用的是ASCII编码,而不是Unicode,即所有的非ASCII字符都要编码之后再传输。
3、因为URL的长度限制,GET方式传输的数据大小有所限制,传送的数据量不超过2KB。
4、GET方式服务器端用Request.QueryString获取变量的值。
5、GET方式传输的参数安全性低,因为传输的数据会显示在请求的URL中。
POST方式:
1、用来向目的服务器发出请求,要求它接收被附在请求后的实体,并把它当做请求队列中请求URL所指定资源的附加新子项。
2、POST方式将表单内各个字段和内容放置在HTML HEADER中一起传送到Action属性所指定的URL地址,用户是看不到这个过程的。
3、POST方式传送的数据量比较大,一般被默认为没有限制,但是根据IIS的配置,传输量也是不同的。
4、POST方式在服务器端用Request.Form获取提交的数据。
5、POST方式传输的数据安全性较高,因为数据传输不是明显显示的。

12.jsp和servlet的区别、共同点、各自应用的范围?

JSP在本质上就是SERVLET,但是两者的创建方式不一样,Servlet完全是JAVA程序代码构成,擅长于流程控制和事务处理,通过Servlet来生成动态网页很不直观。 JSP由HTML代码和JSP标签构成,可以方便地编写动态网页,因此在实际应用中采用Servlet来控制业务流程,而采用JSP来生成动态网页。在struts框架中,JSP位于MVC设计模式的视图层,而Servlet位于控制层。
JSP是Servlet技术的扩展,本质上就是Servlet的简易方式。JSP编译后是“类servlet”。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP是Java和HTML组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。

13.JDBC访问数据库的基本步骤是什么?

1)加载(注册)数据库驱动(到JVM):Class.forName(“com.mysql.jdbc.Driver”);
2)建立(获取)数据库连接。Connection conn=DriverManager.getConnection(url, username, password);
String url=“jdbc:mysql://localhost:3306/admin”;
3)创建(获取)数据库操作对象。Statement stmt = conn.createStatement();
4)定义操作的SQL语句。
5)执行数据库操作。rs = stmt.executeQuery(sql);
6)获取并操作结果集。while (rs.next()) {…}
7)关闭对象,回收数据库资源(关闭结果集–>关闭数据库操作对象–>关闭连接)。

14.说说preparedStatement和Statement的区别

PreparedStatement:表示预编译的 SQL 语句的对象。
Statement:用于执行静态 SQL 语句并返回它所生成结果的对象。
关系:PreparedStatement继承自Statement,都是接口
区别:PreparedStatement可以使用占位符,是预编译的,批处理比Statement效率高。

对于只执行一次的SQL语句选择Statement是最好的。相反,如果SQL语句被多次执行选用PreparedStatement是最好的。
PreparedStatement: 数据库会对sql语句进行预编译,下次执行相同的sql语句时,数据库端不会再进行预编译了,而直接用数据库的缓冲区,提高数据访问的效率(但尽量采用使用?号的方式传递参数),如果sql语句只执行一次,以后不再复用。 从安全性上来看,PreparedStatement是通过?来传递参数的,避免了拼sql而出现sql注入的问题,所以安全性较好。在开发中,推荐使用 PreparedStatement。
PreparedStatement的第一次执行消耗是很高的。它的性能体现在后面的重复执行。

15.数据库连接池的原理,为什么要使用连接池?

1,数据库连接是一件费时的操作,连接池可以使多个操作共享一个连接。
2,数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量、使用情况,为系统开发,测试及性能调整提供依据。
3,使用连接池是为了提高对数据库连接资源的管理。
https://www.cnblogs.com/newpanderking/p/3875749.html

https://blog.csdn.net/shuaihj/article/details/14223015

连接池的优点:
1、资源重用
2、更快的系统反应速度
3、新的分配方式
4、统一的连接管理,避免数据库连接泄漏

16.什么是幻读,哪种隔离级别可以防止幻读?

https://blog.csdn.net/JIESA/article/details/51317164
幻读是指一个事务多次执行一条查询返回的却是不同的值。假设一个事务正根据某个条件进行数据查询,然后另一个事务插入了一行满足这个查询条件的数据。之后这个事务再次执行了这条查询,返回的结果集中会包含刚插入的那条新数据。这行新数据被称为幻行,而这种现象就叫做幻读。
只有 TRANSACTION_SERIALIZABLE 隔离级别才能防止产生幻读。

17.execute,executeQuery,executeUpdate的区别是什么?

1,Statement的execute(String query)方法用来执行任意的SQL查询,如果查询的结果是一个ResultSet,这个方法就返回true。如果结果不是ResultSet,比如insert或者update查询,它就会返回false。我们可以通过它的getResultSet方法来获取ResultSet,或者通过getUpdateCount()方法来获取更新的记录条数。
2,Statement的executeQuery(String query)接口用来执行select查询,并且返回ResultSet结果集。即使查询不到记录返回的ResultSet也不会为null。我们通常使用executeQuery来执行查询语句,这样的话如果传进来的是insert或者update语句的话,它会抛出错误信息为 “executeQuery method can not be used for update”的java.util.SQLException。 ,
3,Statement的executeUpdate(String query)方法用来执行insert或者update/delete(DML)语句,或者 什么也不返回,对于DDL语句,返回值是int类型,表明受影响的行数,如果是DML语句的话,它就是更新的条数,如果是DDL的话,就返回0。
  只有当你不确定是什么语句的时候才应该使用execute()方法,否则应该使用executeQuery或者executeUpdate方法。

18.AJAX有哪些有点和缺点?

使用Ajax的最大优点,就是能在不更新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变过的信息。
对应用Ajax最主要的缺点就是,它可能破坏浏览器后退按钮的正常行为
因为Ajax中采用了xml技术,所以在Ajax中也可能问到XML的问题。
ajax的优点:
1、最大的一点是无刷新更新页面,用户的体验非常好,减少用户实际和心理等待时间。
2、使用异步方式与服务器通信,具有更加迅速的响应能力。
3、可以把以前一些服务器负担的工作转嫁到客户端,利用客户端闲置的能力来处理,减轻服务器和带宽的负担,提升站点的性能,节约空间和宽带租用成本。ajax的原则是“按需取数据”,可以最大程度的减少冗余请求,和响应对服务器造成的负担。
4、基于标准化的并被广泛支持的技术,不需要下载插件或者小程序。提高Web效率
ajax的缺点:
1、ajax不支持浏览器back按钮,破坏浏览器后退按钮的正常行为。
2、安全问题 AJAX暴露了与服务器交互的细节。
3、对搜索引擎的支持比较弱。
4、破坏了程序的异常机制。
5、不容易调试。

19.AJAX应用和传统Web应用有什么不同?

在传统的Javascript编程中,如果想得到服务器端数据库或文件上的信息,或者发送客户端信息到服务器,需要建立一个HTML form然后GET或者POST数据到服务器端。用户需要点击”Submit”按钮来发送或者接受数据信息,然后等待服务器响应请求,页面重新加载。
因为服务器每次都会返回一个新的页面, 所以传统的web应用有可能很慢而且用户交互不友好。
使用AJAX技术, 就可以使Javascript通过XMLHttpRequest对象直接与服务器进行交互。通过HTTP Request, 一个web页面可以发送一个请求到web服务器并且接受web服务器返回的信息(不用重新加载页面),展示给用户的还是同一个页面,用户感觉页面刷新,也看不到到Javascript后台进行的发送请求和接受响应。

1.用户体验方面:传统Web应用
页面跳转是全页面刷新,用户体验会中断,ajax 页面无刷新 用户体验连贯。
2.开发思维方面:传统 以页面交互为主导,ajax 以数据交互为主导。传统采用 同步响应方式, ajax 采用异步提交的方式。
3.ajax适应平台更广 ,同时将以前需要服务器端完成的部分工作 交给客户端处理 减轻服务器压力。

20.Ajax的原生实现流程是怎样的?

(1)创建XMLHttpRequest对象,也就是创建一个异步调用对象.
(2)创建一个新的HTTP请求,并指定该HTTP请求的方法、URL及验证信息.
(3)设置响应HTTP请求状态变化的函数.
(4)发送HTTP请求.
(5)获取异步调用返回的数据.
(6)使用JavaScript和DOM实现局部刷新.

21.数据库连接池的原理。为什么要使用连接池?

复杂的数据库应用,频繁的建立、关闭连接,会极大的减低系统的性能。
数据库连接池的基本原理是在内部对象池中维护一定数量的数据库连接,并对外暴露数据库连接获取和返回方法
使得一个数据库连接可以得到高效、安全的复用,避免了数据库连接频繁建立、关闭的开销。
优势在于:
1. 资源重用
2. 更快的系统响应速度
3. 新的资源分配手段
4. 统一的连接管理,避免数据库连接泄漏

22.jsp和servlet的区别、共同点、各自应用的范围?

JSP在本质上就是SERVLET,但是两者的创建方式不一样.
Servlet完全是JAVA程序代码构成,擅长于流程控制和事务处理,通过Servlet来生成动态网页很不直观.
JSP由HTML代码和JSP标签构成,可以方便地编写动态网页.
因此在实际应用中采用Servlet来控制业务流程,而采用JSP来生成动态网页.
JSP侧重于视图,Servlet主要用于控制逻辑。

23.static,修饰符

static 修饰的属性 可以被多个实例(对象)所共享,它不依赖与实例。
static 修饰的成员变量被称为静态成员 ,它随类的加载而加载,可以通过 类.属性名 调用,该属性只需赋值一次,后续就可以直接使用
static 修饰的成员方法 与成员变量类似,静态方法只能访问静态成员变量和成员方法 (静态只能访问静态)
static修饰代码块,为静态代码块 JVM在加载类的时候回自动执行该代码块,且该代码块只会执行一次,static 代码块经常被用来初始化静态变量或者用于加载驱动。
static内部类 塔可以不依赖外部类实例对象而被实例化,内部类不能访问外部类普通成员变量,只能访问外部类中的静态成员和静态方法。

修饰符
private 该成员变量或方法为私有的 只有当前所在类或对象有访问权限
friendly 默认 只有当前所在类和当前所在包的类或对象 有访问其成员变量或方法的权限
protected 当前类 当前包 以及不同包中的子类 的类或对象都有访问其成员变量或方法的权限
public 公共的 多有包多有类都可以访问

还有继承 自己找一下!!!!!!!!!

排序 二叉树排序 手写!!!!

2 java SE

1.简单说一下数据库的三范式?

1.第一范式(确保每列保持原子性)
第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。
2.第二范式(确保表中的每列都和主键相关)
第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。(比如要设计一个订单信息表,因为订单中可能会有多种商品,所以要将订单编号和商品编号作为数据库表的联合主键)
3.第三范式(确保每列都和主键列直接相关,而不是间接相关)
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。

2.Java集合框架是什么?说出一些集合框架的优点?

每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector、Stack、HashTable和Array。随着集合的广泛使用,Java1.2提出了囊括所有集合接口、实现和算法的集合框架。在保证线程安全的情况下使用泛型和并发集合类,Java已经经历了很久。它还包括在Java并发包中,阻塞接口以及它们的实现。集合框架的部分优点如下:
(1)使用核心集合类降低开发成本,而非实现我们自己的集合类。
(2)随着使用经过严格测试的集合框架类,代码质量会得到提高。
(3)通过使用JDK附带的集合类,可以降低代码维护成本。
(4)复用性和可操作性。

3.Java集合框架的基础接口有哪些?

Collection为集合层级的根接口。一个集合代表一组对象,这些对象即为它的元素。Java平台不提供这个接口任何直接的实现。

Set是一个不能包含重复元素的集合。这个接口对数学集合抽象进行建模,被用来代表集合,就如一副牌。

List是一个有序集合,可以包含重复元素。你可以通过它的索引来访问任何元素。List更像长度动态变换的数组。

Map是一个将key映射到value的对象.一个Map不能包含重复的key:每个key最多只能映射一个value。

一些其它的接口有Queue、Dequeue、SortedSet、SortedMap和ListIterator。

4.集合框架中的泛型有什么优点?

Java1.5引入了泛型,所有的集合接口和实现都大量地使用它。泛型允许我们为集合提供一个可以容纳的对象类型,因此,如果你添加其它类型的任何元素,它会在编译时报错。这避免了在运行时出现ClassCastException,因为你将会在编译时得到报错信息。泛型也使得代码整洁,我们不需要使用显式转换和instanceOf操作符。它也给运行时带来好处,因为不会产生类型检查的字节码指令。

5.Iterater和ListIterator之间有什么区别?

(1)我们可以使用Iterator来遍历Set和List集合,而ListIterator只能遍历List。
(2)Iterator只可以向前遍历,而ListIterator可以双向遍历。
(3)ListIterator从Iterator接口继承,然后添加了一些额外的功能,比如添加一个元素、替换一个元素、获取前面或后面元素的索引位置。

https://blog.csdn.net/hfismyangel/article/details/78156419

6.我们如何对一组对象进行排序?

1.把对象放进List,通过collection.sort进行排序,但对象要实现compareable接口

2.把对象放在Set集合中,用TreeSet()实现类对集合直接排序

7.hashmap 与 hashtable 的区别

1.继承的父类不同
Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口
2.线程安全性不同
HashMap 线程不安全 hashtable 线程安全
Hashtable不允许为null Hashmap 允许为null
3.两种遍历方式不同
4.内部数组初始化扩容方式不同
HashTable默认容量为11 Hashmap 默认为16
Hashtable扩容时,将容量变为原来的2倍加1,而HashMap扩容时,将容量变为原来的2倍

8.等待唤醒机制

为了更高效的处理一些时间片短,任务量大的任务,我们可能会经常用到多线程。但是多线程的环境下,很容易出现线程并发问题,
线程死锁就是很常见的一种并发问题。为了避免此类问题,我们会用到线程间的通信,而等待唤醒机制,就是线程间通信的一种形式。
( 1 )等待唤醒机制就是用于解决线程间通信的问题的,使用到的3个方法的含义如下:
wait:告诉当前线程放弃执行权,并放弃监视器(锁)并进入阻塞状态,直到其他线程持有获得执行权,并持有了相同的监
视器(锁)并调用notify为止。
notify:唤醒持有同一个监视器(锁)中调用wait的第一个线程,例如,餐馆有空位置后,等候就餐最久的顾客最先入座。
注意:被唤醒的线程是进入了可运行状态。等待cpu执行权。
notifyAll:唤醒持有同一监视器中调用wait的所有的线程。
( 2 )调用wait和notify方法需要注意的细节:
wait方法与notify方法必须要由同一个锁对象调用。因为:对应的锁对象可以通过notify唤醒使用同一个锁对象调用的wait方法后的线程。
wait方法与notify方法是属于Object类的方法的。因为:锁对象可以是任意对象,而任意对象的所属类都是继承了Object类的。
wait方法与notify方法必须要在同步代码块或者是同步函数中使用。因为:必须要通过锁对象调用这2个方法。

9.hashset 与 treeset 的区别

相同点:
单列集合,元素不可重复
不同点
1.底层存储的数据结构不同
HashSet底层用的是HashMap哈希表结构存储,而TreeSet底层用的是TreeMap树结构存储
2.存储时保证数据唯一性依据不同
HashSet是通过复写hashCode()方法和equals()方法来保证的,而HashSet通过Compareable接口的compareTo()方法来保证的
3.有序性不一样
HashSet无序,TreeSet有序
4.存储原理:
HashSet:底层数据结构是哈希表,本质就是对哈希值的存储,通过判断元素的hashCode方法和equals方法来保证元素的唯一性,当hashCode值不相同,就直接存储了,不用在判断equals了,当hashCode值相同时,会在判断一次euqals方法的返回值是否为true,如果为true则视为用一个元素,不用存储,如果为false,这些相同哈希值不同内容的元素都存放一个桶里(当哈希表中有一个桶结构,每一个桶都有一个哈希值)
TreeSet:底层的数据结构是二叉树,可以对Set集合中的元素进行排序,这种结构,可以提高排序性能,根据比较方法的返回值确定的,只要返回的是0.就代表元素重复

10.异常与 错误的区别

Throwable类有两个子类,Error与 Exception。
错误与异常都是在程序编译和运行时出现的错误。不同的是,异常可以被开发人员捕捉和处理;而错误一般是系统错误,一般不需要开发人员处理(也无法处理),比如内存溢出。
Exception是java中所有异常的基类。在java中异常被分为两大类,编译时异常和运行时异常。
编译时异常是由于外在条件不满足而引发的,比如程序视图打开一个并不存在的远程Socket端口。这种异常是可预知的。编译器强制要求对编译时异常进行捕获或声明。
运行时异常往往是系统错误,比如数组下标越界等。通常我们可以不做处理,系统会把它们交给缺省的异常处理程序。 有人说在运行时异常出现后,异常会被一层层向上抛直到找到处理代码,如果我们没有处理运行时异常,异常会被抛到最上层然后抛出,从而导致最上层程序或线程退出。
Error是java中所有错误的基类。错误通常是我们无法处理的,绝大多数情况下,我们不应该试图捕获错误。

11.形参与实参
  1. 形参
    全称为“形式参数”是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传递的参数。
    形参的作用是实现主调函数与被调函数之间的联系,通常将函数所处理的数据,影响函数功能的因素或者函数处理的结果作为形参。没有形参的函数在形参表的位置应该写int main(void) 函数也可以有形参和返回值,其形参也称为命令行参数,由操作系统在启动程序时初始化,其返回值传递给操作系统。
  2. 实参
    实参,全称为"实际参数"是在调用时传递给函数的参数,即传递给被调用函数的值。实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。
12.线程中几种可用状态?实现线程方式?
  1. 新建(new):新创建了一个线程对象。
  2. 可运行(runnable):线程对象创建后,其他线程(比如main线程)调用了该对象 的?start?()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获 取cpu的使用权。
  3. 运行(running):可运行状态(runnable)的线程获得了cpu时间片(timeslice),执行程序代码。
  4. 阻塞(block):
    (一).等待阻塞:运行(running)的线程执行o.wait()方法,JVM会把该线程放入等待队列(waitting queue)中。
    (二).同步阻塞:运行(running)的线程在获取对象的同步锁时,若该同步锁 被别的线程占用,则JVM会把该线程放入锁池(lock pool)中。
    (三).其他阻塞: 运行(running)的线程执行Thread.sleep(long ms)或t.join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。
    当sleep()状态超时、join()等待线程终止或者超时、或者?I?/?O?处理完毕时,线程重新转入可运行(?runnable?)状态。
  5. 死亡(dead):线程run()、main()方法执行结束,或者因异常退出了run()方法,则该线程结束生命周期。死亡的线程不可再次复生。

实现线程的方式
1、继承Thread类创建线程
2、实现Runnable接口创建线程
3、实现Callable接口通过FutureTask包装器来创建Thread线程
4、使用ExecutorService、Callable、Future实现有返回结果的线程

13.线程与进程的区别

根本区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位
1.在开销方面:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;
线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。
2.所处环境:在操作系统中能同时运行多个进程(程序);而在同一个进程(程序)中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行)
3.内存分配方面:系统在运行的时候会为每个进程分配不同的内存空间;而对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源。
4.包含关系:没有线程的进程可以看做是单线程的,如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。

14.TCP与UDP 的区别

TCP/IP协议是一个协议簇。里面包括很多协议的。UDP只是其中的一个
TCP/IP协议集包括应用层,传输层,网络层,网络访问层
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。
如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。
3、UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。
4.每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP对系统资源要求较多,UDP对系统资源要求较少。
UDP以其简单、传输快的优势,在越来越多场景下取代了TCP,如实时游戏。
1)网速的提升给UDP的稳定性提供可靠网络保障,丢包率很低,如果使用应用层重传,能够确保传输的可靠性。
2)TCP为了实现网络通信的可靠性,使用了复杂的拥塞控制算法,建立了繁琐的握手过程,由于TCP内置的系统协议栈中,极难对其进行改进。
采用TCP,一旦发生丢包,TCP会将后续的包缓存起来,等前面的包重传并接收到后再继续发送,延时会越来越大,基于UDP对实时性要求较为严格的情况下,采用自定义重传机制,能够把丢包产生的延迟降到最低,尽量减少网络问题对游戏性造成影响。

整理别人的相关面试

JDBC相关:https://blog.csdn.net/huangyuhua068/article/category/7967874

技巧,试题相关:https://blog.csdn.net/huangyuhua068/article/category/7954232

猜你喜欢

转载自blog.csdn.net/weixin_45044097/article/details/100660643