Java面试宝典

Java SE

Java基础(一)

Java和PHP的区别?

PHP专注于Web开发,在Web后台开发PHP优于Java;Java比较全面,在数据库访问方面强于PHP。

Java适合于开发大型的应用系统,应用的前景比较广阔,系统易维护、可复用性较好。

简单描述一下正则表达式及其用途。

在编写处理字符串的程序时,经常需要查找符合某些复杂规则的字符串。正则表达式就是用于描述这些规则的工具。

Java中是如何支持正则表达式操作的?

Java中的String类提供了支持正则表达式操作的方法,包括:matches()、replaceAll()、replaceFirst()、split()。此外,Java中可以用Pattern类表示正则表达式对象,它提供了丰富的API进行各种正则表达式操作,如compile。

比较一下Java和JavaSciprt?

Java与JavaScript是两个公司开发的不同的两个产品。

  • 面向对象和基于对象

Java是一种真正的面向对象的语言,即使是开发简单的程序,必须设计对象;

JavaScript是基于对象(Object-Based)和事件驱动(Event-Driven)的编程语言,用来制作与网络无关的,与用户交互作用的复杂软件。

  • 编译和解释

Java的源代码在执行之前,必须经过编译;

JavaScript无需编译,由浏览器解释执行。

  • 强类型和弱类型变量

Java采用强类型变量检查,即所有变量在编译之前必须作声明;

JavaScript中变量是弱类型的,甚至在使用变量前可以不作声明,在运行时检查推断其数据类型。

Java中如何跳出当前的多重嵌套循环?

在最外层循环前加一个标记如A,然后用break A,可以跳出多重循环,类似goto。

&和&&的区别?

&运算符有两种用法:(1)按位与;(2)逻辑与。

&&运算符是短路与运算。如果&&左边的表达式的值是false,右边的表达式会被直接短路掉,不会进行运算。

int和Integer有什么区别?

Java是一个近乎纯洁的面向对象编程语言,但是==为了编程的方便还是引入了基本数据类型==,但是为了能够将这些基本数据类型当成==对象==操作,Java为每一个基本数据类型都引入了对应的==包装类型==(wrapper class),int的包装类就是Integer,从Java 5开始引入了自动装箱/拆箱机制,使得二者可以相互转换

在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,请你讲讲如何输出一个某种编码的字符串?

String str = new String("字符串".getBytes("ISO-8859-1"), "GBK");

String和StringBuffer的区别

String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。

String是最基本的数据类型吗?

基本数据类型包括byte、short、int、long、float、double、char、boolean。

java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类。

Java基础(二)

请你谈谈大O符号(big-O notation)并给出不同数据结构的例子

大O符号表示一个程序运行时所需要的渐进时间复杂度上界。

请你讲讲数组(Array)和列表(ArrayList)的区别?什么时候应该使用Array而不是ArrayList?

Array和ArrayList的不同点:
Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。
Array大小是固定的,ArrayList的大小是动态变化的。
ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。

对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。

请你解释什么是值传递和引用传递?

值传递是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量.
引用传递一般是对于对象型变量而言的,传递的是该对象地址的一个副本, 并不是原对象本身。所以对引用对象进行操作会同时改变原对象。

请你讲讲Java支持的数据类型有哪些?什么是自动拆装箱?

基本数据类型包括byte、short、int、long、float、double、char、boolean。

自动装箱是Java编译器在基本数据类型和对应的对象包装类型之间做的一个转化。比如:把int转化成Integer,double转化成Double,等等。反之就是自动拆箱。

请你解释为什么会出现4.0-3.6=0.40000001这种现象?

2进制的小数无法精确的表达10进制小数,计算机在计算10进制小数的过程中要先转换为2进制进行计算,这个过程中出现了误差。

请你讲讲一个十进制的数在内存中是怎么存的?

补码的形式。

Lamda表达式的优缺点。

优点:1. 简洁。2. 非常容易并行计算。3. 可能代表未来的编程趋势。

缺点:1. 若不用并行计算,很多时候计算速度没有比传统的 for 循环快。(并行计算有时需要预热才显示出效率优势)2. 不容易调试。3. 若其他程序员没有学过 lambda 表达式,代码不容易让其他语言的程序员看懂。

1
2
3
4
5
public int add(int x, int y) {
return x + y;
}

(int x, int y) -> x + y

java8的新特性,请简单介绍一下

Lambda 表达式:Lambda允许把函数作为一个方法的参数

方法引用:可以直接引用已有Java类或对象(实例)的方法或构造器。

默认方法:一个在接口里面有了一个实现的方法。

说明符号“==”比较的是什么?

==对比两个对象基于内存引用,如果两个对象的引用完全相同(指向同一个对象)时,==操作将返回true,否则返回false。

==如果两边是基本类型,就是比较数值是否相等。

