面试题:请解释PATH和CLASSPATH的区别?
· PATH是操作系统的路径,windows中使用的是PATH,Linux下用的是/etc/profile;
· CLASSPATH是Java解释程序时所需要的路径,指的是类的加载路径;
面试题:请问在String对象比较的时候“==”和“equals()”的区别?
· “==”:实现的是数值比较,比较的是两个对象的地址数值是否相等;
· “equals()”:是String类中的一个方法,用于比较两个字符串的内容是否相等。
面试题:请解释String类两种实例化方式的区别?
· 直接赋值:只会开辟一块堆内存空间,并且声明的对象可以自动保存在对象池之中,以供相同内容的字符串对象引用;
· 构造方法实例化:会开辟两块堆内存空间,并且有一块堆内存将成为垃圾,此类模式产生的实例化对象,不会自动入池,但是可以通过intern()方法手工入池。
面试题:抽象类与接口的区别
No. | 区别 | 抽象类 | 接口 |
1 | 关键字 | abstract class | interface |
2 | 组成 | 属性、常量、构造、普通方法、抽象方法 | 全局常量、抽象方法 |
3 | 权限 | 可以使用各种权限 | 只能够是public访问权限 |
4 | 子类使用 | 使用extends继承抽象类 | 使用implements实现接口 |
5 | 关系 | 抽象类可以实现多个接口 | 接口不允许继承抽象类,但是一个接口可以继承多个父接口 |
6 | 使用 | 都需要定义有子类,子类一定要覆写所有抽象方法,并且依靠子类对象的向上转型实现抽象类或接口的对象实例化操作 | |
7 | 限制 | 一个子类只能够继承一个抽象类 | 一个子类可以实现多个接口 |
面试题:请解释一下Overloading与Override的区别?在OverLoading时能否改变返回值类型?
No. | 区别 | 重载 | 覆写 |
1 | 定义 | 方法名称相同,参数的类型和个数不同 | 方法名称、参数类型和个数、返回值全部相同 |
2 | 范围 | 发生在一个类之中 | 发生在继承关系类中 |
3 | 权限 | 没有权限要求,可以使用任意权限 | 被子类所覆写的方法不能拥有比父类更为严格的访问控制权限 |
4 | 英文单词 | Overloading | Override |
面试题:this与super的区别?
No. | 区别 | this | super |
1 | 定义 | 调用本类的属性、普通方法、构造方法,如果本类没有指定名称的结构存在,则调用父类 | 由子类直接调用父类的属性、方法、构造,不查找子类本身 |
2 | 约定 | this调用构造时必须放在构造方法首行,表示调用本类构造 | super调用父类构造时,必须放在子类构造方法的首行,而且一定会存在有“super()”的语句 |
3 | 特殊 | 表示当前对象 | - |
面试题:public class 与 class的区别 ?
· “public class”:要求类名称与文件名称保持一致,一个*.java文件里面只允许有一个public class定义,只有定义为public class的类才可以被外部的开发包所使用;
· “class”:类名称可以和文件名称不一致,生成的*.class文件的名称为类名称,在一个*.java文件之中可以保存多个class定义的类,并且编译之后会根据不同的类定义创建出不同的“*.class”文件,如果使用class定义,则类只允许本包访问。
面试题:请解释Error和Exception的区别?
· Error:JVM虚拟机错误,此时的异常无法处理;
· Exception:程序运行中出现的异常,这个时候可以进行处理; 也就是说用户可以处理的异常都是Exception的子类。
面试题:异常处理流程:
· 当程序运行之中产生了异常之后,JVM会根据产生的异常类型,找到与之匹配的XxxException类并且自动创建一个异常类的实例化对象;
· 随后需要判断该程序代码之中是否可以进行异常处理,就是判断是否可以通过try来捕获此异常对象,如果没有相关的异常处理,则程序会中断当前的执行操作,而后交由JVM做默认处理,输出异常信息之后,程序中断执行;
· 如果说现在有异常处理,那么此异常类的实例化对象将会由try语句捕获;
· 随后会交由catch匹配异常类型,根据每一个已经出现的catch类型进行匹配处理,如果此时已经匹配到了合适的catch的异常,那么将会使用此catch中所带的语句进行处理,如果没有匹配上,则继续向后面的catch匹配,那么这个时候就有可能产生两种情况:匹配成功并且正常处理、匹配失败没有处理;
· 不管现在是否匹配catch成功都会将操作交由finall代码执行,进行一些固定的收尾操作;
· 随后在finally代码执行完毕后,会判断此异常是否正常处理,如果正常处理了,则继续向后执行其它代码,如果没有正常处理了,则交由JVM默认处理。
面试题:请解释throw和throws区别?
· throw:表示在方法之中手工抛出异常;
· throws:在方法声明上使用,表示将此方法中有可能出现的异常告诉给调用者,也可以表示本方法不处理异常,交由方法的被调用处处理。
面试题:请解释一下Exception和RuntimeException的区别?请写出几个你常见的RuntimeException?
· RuntimeException是Exception的子类;
· RuntimeException的异常可以不需要强制性进行处理,而非RuntimeException的子类就需要强制性异常处理;
面试题:请解释Comparable和Comparator的区别?
· 如果要进行对象数组的比较处理,那么必须有比较器的支持,比较器有两个:Comparable、Comoparator;
· java.lang.Comparable是在类定义的时候实现好的接口,里面只定义有一个compareTo()方法;
· java.util.Comparator属于挽救的比较器接口,需要单独定义一个比较规则类,里面有一个compare()方法,在JDK 1.8开始将其定义为函数式接口。
面试题:请解释Thread与Runnable实现多线程的区别?
面试题:请解释多线程的两种实现模式?
· 多线程的操作一定需要一个线程的主体类,那么这个类可以继承Thread或实现Runnable接口,但是如果使用了继承Thread类的方式处理,则一定会造成单继承局限,所以开发之中优先考虑使用Runnable实现多线程处理;
· 使用Runnable要比Thread类更加清楚的描述多个线程的数据共享这一概念。
面试题:请说明线程的状态控制
1、线程对象使用new来进行创建,但是对于JVM而言,此时也只是创建了一个线程类的对象而已,这个对象还没有意义;
2、当线程对象调用了start()之后才表示线程已经启动了,但是此时可能有20个线程同时调用start(),所以调用了start()不表示你就可以执行了;
3、所有的线程调用了start()之后将进入到就绪状态,等待系统分配资源(等着抢占资源);
4、抢占到资源的线程开始执行,但是一个线程并不能够一直占用资源,而是需要进行轮流运行,所以当一个线程运行一段时间(不固定)之后,那么就会让出资源,虽有其它线程继续开始抢占。
5、如果此时线程的操作执行完毕(run()执行完了),那么将进入到结束状态。
面试题:请问多个线程访问同一资源时需要注意什么?可能带来那些问题?
· 多个线程访问同一资源必须考虑同步问题,同步可以使用synchronized定义方法或代码块;
· 过多的同步可能会造成死锁。
面试题:请解释wait()和sleep()的区别?
· wait()是Object类中定义的方法,必须通过notify()、notifyAll()唤醒;
· sleep()是Thread类中的static方法,到时间之后可以自动唤醒。
面试题:请说明线程池的创建
·普通的执行线程池接口:java.util.concurrent.ExecutorService;
·调度线程池接口:java.util.concurrent.ScheduledExecutorService;
线程池创建的核心的功能类(用户直接使用的):java.util.concurrent.Executors,提供有如下的方法:
· 创建无大小限制的线程池:public static ExecutorService newCachedThreadPool();
· 创建固定大小的线程池:public static ExecutorService newFixedThreadPool(int nThreads);
· 创建单线程池:public static ExecutorService newSingleThreadExecutor();
· 创建定时调度池:public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)。
面试题:请解释ArrayList 与LinkedList 的区别?
· ArrayList 和LinkedList 都属于List 接口的子类;
· ArrayList 是针对于数组的包装,而LinkedList 是针对于链表的包装;
· ArrayList 的时间复杂度为1,而LinkedList 时间复杂度为n。
面试题:请解释ArrayList 与Vector 区别?
· ArrayList:JDK 1.2 版本提供,属于非线程安全的操作,性能更高。ArrayList 支持Iterator、ListIterator、foreach 输出;
· Vector:JDK 1.0 版本提供,属于线程安全操作,性能相对较低。Vector 支持Iterator、ListIterator、foreach、Enume
面试题:请解释HashSet与TreeSet区别?
· HashSet保存的数据无序,而TreeSet保存的数据有序;
· HashSet允许存放有一个null,而TreeSet不允许存放null。
面试题:请解释HashMap 与Hashtable 的区别?
· HashMap 是JDK 1.2 提供的,属于非线程安全的操作,允许key 或value 保存null;
· Hashtable 是JDK 1.0 提供的,属于线程安全的操作,不允许key 或者是value 保存nul,会造成NullPointerException。
从JDK 1.8 开始,如果在HashMap 里面保存的数据量过大的时候,会自动将Map 集合变为红黑树(均衡二叉树)以保证查询速度。
面试题:请解释Map 如何使用Iterator 输出
· 利用Map 接口中的entrySet()方法将Map 集合变为Set 集合;
· Set 接口之中提供有iterator()方法,可以利用此方法将Set 集合使用Iterator 输出;
· 利用Iterator 迭代后取出每一个的Map.Entry 对象,并且进行key 与value 的分离。
面试题:请解释Collection与Collections的区别?
· Collection是集合的接口,定义有List、Set子接口;
·Collections是一个集合的工具类,可以方便的操作List、Set、Map等接口。
面试题:请解释enum 和Enum 的区别?
· enum 是JDK 1.5 之后追加的一个关键字;
· Enum 属于一个枚举的抽象类,也是在JDK 1.5 之后追加;
· 使用enum 定义的枚举就相当于一个类继承了Enum 类而已。
面试题:请解释int和Integer的区别?
· int的包装类为Integer,而且有了自动装箱处理之后,利用包装类可以使得Object接收int;
· Integer与int相比可以将数据设置为null。
面试题:请写出Proxy设计模式?
把静态代理写出来,并且详细区分静态代理的问题;
把动态代理写出来,并且说明一点,Java中的动态代理设计需要以接口为操作依据,而使用CGLIB可以利用共同的父类来实现动态代理设计模式。
面试题:运行时数据区分为几块内存空间:
· 堆内存:保存所有引用数据类型的真实信息;
· 栈内存:基本类型、运算、指向堆内存的指针;
· 方法区:所有定义的方法的信息都保存在方法区之中,此区属于共享区;
· 程序计数器:是一个非常小的内存空间,小的可以忽略;、
· 本地方法栈:每一次执行递归的方法处理的时候实际上都会将上一个方法入栈;
面试题:JVM的启动有两种模式:
· “-server”:服务器模式,占用的内存大、启动速度慢,默认模式;
· “-client”:本地单机运行程序模式,启动的速度快。
面试题:JVM 堆内存分为了哪几块:
· 年轻代:新对象和没达到一定年龄的对象都在年轻代;
· 老年代:被长时间使用的对象,老年代的内存空间应该要比年轻代更大;
· 元空间:像一些方法中的操作临时对象等,直接使用物理内存;
面试题:GC 的处理流程
1、 当现在有一个新的对象产生,那么对象一定需要内存空间,于是现在就需要为该对象进行内存空间的申请;
2、 首先会判断伊甸园区是否有内存空间,如果此时有内存空间,则直接将新对象保存在伊甸园区;
3、 但是如果此时伊甸园区的内存空间不足,那么会自动执行一个Minor GC 操作,将伊甸园区的无用内存空间进行清理,清理之
后会继续判断伊甸园区的内存空间是否充足?如果内存空间充足,则将新的对象直接在伊甸园区进行空间分配;
4、 如果执行了Minor GC 之后发现伊甸园区的内存依然不足,那么这个时候会进行存活区判断,如果存活区有剩余空间,则将伊
甸园区的部分活跃对象保存在存活区,那么随后继续判断伊甸园区的内存空间是否充足,如果充足,则在伊甸园区进行新对象的空
间分配;
5、 如果此时存活区也已经没有内存空间了,则继续判断老年区,如果此时老年区空间充足,则将存活区中的活跃对象保存到老
年代,而后存活区就会存现有空余空间,随后伊甸园区将活跃对象保存在存活区之中,而后在伊甸园区里为新对象开辟空间;
6、 如果这个时候老年代也满了,那么这个时候将产生Major GC(Full GC),进行老年代的内存清理。
7、 如果老年代执行了Full GC 之后发现依然无法进行对象的保存,就会产生OOM 异常“OutOfMemoryError”。
面试题:一般什么时候会发生GC?如何处理?
Java中的GC会有两种回收:年轻代的Minor GC,另外一个就是老年代的Full GC;
新对象创建时如果伊甸园空间不足会触发Minor GC,如果此时老年代的内存空间不足会触发Full GC,如果空间都不足抛出OutOfMemoryError。
面试题:如果整个Java项目运行缓慢,你该如何解决?
避免堆内存的伸缩空间进行操作,将初始化内存空间与整体堆内存空间大小设置为一一样,使用“-Xms”、“-Xmx”
面试题:当一个对象非常大的时候,请问是如何保存的?
该对象将直接保存在老年代。
面试题:请问gc()方法执行时执行的是何种GC处理?
一定会产生Full GC。
面试题:StackOverflowError和OutOfMemoryError什么时候出现?
面试题: Java引用类型
· 强引用:当内存不足的时候,JVM宁可出现OutOfMemory错误停止,也需要进行保存,并且不会将此空间回收;
· 软引用:当内存不足的时候,进行对象的回收处理,往往用于高速缓存中; 特点在于:不足时回收,不充足时不回收
· 弱引用:不管内存是否紧张,只要有垃圾产生了,那么立即回收; 只要一进行GC处理,那么所引用的对象将会被立刻回收
· 幽灵引用:和没有引用是一样的。 、
面试题:请解释JSP之中两种包含的区别?
· 静态包含:先包含后处理;
|- 语法:<%@include file="包含路径"%>
· 动态包含:可以自动的判断被包含的是静态页还是动态页,如果是静态页则采用先包含后处理的模式(被包含页面中的所有JSP代码将不会被执行),而如果是动态页面,则使用先处理后包含的模式;
|- 语法: <jsp:include page="包含文件路径">
<jsp:param name="参数名称" value="参数内容"/>
<jsp:param name="参数名称" value="参数内容"/> ...
</jsp:include>
面试题:九个内置对象
No. | JSP内置对象 | 类型 | 描述 |
1 | request | javax.servlet.http.HttpServletRequest | 服务器端接收客户端发送来的请求 |
2 | response | javax.servlet.http.HttpServletResponse | 服务器端对客户端的回应处理 |
3 | session | javax.servlet.http.HttpSession | 描述的是个人的信息 |
4 | application | javax.servlet.ServletContext | 描述的是整个WEB容器 |
5 | pageContext | javax.servlet.jsp.PageContext | 描述的是一个JSP页面 |
6 | config | javax.servlet.ServletConfig | 取得一些初始化配置操作 |
7 | out | javax.servlet.jsp.JspWriter | 实现页面的显示输出,输出的内容都变为HTML |
8 | page | java.lang.Object | 整个页面的对象表示 |
9 | exception | java.lang.Throwable | 每个JSP页面都不会强制性的要求进行异常处理 |
·pageContext:javax.servlet.jsp.PageContext
|- pageContext对象只允许在JSP页面之中使用,并且可以进行forward()、include()等操作,还可以操作九个内置对象;
|- 设置和取得属性:public void setAttribute(String name,Object value)、public Object getAttri
·request:javax.servlet.http.HttpServletRequest
|- 主要是服务器端接收客户端发送来的请求数据,请求的数据可能是表单数据也可能是头信息;
|- 设置和取得属性:public void setAttribute(String name,Object value)、public Object getAttribute(String name);
|- 取得所有请求参数名称:public Enumeration<String> getParameterNames();
|- 设置请求编码:public void setCharacterEncoding(String charset) throws UnSupportedEncodingException;
|- 取得上下文路径:public String getContextPath();
|- 取得全部的Cookie数据:public Cookie [] getCookies();
·response:javax.servlet.http.HttpServletResponse
|- 服务器端对客户端的回应处理;
|- 设置头信息:public void setHeader(String name,String value);
|- 设置cookie:public void addCookie(Cookie c);
|- 取得输出流:public Writer getWriter();
|- 设置回应编码:public void setCharacterEncoding(String charset) throws UnSupportedEncodingException;
·session:javax.servlet.http.HttpSession;
|- 主要是进行用户的登录检测处理;
|- 设置和取得属性:public void setAttribute(String name,Object value)、public Object getAttribute(String name);
|- session失效:public void invalidate();
·application:javax.servlet.ServletContext;
|- 是进行整个WEB上下文的处理操作;
|- 取得真实路径:public String getRealPath(String path);
·config:javax.servlet.ServletConfig;
|- 可以取得web.xml文件里面配置的初始化参数内容;
|- 取得初始化参数:public String getInitParameter(String param)。
·out:javax.servlet.jsp.JspWriter;
·exception:java.lang.Throwable;
·page:java.lang.Object。
面试题:请解释JSP之中两种跳转的区别?
· 客户端跳转:跳转之后地址栏变为目标路径,无法传递request属性,整个页面执行完毕后才进行跳转;
|- 语法:超连接(html)、window.location(js)、response.sendRedirect(JSP);
· 服务器端跳转:跳转之后地址栏不会发生改变,可以传递request属性,无条件跳转,跳转之后的代码不执行;
|- 语法:<jsp:forward page="路径"/>。
请问GenericServlet和HttpServlet有什么区别?
GenericServlet属于HttpServlet的父类,本身不受协议控制,而HttpServlet只为http服务;
HttpServlet中的service()方法负责分配用户请求的处理,以找到与之匹配的doXxx()方法;
1、 请问如果覆写了HttpServlet类中的service()方法会怎么样?
所有的doGet()或者是doPost()方法将无法使用。
面试题:请解释HTML与XML的区别?
· HTML可以更加方便的实现数据的显示处理操作;
· XML更多的是进行数据结构的描述,主要的功能是进行数据交互使用。
面试题:请解释DOM与SAX的区别?
· DOM(Document Object Module)属于W3C定义的XML文件的处理标准,本身可以实现数据的读取与修改功能,但是内存中需要形成DOM树,所以不适合于读取大型文件;
· SAX(Simple API for XML)属于民间标准,采用顺序式的方式实现XML读取处理,本身由于不会全部将数据加载到内存之中,所以适合于大文件的读取,但是SAX不允许修改文件。
面试题:请问eval()和JSON.parse()有什么区别?
· JavaScript之中只提供有一个eval()函数实现字符串与JSON的转换;
· JSON.parse()函数实际上是使用一些正则判断后才进行了eval()调用处理,如果正则判断出问题则会抛出异常对象。