Java题目随笔

1. 这几种引用级别由高到低分别为:强引用、软引用、弱引用和虚引用。

强引用:

平时我们编程的时候例如:Object object=new Object();那object就是一个强引用了。如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它。当内存空 间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。

软引用(SoftReference):

如果一个对象只具有软引用,那就类似于可有可物的生活用品。如果内存空间足够,垃圾回收器就不会回收它,如果内存 空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。 软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收,Java虚拟机就会把这个软引用加入到与之关联 的引用队列中。

弱引用(WeakReference):

如果一个对象只具有弱引用,那就类似于可有可物的生活用品。弱引用与软引用的区别在于:只具有弱引用的对象拥有更 短暂的生命周期。在垃圾回收器线程扫描它 所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程, 因此不一定会很快发现那些只具有弱引用的对象。 弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联 的引用队列中。

虚引用(PhantomReference):

“虚引用”顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象 仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收。 虚引用主要用来跟踪对象被垃圾回收的活动。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列 (ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之 关联的引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。程序如果发现某个虚引用已经被加入到引用队 列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。

 

2 三次握手,四次挥手

3次握手过程状态:

LISTEN: 这个也是非常容易理解的一个状态,表示服务器端的某个SOCKET处于监听状态,可以接受连接了。

SYN_SENT: 当客户端SOCKET执行CONNECT连接时,它首先发送SYN报文,因此也随即它会进入到了SYN_SENT状态,并等待服务端的发送三次握手中的第2个报文。SYN_SENT状态表示客户端已发送SYN报文。(发送端)

 

SYN_RCVD: 这个状态与SYN_SENT遥想呼应这个状态表示接受到了SYN报文,在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂,基本上用netstat你是很难看到这种状态的,除非你特意写了一个客户端测试程序,故意将三次TCP握手过程中最后一个 ACK报文不予发送。因此这种状态时,当收到客户端的ACK报文后,它会进入到ESTABLISHED状态。(服务器端)

ESTABLISHED:这个容易理解了,表示连接已经建立了。

4次挥手过程状态:(可参考下图)

 

 

FIN_WAIT_1: 这个状态要好好解释一下,其实FIN_WAIT_1和FIN_WAIT_2状态的真正含义都是表示等待对方的FIN报文。而这两种状态的区别是:FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET即进入到FIN_WAIT_1状态。而当对方回应ACK报文后,则进入到FIN_WAIT_2状态,当然在实际的正常情况下,无论对方何种情况下,都应该马上回应ACK报文,所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态还有时常常可以用netstat看到。(主动方)

FIN_WAIT_2:上面已经详细解释了这种状态,实际上FIN_WAIT_2状态下的SOCKET,表示半连接,也即有一方要求close连接,但另外还告诉对方,我暂时还有点数据需要传送给你(ACK信息),稍后再关闭连接。(主动方)

TIME_WAIT: 表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。如果FIN_WAIT_1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。(主动方)

CLOSING(比较少见): 这种状态比较特殊,实际情况中应该是很少见,属于一种比较罕见的例外状态。正常情况下,当你发送FIN报文后,按理来说是应该先收到(或同时收到)对方的 ACK报文,再收到对方的FIN报文。但是CLOSING状态表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。什么情况下会出现此种情况呢?其实细想一下,也不难得出结论:那就是如果双方几乎在同时close一个SOCKET的话,那么就出现了双方同时发送FIN报文的情况,也即会出现CLOSING状态,表示双方都正在关闭SOCKET连接。

CLOSE_WAIT: 这种状态的含义其实是表示在等待关闭。怎么理解呢?当对方close一个SOCKET后发送FIN报文给自己,你系统毫无疑问地会回应一个ACK报文给对方,此时则进入到CLOSE_WAIT状态。接下来呢,实际上你真正需要考虑的事情是察看你是否还有数据发送给对方,如果没有的话,那么你也就可以 close这个SOCKET,发送FIN报文给对方,也即关闭连接。所以你在CLOSE_WAIT状态下,需要完成的事情是等待你去关闭连接。(被动方)

LAST_ACK: 这个状态还是比较容易好理解的,它是被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。当收到ACK报文后,也即可以进入到CLOSED可用状态了。(被动方)

 

CLOSED: 表示连接中断。

TCP的具体状态图可参考:

3 proc文件系统

Linux系统上的/proc目录是一种文件系统,即proc文件系统。与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。 

 

基于/proc文件系统如上所述的特殊性,其内的文件也常被称作虚拟文件,并具有一些独特的特点。例如,其中有些文件虽然使用查看命令查看时会返回大量信息,但文件本身的大小却会显示为0字节。此外,这些特殊文件中大多数文件的时间及日期属性通常为当前系统时间和日期,这跟它们随时会被刷新(存储于RAM中)有关。

[root@rhel5 ~]# ll /proc  total 0  dr-xr-xr-x  5 root      root              0 Feb  8 17:08 1  dr-xr-xr-x  5 root      root              0 Feb  8 17:08 10  dr-xr-xr-x  5 root      root              0 Feb  8 17:08 11  dr-xr-xr-x  5 root      root              0 Feb  8 17:08 1156  dr-xr-xr-x  5 root      root              0 Feb  8 17:08 139  dr-xr-xr-x  5 root      root              0 Feb  8 17:08 140  dr-xr-xr-x  5 root      root              0 Feb  8 17:08 141  dr-xr-xr-x  5 root      root              0 Feb  8 17:09 1417  dr-xr-xr-x  5 root      root              0 Feb  8 17:09 1418 

 

[root@rhel5 ~]# ll /proc/2674  total 0  dr-xr-xr-x 2 root root 0 Feb  8 17:15 attr  -r-------- 1 root root 0 Feb  8 17:14 auxv  -r--r--r-- 1 root root 0 Feb  8 17:09 cmdline  -rw-r--r-- 1 root root 0 Feb  8 17:14 coredump_filter  -r--r--r-- 1 root root 0 Feb  8 17:14 cpuset  lrwxrwxrwx 1 root root 0 Feb  8 17:14 cwd -> /var/run/saslauthd  -r-------- 1 root root 0 Feb  8 17:14 environ  lrwxrwxrwx 1 root root 0 Feb  8 17:09 exe -> /usr/sbin/saslauthd  dr-x------ 2 root root 0 Feb  8 17:15 fd  -r-------- 1 root root 0 Feb  8 17:14 limits  -rw-r--r-- 1 root root 0 Feb  8 17:14 loginuid  -r--r--r-- 1 root root 0 Feb  8 17:14 maps  -rw------- 1 root root 0 Feb  8 17:14 mem  -r--r--r-- 1 root root 0 Feb  8 17:14 mounts  -r-------- 1 root root 0 Feb  8 17:14 mountstats  -rw-r--r-- 1 root root 0 Feb  8 17:14 oom_adj  -r--r--r-- 1 root root 0 Feb  8 17:14 oom_score  lrwxrwxrwx 1 root root 0 Feb  8 17:14 root -> /  -r--r--r-- 1 root root 0 Feb  8 17:14 schedstat  -r-------- 1 root root 0 Feb  8 17:14 smaps  -r--r--r-- 1 root root 0 Feb  8 17:09 stat  -r--r--r-- 1 root root 0 Feb  8 17:14 statm  -r--r--r-- 1 root root 0 Feb  8 17:10 status  dr-xr-xr-x 3 root root 0 Feb  8 17:15 task  -r--r--r-- 1 root root 0 Feb  8 17:14 wchan 

 

4 进程线程区别

1) 简而言之,一个程序至少有一个进程,一个进程至少有一个线程.