解释Object若不重写hashCode()的话,hashCode()如何计算出来的?

Object 的 hashcode 方法是本地方法,用C\C++实现的,该方法直接返回对象的 内存地址。

介绍一下map的分类和常见的情况

java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是HashMap、Hashtable、 LinkedHashMap和TreeMap.

Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复。

Hashmap是一个最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。 HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。

Hashtable与 HashMap类似,它继承自Dictionary类,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了 Hashtable在写入时会比较慢。

LinkedHashMap是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序。在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比 LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。

TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。

关键字

Java里面的final关键字是怎么用的?

当用final修饰一个类时,表明这个类不能被继承;如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。

关于Synchronized和lock

synchronized(同步)是Java的关键字,当它用来修饰一个方法或代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。

Lock是一个接口。

介绍一下volatile?

volatile关键字是用来保证有序性和可见性的。

请你介绍一下Syncronized锁,如果用这个关键字修饰一个静态方法,锁住了什么?如果修饰成员方法,锁住了什么?

面向对象(一)

若对一个类不重写,它的equals()方法是如何比较的?

比较对象的地址。

解释hashCode()和equals()方法有什么联系?

➀相等的对象必须具有相等的哈希码(散列码)。

➁如果两个对象的hashCode相同,它们并不一定相同。

什么是构造函数?什么是构造函数重载?什么是复制构造函数?

构造函数,即构造方法,Java中一种特殊的函数。与函数同名,无返回值。用于创建对象时初始化对象。

构造函数重载:可以为一个类创建多个构造函数,每个构造函数必须有它自己唯一的参数列表。

方法重载(Overloading)和方法覆盖(Overriding)是什么意思?

方法重载:同一个类里面两个或者是多个方法的方法名相同但是参数不同的情况。

方法覆盖是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名,返回类型和参数列表。覆盖者可能不会限制它所覆盖的方法的访问。

请说明Query接口的list方法和iterate方法有什么区别?

面向对象的”六原则一法则”

  1. 单一职责原则:一个类只做它该做的事情。
  2. 开闭原则:软件实体应当对扩展开放,对修改关闭。
  3. 依赖倒转原则:面向接口编程。
  4. 里氏替换原则:任何时候都可以用子类型替换掉父类型。
  5. 接口隔离原则:接口要小而专,绝不能大而全。
  6. 合成聚合复用原则:优先使用聚合或合成关系复用代码。
  7. 迪米特法则:迪米特法则又叫最少知识原则,一个对象应当对其他对象有尽可能少的了解。

如何通过反射获取和设置对象私有字段的值?

说明重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?

方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。

重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写(覆盖)发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。

重载对返回类型没有特殊的要求。

两个对象值相同(x.equals(y) == true),但却可有不同的hash code,该说法是否正确,为什么?

不对,如果两个对象x和y满足x.equals(y) == true,它们的哈希码(hash code)应当相同。Java对于eqauls方法和hashCode方法是这样规定的:(1)如果两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同;(2)如果两个对象的hashCode相同,它们并不一定相同。

当然,你未必要按照要求去做,但是如果你违背了上述原则就会发现在使用容器时,相同的对象可以出现在Set集合中,同时增加新元素的效率会大大下降(对于使用哈希存储的系统,如果哈希码频繁的冲突将会造成存取性能急剧下降)。

内部类可以引用他包含类的成员吗,如果可以,有没有什么限制吗?

一个内部类对象可以访问创建它的外部类对象的内容。

类如果不是static的,那么它可以访问创建它的外部类对象的所有属性内部类;如果是static的,即为nested class,那么它只可以访问创建它的外部类对象的所有static属性一般普通类。

Java语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?

一般情况下是用try来执行一段程序,如果出现异常,系统会抛出(throws)一个异常,这时候你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理。

用try来指定一块预防所有”异常”的程序。紧跟在try程序后面,应包含一个catch子句来指定你想要捕捉的”异常”的类型。throw语句用来明确地抛出一个”异常”。throws用来标明一个成员函数可能抛出的各种”异常”。finally为确保一段代码不管发生什么”异常”都被执行一段代码。

说明Java的接口和C++的虚类的相同和不同处。

判断当一个对象被当作参数传递给一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

???

值传递。Java只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。

Java永远只有值传递,引用传递其实也是一个值传递,传递是一个地址的副本,

面向对象(二)

面向对象(三)

Java Web

Web编程基础

JAVA应用服务器都有哪些?

Web服务器:Tomcat、Jetty

Java EE服务器:Bea Weblogic、JBoss

在什么情况下会使用assert?

assertion (断言)在软件开发中是一种常用的调试方式。

assertion检查通常在开发和测试时开启。在实现中,assertion就是在程序中的一条语句,它对一个 boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true。