2) 线程的划分尺度小于进程,使得多线程程序的并发性高。

3) 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

4) 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

5) 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

引入线程带来的主要好处:

(1) 在进程内创建、终止线程比创建、终止进程要快;

(2) 同一进程内的线程间切换比进程间的切换要快,尤其是用户级线程间的切换。

5 sds 数据结构redis

每个 sds.h/sdshdr 结构表示一个SDS值:

struct sdshdr {       //记录buff数组中已使用字节的数量 等于sds所保存字符串长度       int len;       //记录buff数组中未使用字节的数量       int free;       //字节数组,保存字符串       char buf[]; }

SDS也是以''表示结束, 这一个字节不会计入已使用的长度. 这样做的好处是可以重用C字符串函数库里面的一部分函数.

 

6、get 和post 的区别?

答:Form 中的get 和post 方法,在数据传输过程中分别对应了HTTP 协议中的GET 和POST 方法。二者主要区别如下:

1)Get 是用来从服务器上获得数据,而Post 是用来向服务器上传递数据;

2)Get 将表单中数据按照variable=value 的形式,添加到action 所指向的URL 后面,并且两者使用“?”连接,而各个变量之间使用“&”连接;Post 是将表单中的数据放在form 的数据体中,按照变量和值相对应的方式,传递到action所指向URL;

3)Get 是不安全的,因为在传输过程,数据被放在请求的URL 中;Post 的所有操作对用户来说都是不可见的;

4)Get 传输的数据量小,这主要是因为受URL 长度限制;而Post 可以传输大量的数据,所以在上传文件只能使用Post;

5)Get 限制Form 表单的数据集必须为ASCII 字符,而Post 支持整个ISO10646字符集;

6)Get 是Form 的默认方法。

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

答:MVC 是Model-View-Controller 的简写。"Model" 代表的是应用的业务逻辑(通过JavaBean,EJB 组件实现), "View" 是应用的表示面(由JSP 页面产生),"Controller" 是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。

8、过滤器的用法?(对客户端的请求统一编码和对客户端进行认证)

答:首先要实现(implements)Filter 接口,同时覆盖Filter 接口的三个方法:

init(FilterConfig config) //用于获得FilterConfig 对象;

doFilter(ServletRequest request, ServletResponse response,

FilterChain chain) //进行过滤处理一些业务;

destroy() //销毁Filter。

9、简述HttpSession 的作用、使用方法,可用代码说明。

答:HttpSession 中可以跟踪并储存用户信息,把值设置到属性中,有2 个方法:setAttribute(),getAttrribute();

例如:在一个方法中用session.setAttribute(“student”,student);在session 中设置一个属性名为student,值为一个名为student 的对象。而后可在同一session 范围内用getAttribute(“student”)取出该属性,得到student对象。

10、javascript 的优缺点和内置对象

答:1)优点:简单易用,与Java 有类似的语法,可以使用任何文本编辑工具编写,只需要浏览器就可执行程序,并且事先不用编译,逐行执行,无需进行严格的变量声明,而且内置大量现成对象,编写少量程序可以完成目标;

2)缺点:不适合开发大型应用程序;

3)Javascript 有11 种内置对象:Array、String、Date、Math、Boolean、Number、Function、Global、Error、RegExp、Object。

 

基本概念

1、操作系统中 heap 和 stack 的区别

堆:堆空间一般由程序员来分配,可以由垃圾回收机制来回收。一般用来存放new创建的对象和数组。 栈:栈是“后进先出”的存储空间,一般用来存储基本类型的数据和对象的引用。

2、什么是基于注解的切面实现

用注解的方式实现的面向切面编程(AOP),可以在某个方法的执行前或者执行后插入一些代码(例如日志功能的代码)。

3、什么是 对象/关系 映射集成模块

对象/关系映射(ORM):是指将程序中的对象自动持久化到关系型数据库中

4、什么是 Java 的反射机制

反射机制:是指程序可以在运行时 访问 或 修改 它本身状态和方法的这种能力。

5、什么是 ACID

A:atom 原子性 C:consistency 一致性 I:isolation 隔离性 D:durability 持久性

6、BS与CS的联系与区别

C/S(Client/Server):是指需要安装的客户端应用程序。 B/S(Brower/Server):是指可以用浏览器直接访问的应用程序。

7、Cookie 和 Session 的区别

Cookie:是把数据保存在浏览器本地,并随着每一次请求发送到服务器。 Session:是把用户数据保存在服务器端。

8、fail-fast 与 fail-safe 机制有什么区别

fail-fast(快速失败):快速失败机制在遍历一个集合时,如果集合内容被修改,会抛出ConcurrentModificationException异常。 fail-safe(安全失败):安全失败机制对集合的任何修改都会在一个复制的集合上进行,因此不会抛出异常。