1分钟之内只能处理1000个请求,你怎么实现,手撕代码?

限流的几种方法:计数器,滑动窗口、漏桶法、令牌桶

如何在链接里不输入项目名称的情况下启动项目?

在taomcat配置虚拟目录。

JSP中的静态包含和动态包含的有哪些区别?

静态包含是通过JSP的include指令包含页面,动态包含是通过JSP标准动作jsp:forward包含页面。

静态包含是编译时包含,动态包含是运行时包含。

表达式语言(EL)的隐式对象以及该对象的作用

EL的隐式对象包括:pageContext、initParam(访问上下文参数)、param(访问请求参数)

JSP有哪些内置对象?以及这些对象的作用分别是什么?

JSP有9个内置对象:

  • request:封装客户端的请求,其中包含来自GET或POST请求的参数;
  • response:封装服务器对客户端的响应;
  • pageContext:通过该对象可以获取其他对象;
  • session:封装用户会话的对象;
  • application:封装服务器运行环境的对象;
  • application:封装服务器运行环境的对象;
  • out:输出服务器响应的输出流对象;
  • config:Web应用的配置对象;
  • page:JSP页面本身(相当于Java程序中的this);
  • exception:封装页面抛出异常的对象。

说说weblogic中一个Domain的缺省目录结构?比如要将一个简单的helloWorld.jsp放入何目录下,然后在浏览器上就可打入主机?

JSP有哪些动作? 这些动作的作用又分别是什么?

JSP 共有以下6种基本动作
jsp:include:在页面被请求的时候引入一个文件。
jsp:forward:把请求转到一个新的页面。
jsp:useBean:寻找或者实例化一个JavaBean。
jsp:setProperty:设置JavaBean的属性。
jsp:getProperty:输出某个JavaBean的属性。
jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记。

详细说明一下Request对象的主要方法是什么?

setAttribute(String name,Object):设置名字为name的request的参数值
getAttribute(String name):返回由name指定的属性值
getAttributeNames():返回request对象所有属性的名字集合,结果是一个枚举的实例
removeAttribute(String name):删除请求中的一个属性

JSP四种会话跟踪技术分别是什么?

page域 数据在一个页面范围内有效,通过pageContext对象访问
request域 数据在一个服务器请求范围内有效,通过request对象访问
session域 数据在一次会话范围内容有效,通过session对象访问
application域 数据在一个应用服务器范围内有效,通过application对象访问

JSP和Servlet有哪些相同点和不同点?另外他们之间的联系又是什么呢?

JSP全称Java Server Pages,是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。

Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。

JSP是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达。JSP编译后是”类servlet”。

Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。

JSP的内置对象以及该对象的使用方法。

request表示HttpServletRequest对象。它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie, header, 和session数据的有用的方法。
response表示HttpServletResponse对象,并提供了几个用于设置送回浏览器的响应的方法(如cookies,头信息等)

web.xml文件中可以配置哪些内容?

web.xml用于配置Web应用的相关信息,如:监听器(listener)、过滤器(filter)、Servlet、相关参数、会话超时时间、安全验证方式、错误页面等。

对Javaweb开发中的监听器的理解?

Java Web开发中的监听器(listener)就是application、session、request三个对象创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件。

过滤器有哪些作用?以及过滤器的用法又是什么呢?

过滤器是一个驻留在服务器端的Web组件,它可以截取客户端和服务器之间的请求与响应信息,并对这些信息进行过滤。

常见的过滤器用途主要包括:对用户请求进行统一认证、对用户的访问请求进行记录和审核、对用户发送的数据进行过滤或替换、转换图象格式。

Web编程原理

get和post请求,并且说说它们之间的区别?

①get请求用来从服务器上获得资源,而post是用来向服务器提交数据;
②get将表单中数据按照name=value的形式,添加到action所指向的URL 后面,并且两者使用”?”连接,而各个变量之间使用”&”连接;post是将表单中的数据放在HTTP协议的请求头或消息体中,传递到action所指向URL;
③get传输的数据要受到URL长度限制(1024字节);而post可以传输大量的数据,上传文件通常要使用post方式;
④使用get时参数会显示在地址栏上,如果这些数据不是敏感数据,那么可以使用get;对于敏感数据还是应用使用post;

转发和重定向之间的区别?

1
2
3
4
5
6
7
// servlet
request.getRequestDispatcher("new.jsp").forward(request, response); //转发到new.jsp
response.sendRedirect("new.jsp"); //重定向到new.jsp

// jsp
<jsp:forward page="apage.jsp" />
<%response.sendRedirect("new.jsp");

转发是服务器行为,重定向是客户端行为。

重定向,其实是两次request。

转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。

重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。

forward 和redirect的区别?