9、get 和 post请求的区别

get: 1、请求的参数会附加在URL之后,多个参数用 & 连接。 2、因为URL的长度限制,get 方式传输的数据大小有所限制。 3、安全性低,因为传输的数据会显示在请求的URL中。 post: 1、将请求参数放置在 HTTP 数据包,发送给服务器。 2、传送的数据量比较大 3、安全性较高

10、Interface 与 abstract 类的区别

1、接口(Interface)需要被实现,抽象类(abstract类)需要被继承。 2、一个类可以实现多个接口,但一个类只能继承一个抽象类。 3、接口里面的方法全部是抽象的,抽象类里面可以有非抽象的方法。

11、IoC的优点是什么

IoC(控制反转)的优点是:我们需要使用一个对象的时候无需自己创建,可以从IoC容器中直接获取一个对象,然后直接使用。

12、IO 和 NIO 的区别,NIO的优点

1、IO是面向流的,NIO是面向缓冲区的。 2、IO是阻塞的,NIO是非阻塞的。 3、NIO有选择器机制,可以让一个线程来监视多个IO通道。 NIO的优点: 1、不需要使用 read() 或者 write() 就可以处理文件内容。 2、NIO的处理效率很快。

13、Java 8 / Java 7 为我们提供了什么新功能

Java7 新特性: 1、switch里面的case条件可以使用字符串了 2、运用 List\<String\> tempList = new ArrayList<>(); 即泛型实例化类型自动推断 Java8 新特性: 1、Java8 允许我们给接口添加一个非抽象的方法实现,只需要使用 default 关键字即可 2、lambda 表达式

14、什么是竞态条件?举个例子说明。

当两个线程竞争同一资源时,如果对资源的访问顺序敏感,就称存在竞态条件。

15、JRE、JDK、JVM 及 JIT 之间有什么不同

JVM(java 虚拟机):JVM 处理字节码文件,让 java 语言实现跨平台。 JRE(java运行时环境):JRE 是 JVM 的一个超集。 JDK(java开发工具箱):JDK 包含了 JRE 和 Java的开发环境。 JIT(即时编译器):即时编译器是种特殊的编译器,它通过把字节码变成机器码来提高JVM的效率。

16、MVC 的各个部分都用哪些技术来实现?如何实现?

Model层:可以用普通的 JavaBean 来实现。 View层:可以用 JSP 或者 JS 来实现。 Controller层:可以用 Struts2 或者 Spring MVC 来实现。

17、RPC 通信 和 RMI 区别

RPC(remote procedure call),即远程过程调用。 RMI(remote method invocation),即远程方法调用。 两者的实质都是调用远程的服务,只不过RPC是用面向过程的语言如C语言实现,而RMI是用面向对象的语言如Java实现。

18、什么是 Web Service(Web服务)

Web Service 就是通过网络调用其他网站的资源。

19、JSWDL 开发包的介绍。JAXP、JAXM的解释。SOAP、UDDI、WSDL解释。

JAXP:(Java API for XML Parsing) 定义了在Java中使用DOM, SAX, XSLT的通用的接口。这样在你的程序中你只要使用这些通用的接口,当你需要改变具体的实现时候也不需要修改代码。 JAXM:(Java API for XML Messaging) 是为SOAP通信提供访问方法和传输机制的API。 SOAP:即简单对象访问协议(Simple Object Access Protocol),它是用于交换XML编码信息的轻量级协议。 UDDI:UDDI的目的是为电子商务建立标准;UDDI是一套基于Web的、分布式的、为Web Service提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web Service注册,以使别的企业能够发现的访问协议的实现标准。 WSDL:是一种 XML 格式,用于将网络服务描述为一组端点,这些端点对包含面向文档信息或面向过程信息的消息进行操作。这种格式首先对操作和消息进行抽象描述,然后将其绑定到具体的网络协议和消息格式上以定义端点。相关的具体端点即组合成为抽象端点(服务)。

20、WEB容器主要有哪些功能?并请列出一些常见的WEB容器名字。