https://blog.csdn.net/weixin_37766296/article/details/80375106

  1. 本质

    forword转发是服务器上的行为,而redirect重定向是客户端的行为

  2. 地址栏

    forward:转发,从服务器转发。因此在客户端的浏览器地址里看不出url的变化
    redirect:重定向,在客户端重新定向了一次,因此在客户端能看出url的变化。

  3. 数据共享
    由于在整个定向的过程中用的是同一个request,因此forward会将request的信息带到被重定向的jsp或者servlet中使用。即可以共享数据

redirect不能共享

  1. 运用

    forword:登录

    redirect:注销或跳转其他网站

Cookie 用于存储 Web 页面的用户信息,如账号、密码。

Session 用于存储关于用户会话(session)的信息。

1、cookie数据存放在客户的浏览器上,session数据放在服务器上。

2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗

考虑到安全应当使用session。

3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用COOKIE。

4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

网络概述

TCP协议、IP协议、HTTP协议分别在哪一层?

运输层,网络层,应用层。


网络七层模型:

物理层,数据链路层,网络层,运输层,会话层,表示层,应用层

网络五层模型:

物理层,数据链路层,网络层,运输层,应用层

img

网络层

ARP协议和ARP攻击

ARP协议(地址解析协议): 将IP地址转换为MAC地址

ARP应答中的IP地址和MAC地址中的信息是可以伪造的,并不一定是自己的真实IP地址和MAC地址,由此,ARP欺骗就产生了。

什么是ICMP协议,它的作用是什么?

ICMP(Internet控制报文)协议。用于在IP主机、路由器之间传递控制消息。

交换机和的区别?

1、工作层次不同,一个是数据链路层,一个是网络层

2、寻址依据不同,一个基于MAC寻址,一个是基于IP寻址

3、交换机分割冲突域,不划分广播域。路由器既可分割冲突域也可分割广播域

4、转发的数据对象不同,交换机转发的是数据帧,路由器转发的是分组报文

运输层

3次握手

4次挥手

TCP为什么要建立连接?

保证可靠传输。

TCP为什么可靠一些

三次握手,超时重传,滑动窗口,拥塞控制。

哪种应用场景会使用TCP协议,使用它的意义

当对网络通讯质量有要求的时候,需要整个数据要准确无误的传递给对方。如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。

应用层

HTTP请求中的304状态码的含义

304(未修改)自从上次请求后,请求的网页未修改过。

SSL四次握手的过程

HTTP1.1和1.0的区别

HTTP请求,并说明应答码502和504的区别

OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送’*’的请求来测试服务器的功能性。

HEAD:向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。

GET:向特定的资源发出请求。

POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的创建和/或已有资源的修改。

PUT:向指定资源位置上传其最新内容。

DELETE:请求服务器删除Request-URI所标识的资源。

TRACE:回显服务器收到的请求,主要用于测试或诊断。

CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。

虽然HTTP的请求方式有8种,但是我们在实际应用中常用的也就是get和post,其他请求方式也都可以通过这两种方式间接的来实现。

502:作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应

504:作为网关或者代理工作的服务器尝试执行请求时,未能及时从上游服务器(URI标识出的服务器,例如HTTP、FTP、LDAP)或者辅助服务器(例如DNS)收到响应。

HTTP和HTTPS的区别

  1. HTTPS需要申请CA证书
  2. HTTP是明文传输,HTTPS是加密的安全传输
  3. 端口不同,HTTP是80,HTTPS是443

浏览器从接收到一个URL,到最后展示出页面,经历了哪些过程。

1.DNS解析 2.TCP连接 3.发送HTTP请求 4.服务器处理请求并返回HTTP报文 5.浏览器解析渲染页面

DNS的寻址过程

1、在浏览器中输入www.oeong.com域名,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析。

2、如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。

3、如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/IP参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。

4、如果本地DNS服务器也失效:

如果未采用转发模式(迭代),本地DNS就把请求发至13台根DNS,根DNS服务器收到请求后,会判断这个域名(如.com)是谁来授权管理,并返回一个负责该顶级域名服务器的IP,本地DNS服务器收到顶级域名服务器IP信息后,继续向该顶级域名服务器IP发送请求,该服务器如果无法解析,则会找到负责这个域名的下一级DNS服务器(如www.oeong.com)的IP给本地DNS服务器,循环往复直至查询到映射,将解析结果返回本地DNS服务器,再由本地DNS服务器返回解析结果,查询完成。

如果采用转发模式(递归),则此DNS服务器就会把请求转发至上一级DNS服务器,如果上一级DNS服务器不能解析,则继续向上请求。最终将解析结果依次返回本地DNS服务器,本地DNS服务器再返回给客户机,查询完成。

从客户端到本地DNS服务器是属于递归查询,而DNS服务器之间就是的交互查询就是迭代查询。

负载均衡 反向代理模式的优点、缺点


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!