WEB容器的功能:通信支持、管理servlet的生命周期、多线程支持、jsp支持(将jsp翻译成java) 常见的WEB容器:Tomcat、WebLogic、WebSphere

21、一个".java"源文件中是否可以包含多个类(不是内部类)?有什么限制

可以,一个“.java”源文件里面可以包含多个类,但是只允许有一个public类,并且类名必须和文件名一致。

22、简单说说你了解的类加载器。是否实现过类加载器

类加载器负责加载Java类的字节码到Java虚拟机中。 自己实现类加载器一般需要继承 java.lang.ClassLoader ,覆写 findClass(String name)方法。

23、解释一下什么叫AOP(面向切面编程)

AOP(Aspect Oriented Programming),即面向切面编程,它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是将那些与业务无关,却为业务模块所共同调用的逻辑封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。

24、请简述 Servlet 的生命周期及其相关的方法

①实例化阶段:服务器对Servlet进行实例化,调用Servlet的构造方法 ②初始化阶段:服务器调用Servlet的init方法进行初始化(只在第一次请求时调用)。 ③请求处理阶段:服务器调用Servlet的service方法,然后根据请求方式调用相应的doXXX方法。 ④服务终止阶段:服务器调用Servlet的destroy方法销毁Servlet实例

25、请简述一下 Ajax 的原理及实现步骤

Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),通过在后台与服务器进行少量数据交换,可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。 原理:HTTP协议的异步通信 实现步骤: 1、创建一个XMLHttpRequest对象 2、调用该对象的open方法 3、设置回调函数

26、简单描述 Struts 的主要功能

1、获取表单内容,并组织生成参数对象 2、根据请求的参数转发请求给适当的控制器 3、在控制器中调用业务接口 4、将业务接口返回的结果包装起来发送给指定的视图,并由视图完成处理结果的展现 5、做一些简单的校验或是国际化工作

27、什么是 N 层架构

N层架构是一种软件抽象的层次结构,是对复杂软件的一种纵向切分,每一层次中完成同一类型的操作,以便将各种代码根据其完成的使命来进行分割,以降低软件的复杂度,提高其可维护性。一般来说,层次之间是向下依赖的,下层代码未确定其接口前,上层代码是无法开发的,下层代码接口的变化将使上层的代码一起变化。

28、什么是 CORBA?用途是什么

CORBA(Common Object Request Broker Architecture 公共对象请求代理体系结构)是由OMG组织制订的一种标准的面向对象应用程序体系规范。 用途: 1、存取来自现行桌面应用程序的分布信息和资源; 2、使现有业务数据和系统成为可供利用的网络资源; 3、为某一特定业务用的定制的功能和能力来增强现行桌面工具和应用程序; 4、改变和发展基于网络的系统以反映新的拓扑结构或新资源;

29、什么是 Java虚拟机?为什么Java被称作是“平台无关的编程语言”

Java虚拟机是执行字节码文件(.class)的虚拟机进程。 因为不同的平台装有不同的Java虚拟机,它们能够将相同的.class文件,解释成不同平台所需要的机器码。所以Java被称为平台无关的编程语言。

30、什么是正则表达式?用途是什么?哪个包使用正则表达式来实现模式匹配

正则表达式:是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,用这个“规则字符串”来表达对字符串的过滤逻辑。 用途包括: 1、字符串匹配 2、指定字符串替换 3、指定字符串查找 4、字符串分割 正则表达式的包:java.util.regex包

31、什么是懒加载(Lazy Loading)

懒加载:即为延迟加载,顾名思义就是在需要的时候才加载,这样做效率会比较低,但是占用内存低。

32、什么是尾递归,为什么需要尾递归

如果一个函数中所有递归形式的调用都出现在函数的末尾,我们称这个递归函数是尾递归的。 为什么需要尾递归:尾递归和普通递归的不同点在对内存的占用,普通递归创建stack后内存减少,而尾递归只会占用恒量的内存。

33、什么是控制反转(Inversion of Control)与依赖注入(Dependency Injection)

控制反转:是指将创建对象的功能交给Spring容器,在我们需要使用对象的时候不需要自己创建,可以直接从容器中获取。 依赖注入:动态的向某个对象提供它所依赖的其他对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值