Java常见问题整理

servlet

简述什么是状态管理

将客户端(浏览器)与服务器之间多次交互当做一个整体来看待,并且将多次交互所涉及的数据即状态保存下来。

简述什么是Cookie

浏览器向web服务器发送请求时,服务器会将少量的数据以set-Cookie消息头的方式发送给浏览器,浏览器将这些数据保存下来;当浏览器再次访问服务器时,会将这些数据以Cookie消息头的方式发送给服务器。

简述什么是sessionSession的工作原理

服务器为了保存用户状态而创建一个特殊的对象。

浏览器访问Web服务器时,服务器会为每一个浏览器在服务器端的内存中分配空间,单独创建一个Session对象,该对象有一个Id属性,其值唯一,一般称之为Session Id,并且服务器会将这个Session Id(使用Cookie的方式)发送给浏览器;浏览器再次访问服务器时,会将Session Id发送给服务器,服务器可以依据Session Id找到对应的Session对象。

简述什么是Session超时,如何修改缺省的时间限制

Session超时指的是:Web服务器会将空闲时间过长的Session对象删除掉,以节省服务器内存空间资源。web服务器缺省的超时时间限制:一般是30分钟。修改Session的缺省时间限制,有如下两种方式:

  1. 通过修改tomcatconf/web.xml 文件的设置,代码如下所示:

2.通过编程的方式来修改,通过调用Session对象的setMaxInactiveInterval方法来修改

 

简述什么是转发?以及如何实现转发

转发是一个Web组件(Servlet/JSP)将未完成的处理通过容器转交给另外一个Web组件继续完成。

可以按照以下三个步骤来实现转发:

  1. 绑定数据到request对象        2.获得转发器       3.转发

简述转发和重定向有什么区别?

转发和重定向的区别有以下几点:

1. 重定向是浏览器发送请求并收到响应以后再次向一个新地址发请求,转发是服务器收到请求后为了完成响应转到一个新的组件。

2. 重定向中有两次请求,不共享数据,转发只产生一次请求,且在组件间共享数据。

3. 重定向后地址栏地址改变,而转发则不会。

4. 重定向的新地址可以是任意地址,转发到的新地址必须是同一个应用内的某地址。

 

简述什么是Servlet

SunOracle)公司制定的一种用来扩展Web服务器功能的组件规范。

 

简述什么是HTTP协议

HTTP协议是HyperText Transfer Protocol的简写,它是由w3c(万维网联盟)制定的一种应用层协议,用来定义浏览器与web服务器之间如何通信以及通信的数据格式。

 

简述GET和POST的区别。

GETPOST的区别如下:

1. 从提交的数据量上来说,get方式会将请求参数及参数值放在请求资源路径里面,携带的数据大小有限制,不适合提交大量的数据;post方式会将请求参数及参数值放在实体内容里面,理论上没有限制,适合大量数据的提交。

2.从安全上来讲,post方式相对安全(因为请求参数及值存放在实体内容里面,而get方式会将请求参数及值显示在浏览器地址栏)。但是要注意,post方式并没有将数据加密。

 

简述什么是重定向

服务器向浏览器发送一个302状态码及一个Location消息头(该消息头的值是一个地址,称之为重定向地址),浏览器收到后会立即向重定向地址发出请求。

 

简述URI和URL 的区别, 如何获取

URI,是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源。而URLuniform resource locator,统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何定位这个资源。

JavaURI中,一个URI实例可以代表绝对的,也可以是相对的,只要它符合URI的语法规则。而URL类则不仅符合语义,还包含了定位该资源的信息,因此它不能是相对的。从HttpServletRequestjavadoc中可以看出,getRequestURI方法返回一个String,比如请求为“POST /some/path.html?a=b HTTP/1.1”,则该方法返回的值为”/some/path.html”。而getRequestURL返回一个StringBuffer,是完整的请求资源路径,不包括querystring

 

Servlet生命周期分哪几个阶段?什么时候执行?

Servlet生命周期分为四个阶段,依次是实例化、初始化、就绪以及销毁。

阶段一:实例化

容器调用Servlet的构造器,创建一个Servlet对象。容器创建Servlet对象的时机有以下两种情形:

情形1,开始容器里面没有Servlet对象,只有收到请求后才会创建Servlet对象。

情形2,容器启动之后就立即创建相应的实例。

阶段二:初始化

容器在创建好Servlet对象之后,会立即调用该对象的init方法。该方法只会执行一次。一般情况下,我们不用写init方法,因为GenericServlet已经提供了init方法的实现(将容器传递过来的ServletConfig对象保存下来,并且,提供了getServletConfig方法来获得ServletConfig对象)

阶段三:就绪

容器收到请求之后调用Servlet对象的service方法来处理请求。

阶段四:销毁

容器依据自身的算法删除Servlet对象,删除前会调用destroy方法。该方法只会执行一次。可以重写destroy方法来实现自己的处理逻辑。

 

简述什么是Servlet上下文,有哪些特点

定义:容器启动之后,会为每一个Web应用创建唯一的一个符合ServletContext接口要求的对象,该对象就是servlet上下文。

作用:1.绑定数据 2.读取全局的初始化参数

注:requestsessionservlet上下文都可以绑订数据,有什么区别?

区别1: 绑订的数据生存时间不一样,按照生存时间的长短来排序,依次是request < session < servlet上下文。在满足使用条件的情况下,优先使用生命周期短的。

区别2:绑订到session对象上的数据,只有与之对应的用户能访问到,而绑订到上下文上的数据,所有用户都能访问到。

 

Servlet是否是线程安全的,如何解决?

Servlet存在线程安全问题。容器搜到请求之后,会启动一个线程来进行相应的处理。

默认情况下,容器只会为某个Servlet创建一个实例,如果同时有多个请求同时访问某个Servlet则肯定会有多个线程访问同一个Servlet实例。如果这些线程要修改Servlet实例的某个属性,就有可能发生线程安全问题。

可以使用synchronized对代码加锁来解决Servlet的安全问题。

 

 简述什么是过滤器?

过滤器是Servlet2.3规范中定义的一种小型的、可插入的Web组件。用来拦截Servlet容器的请求和响应过程,以便查看、提取客户端和服务器之间正在交换的数据。过滤器通常是封装了一些功能的Web组件,这些功能很重要,但对于处理客户端请求或发送响应来说不是决定性的。典型的应用包括记录请求和响应的数据、管理会话属性等。

 

 简述什么是监听器

Servlet规范中定义的一种特殊的组件,用来监听Servlet容器产生的事件并进行相应的处理。

 

简述什么是EL表达式及作用

EL表达式是一套简单的计算规则,用于给JSP标签的属性赋值,也可以直接用来输出。

作用:1. 访问Bean的属性。  2. 输出简单的运算结果。  3. 获取请求参数值。

 

简述JSTL的作用

使用JSTL标签的作用是可以降低代码工作量,界面更加简洁,便于维护。后台开发人员和前端开发人员可以分工合作,从而提高团队开发的效率。

JSP

简述什么是jsp

sun公司制订的一种服务器端动态页面技术规范。

jsp是一个以.jsp为后缀的文件,主要内容是html加少量的java代码,容器会将jsp转换成一个对应的Servlet然后执行。

什么是指令

通过指令,可以告诉容器,在将jsp转换成Servlet时,做一些额外的处理,比如导包。

page指令(importpageEncodingpageEncodingsessionerrorPageisErrorPage

include指令(file taglib指令

简述什么是pageContext(页面上下文)

容器会为每一个jsp实例创建唯一的一个符合PageContext接口要求的对象,该对象我们可以称之为页面上下文。

作用:1.绑定数据(绑订到pageContext上的数据,只有对应的jsp实例能够访问)

2.提供了一些方法用来获得其它所有的隐含对象。

简述jsp标签的执行过程

容器依据标签的命名空间找到标签的描述文件(.tld文件),然后依据标签的名称找到标签类,接下来,容器会将标签类实例化并调用该实例的相应方法。

JDBC

 简述JDBC的原理

JDBC( Java DataBase Connectivity,java数据库连接 )是一种用于执行SQL语句的Java API , 可以为多种关系数据库提供统一访问 , 它由一组用Java语言编写的类和接口组成。

JDBC 通过标准(一系列接口)定义了访问数据库的通用API,不同的数据库厂商根据各自数据库的特点提供了对JDBC的实现(实现类)。

 

为什么要使用数据库连接池

如果没有连接池,每一次业务都需要和数据库服务器建立一次连接,业务处理完断开连接,如果有上万次业务就会有上万次的开关连接,频繁开关连接非常浪费资源,使用数据库连接池,可以设置几个初始连接,如果有业务需要使用连接,则从连接池中直接获取,如果连接池中连接用光,则会等待连接归还后再获取连接。

 

DATABASE

简述什么是数据库

数据库实际上就是一个文件集合,数据库就是一个存储数据的仓库,本质就是一个文件系统,数据库是按照特定的格式把数据存储起来,用户可以对存储的数据进行增删改查操作。

 

连接方式和关联关系的区别

连接方式: 包括等值连接、内连接、外连接,是指关联查询的查询方式

关联关系: 指表设计时两张表之间存在的逻辑关系包括 一对一,一对多和多对多

 

 什么是视图,为什么使用视图

数据库中存在的表和视图都是其内部的对象,视图可以理解成是一个虚拟的表,数据来自原表,视图本质上就是取代了一段sql语句。

因为有些数据查询的SQL语句比较长,每次书写比较麻烦,使用视图可以起到sql语句重用的作用,提高开发效率,可以隐藏敏感信息。

什么叫数据污染

往视图中插入一条 视图中不可见但是在原表中存在的数据 称为数据污染

什么是索引,为什么使用索引

索引是数据库中用来提高查询效率的技术,类似于目录。

如果不使用索引,查询数据时会依次遍历每一个保存数据的磁盘块,直到找到目标数据为止,使用索引后,磁盘块会以树状结构保存,查询数据时会大大降低磁盘块的访问量,从而提高查询效率。

索引是越多越好吗?

不是,因为索引会占用储存空间,只对常用的查询字段创建索引。

有索引就一定好吗?

不一定,如果数据量小的话 添加索引反而会降低查询效率。

什么叫做事务,有什么特点

数据库中执行SQL语句的工作单元,不可拆分,可以保证同一业务中的所有SQL语句全部成功或全部失败

事务的ACID特性

Atomicity:原子性,最小不可拆分,保证全部成功,全部失败

Consistency:一致性,从一个一致状态到另一个一致状态

Isolation:隔离性, 多个事务之间互不影响

Durability:持久性,事务完成后数据提交到数据库文件中 持久保存

Spring SpringMVC Mybatis

描述Spring框架的作用和优点

1. Spring是一个开源的轻量级的应用开发框架,其目的是用于简化企业级应用程序开发,减少侵入;

2. Spring提供的IOC和AOP应用,可以将组件的耦合度降至最低,即解耦,便于系统日后的维护和升级;

3. Spring为系统提供了一个整体的解决方案,开发者可以利用它本身提供的功能外,也可以与第三方框架和技术整合应用,可以自由选择采用哪种技术进行开发。

Spring的本质是管理软件中的对象,即创建对象和维护对象之间的关系。

 

如何控制Bean对象的作用域,默认作用域是什么

1. 可以通过<bean>定义的scope属性指定Bean对象的作用域或者使用注解@Scope指定Bean对象的作用域。

2. 默认Bean对象的作用域为singleton。

 

简述IOC与DI

IOCInversion of control,表示控制反转(由掌握创建并管理对象的主动权,变成了放弃创建并管理对象的主动权,而是只关心如何获取对象,这样的做法就叫做控制反转。)

DIDependency Injection,表示依赖注入(由框架为属性设置值的做法就叫做注入,为某个类依赖的对象去注入值叫做依赖注入)。

IOC是希望实现的目标,而DI是实现目标时使用的手段!即:通过使用依赖注入的做法实现了控制反转

 

简述SpringMVC的工作流程

1. 浏览器发出spring mvc请求,请求交给前端控制器DispatcherServlet处理。

2. 控制器通过HandlerMapping维护的请求和Controller映射信息,找到相应的Controller组件处理请求。

3. 执行Controller组件约定方法处理请求,在约定方法中可以调用ServiceDAO等组件完成数据库操作。约定方法可以返回一个ModelAndView对象,封装了模型数据和视图名称信息。

4. 控制器接收ModelAndView之后,调用ViewResolver组件,定位ViewJSP并传递Model信息,生成响应界面结果。

javaSE

什么是反射,有什么作用

Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取信息以及动态调用对象的方法的功能成为java语言的反射机制。

Java反射机制主要提供了一下功能:在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法,生成动态代理。

简述自动装箱和拆箱的原理

装箱和拆箱是编译器认可的,而不是虚拟机。编译器在生成类的字节码时,插入必要的方法调用,自动装箱时,调用了IntegervalueOf方法将int类型的值转换成了Integer类型自动拆箱时,调用了IntegerintValue方法,将Integer类型的变量转成了int类型。

 

简述ArrayList和LinkedList的不同

List接口的两个常见实现类为ArrayListLinkedList,分别用动态数组和链表的方式实现了List接口。

可以认为ArrayListLinkedList的方法在逻辑上完全一样,只是在性能上有一定的差别,ArrayList更适合于随机访问而LinkedList更适合于插入和删除;在性能要求不是特别苛刻的情形下可以忽略这个差别。

 

简述队列和栈的不同,以及在 Java语言中如何实现这两个数据结构

队列遵循先进先出(FIFOFirst Input First Output )的原则,而栈遵循先进后出(FILOFirst Input Last Output )的原则。

JDK中提供了Queue接口来实现队列这个数据结构,同时使得LinkedList实现了该接口;同时,JDK中还提供了Deque接口来实现栈这个数据结构,而 LinkedList也实现了该接口。

 

简述hashCode方法的意义

java.lang.Object来理解,JVM每实例化一个Object,它都会将这个Object放入到一个Hash哈希表中去,这样的话,下次做Object的比较或者取这个对象的时候,它会根据对象的hashCode再从Hash表中取这个对象。这样做的目的是提高取对象的效率。具体过程如下:

1) new Object(),JVM根据这个对象的hashCode值,放入到对应的Hash表对应的Key,如果不同的对象产生了相同的hash,也就是发生了Hash key相同导致冲突的情况,那么就在这个Hash key的地方产生一个链表,将所有产生相同hashCode的对象放到这个单链表上去,串在一起,就是Hash桶。

2) 比较两个对象的时候,首先根据他们的hashCodehash表中找它的对象,当两个对象的hashCode相同,也就是说这两个对象放在Hash表中的同一个key,则他们一定在这个key上的链表上。那么此时就只能根据Objectequals方法来比较这个对象是否相等。当两个对象的hashCode不同时,则这两个对象一定不能相等。

 

简述Java编译及运行过程

首先,编译,Java 源文件(*.java)经过Java的编译器编译成Java字节码文件(*.class);然后,运行,先进行类加载和字节码校验,之后,Java字节码经过JVM解释为具体平台的具体指令,并执行。

 

名词解释JVM、JRE、JDK

JVM Java Virtual Machine)称之为Java虚拟机,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。

JREJava SE Runtime Environment)称之为Java SE运行时环境,提供了运行Java应用程序所必须的软件环境,包含有Java虚拟机(JVM)和丰富的类库(Libraries)。运行一个已经开发好的Java应用必须安装JRE

JDKJava Development Kit)称为Java开发工具包,是JRE的超集,或者说JDK包含了JREJDK中除了包含有JRE的所有内容之外还提供了编写Java程序所必须的编译器和调试工具等。对于进行Java开发的人士一般需要下载JDK

请简述while语句和do-while语句的区别

while语句和do-while语句的区别在于:while语句是先判断循环条件,如果条件为真则执行循环体;而do-while语句则先执行一次循环体,然后才判断循环条件,如果循环条件为真,则执行下一次循环,否则终止循环。

 

请描述类和对象的关系

对象是一个客观存在的实体,是面向对象编程过程中分析与解决问题的出发点与基础。对象的实质就是内存中的一块数据存储区域,其数据结构由定义它的类来决定。

类是用于构建对象的模板,对象通过类的实例化产生,一个类可以创建多个对象,每个对象拥有自己的数据和行为。

 

请描述引用类型和基本类型的区别

8种基本类型之外,用类名(接口、数组)声明的变量称为引用类型变量,简称“引用”。引用的功能在于访问对象。

基本类型变量本身就包含了其实例数据,而引用类型变量中存储的是某个对象在内存中的地址信息。当一个引用类型变量指向该类的对象时,就可以通过这个变量访问对象。

 

简述JVM垃圾回收机制

垃圾回收机制是Java提供的自动释放内存空间的机制。

垃圾回收器(Garbage CollectionGC)是JVM自带的一个线程,用于回收没有被引用的对象。

Java程序是否会出现内存泄露

会出现内存泄漏。

一般来说内存泄漏有两种情况。一是在堆中分配的内存,在没有将其释放掉的时候,就将所有能访问这块内存的方式都删掉;另一种情况则是在内存对象明明已经不需要的时候,还仍然保留着这块内存和它的访问方式(引用)。第一种情况,在Java中已经由于垃圾回收机制的引入,得到了很好的解决。所以,Java中的内存泄漏,主要指的是第二种情况。

 

JVM如何管理内存,分成几个部分?分别有什么用途?

JVM内存分为“堆”、“栈”和“方法区”三个区域,分别用于存储不同的数据。

堆内存用于存储使用new关键字所创建的对象;栈内存用于存储程序运行时在方法中声明的所有的局部变量;方法区用于存放类的信息,Java程序运行时,首先会通过类装载器载入类文件的字节码信息,经过解析后将其装入方法区。类的各种信息(包括方法)都在方法区存储。

 

简述抽象类的意义

抽象类的意义在于:

1. 为其子类提供一个公共的父类型,避免该类被实例化;

2. 封装子类中的重复内容(成员变量和方法);

3. 定义公共抽象方法,由子类提供不同的实现。

 

简述接口与抽象类的区别

抽象类

1)抽象类不能被实例化

2)抽象类是对类的抽象,抽象所具有的共有特征和行为

3)抽象类所存在的目的就是用来被继承,实现代码的复用

4)抽象类可以有抽象方法也可以没有抽象方法,可以像普通的类具有成员变量和方法

5)如果一个类继承抽象类,必须实现抽象父类的抽象方法,或者子类也是一个抽象方法

接口

1)接口是比抽象类还抽象的存在,接口是抽象类的极致抽象。

2)接口中所有的方法都是public abstracht,接口中所有的变量都是public static final

3)接口主要用来定义标准。

4)接口可以多继承。一个类可以实现多个接口。

5)接口的存在本身可以规避java不能多继承的操作特点。

 

简述contains方法和equals方法的关系

contains方法用于判断给定的元素是否被包含在集合中。若包含则返回true,否则返回false。另外,在判断给定的元素是否被包含在集合中,要使用元素的equals方法进行比较的

 

简述RAF的两种创建模式

RandomAccessFile在对文件进行随机访问操作时有两个模式,分别为只读模式(只读取文件数据),和读写模式(对文件数据进行读写)

 

简述RandomAccessFile类的read方法和write方法使用int类型存储byte数据的方式和原因

1RandomAccessFile提供了一个可以从文件中读取字节的方法:int read()

该方法会从文件中读取一个byte(8) 填充到int的低八位, 24位为0, 返回值范围正数: 0~255, 如果返回-1表示读取到了文件末尾! 每次读取后自动移动文件指针, 准备下次读取。

2RandomAccessFile提供了一个可以向文件中写出字节的方法:

void write(int d)

该方法会根据当前指针所在位置处写入一个字节,是将参数int的”低8位”写出。

3)使用int类型存储byte数据,这是因为,RandomAccessFile类的read方法,能读到的数据有257个数值,其中,0255表示数据,-1表示读取到了文件末尾。而write方法与read方法是一对方法,因此write方法也采用了int类型。

 

简述节点流和处理流的区别,以及Java流式输入输出的架构特点

1)按照流是否直接与特定的地方 (如磁盘、内存、设备等) 相连,分为节点流和处理流两类。节点流可以从或向一个特定的地方(节点)读写数据;处理流是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。

2)处理流的构造方法总是以一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接。

 

简述RandomAccessFile和FileInputStream及FileOutputStream在使用中的区别

RandomAccessFile使用随机访问的方式,而FileInputStreamFileOutputStream使用的是流式访问的方式。

 

简述Serializable接口和transient关键字的意义

1ObjectOutputStream在对对象进行序列化时有一个要求,就是需要序列化的对象所属的类必须实现Serializable接口。实现该接口不需要重写任何方法。其只是作为可序列化的标志。

2)对象在序列化后得到的字节序列往往比较大,有时我们在对一个对象进行序列化时可以忽略某些不必要的属性,从而对序列化后得到的字节序列”瘦身”。关键字 transient表示被该关键字修饰的属性在序列化时其值将被忽略。

 

分别简述ISR和OSW的工作原理

InputStreamReader字符输入流。使用该流可以设置字符集,并按照指定的字符集从字节流中按照指定编码将字节数据转换为字符数据并读取。

OutputStreamWriter字符输出流。使用该流可以设置字符集,并按照指定的字符集将字符转换为对应的字节后通过该流写出。

 

简述Error和Exception的区别

Java异常结构中定义有Throwable类,ExceptionError是其派生的两个子类。其中Exception表示由于网络故障、文件损坏、设备错误、用户输入非法等情况导致的异常;而Error表示Java运行时环境出现的错误,例如:JVM内存资源耗尽等。

 

简述RuntimeException和非RuntimeException的区别

Java异常可以分为可检测异常,非检测异常:

1)可检测异常:可检测异常经编译器验证。对于声明抛出异常的任何方法,编译器将强制执行处理或声明规则,不捕捉这个异常,则产生编译错误。

2)非检测异常:非检测异常不遵循处理或者声明规则。在产生此类异常时,不一定非要采取任何适当操作,编译器不会检查是否已经解决了这样一个异常。

RuntimeException 类属于非检测异常,因为普通JVM操作引起的运行时异常随时可能发生,此类异常一般是由特定操作引发。但这些操作在java应用程序中会频繁出现。因此它们不受编译器检查与处理或声明规则的限制。非RuntimeException为可检测异常,该异常经编译器验证。

 

写出5个常见的RuntimeException

1IllegalArgumentException抛出的异常表明向方法传递了一个不合法或不正确的参数

2NullPointerException当应用程序试图在需要对象的地方使用 null 时,抛出该异常

3ArrayIndexOutOfBoundsException当使用的数组下标超出数组允许范围时,抛出该异常

4ClassCastException当试图将对象强制转换为不是实例的子类时,抛出该异常

5NumberFormatException当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。

 

线程和进程的区别

线程和进程的区别如下:

1)一个进程至少有一个线程。线程的划分尺度小于进程,使得多线程程序的并发性高。
另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

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

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

 

简述线程的状态及其转换

线程的状态有五种,本别是NewRunnableBlockRunning以及Dead

线程之间的状态转换如下:

1New,创建一个线程,但是线程并没有进行任何的操作。

2Runnable,新线程从New状态,调用start方法转换到Runnable状态。线程调用start方法向线程调度程序(JVM或者是操作系统)注册一个线程,这个时候一切就绪只等CPU的时间。

3Running,从Runnable状态到Running状态,线程调度根据调度策略的不同调度不同的线程,被调度执行的线程进入Running状态,执行run方法。

4Dead状态,从Running状态到Runnablerun方法运行完毕后,线程就会被抛弃,线程就进入Dead状态。

5Block状态,从Running状态到Block状态,如果线程在运行的状态中因为I/O阻塞、调用了线程的sleep方法以及调用对象的wait方法则线程将进入阻塞状态,直到这些阻塞原因被结束,线程进入到Runnable状态。

 

简述线程的两种创建方式以及它们的区别

创建线程的两种方式:

1)使用Thread创建线程。Thread类是线程类,其每一个实例表示一个可以并发运行的线程。我们可以通过继承该类并重写run方法来定义一个具体的线程。其中重写run方法的目的是定义该线程要执行的逻辑。启动线程时调用线程的start()方法而非直接调用run()方法。start()方法会将当前线程纳入线程调度,使当前线程可以开始并发运行。当线程获取时间片段后会自动开始执行run方法中的逻辑。

2)使用Runnable创建线程。实现Runnable接口并重写run方法来定义线程体,然后在创建线程的时候将Runnable的实例传入并启动线程。

两种创建线程方式的区别:

使用Thread创建线程,编写简单,可以直接操纵线程,无需使用Thread.currentThread(),但是不能够再继承其他类。

使用Runnable创建线程可以将线程与线程要执行的任务分离开减少耦合,同时Java是单继承的,定义一个类实现Runnable接口,这样该类还可以继承自其他类。

 

简述yiled()、join()、sleep()、wait()的区别

yield()方法的作用是暂停当前正在执行的线程对象,把执行机会让给相同或者更高优先级的线程,不过不能指定暂停的时间,并且也不能保证当前线程马上停止。yield方法只是将Running状态转变为Runnable状态。

join()方法的作用是父线程等待子线程执行完成后再执行,换句话说就是将异步执行的线程合并为同步的线程。

sleep()方法的作用是让当前线程暂停指定的时间(毫秒),可以直接调用。sleep方法只是暂时的让出CPU的执行权,但并不释放锁。

wait()方法的作用是将当前运行的线程挂起(即让其进入阻塞状态),直到notifynotifyAll方法来唤醒线程.调用wait方法后,线程是会释放锁。

 

简述SAX和DOM解析方式的不同

DOM(Document Object Model, 即文档对象模型) W3C 组织推荐的处理 XML 的一种方式。DOM解析器在解析XML文档时,会把文档中的所有元素,按照其出现的层次关系,解析成各个Node对象(节点)

优点:xml文件在内存中构造树形结构,可以遍历和修改节点

缺点:如果文件比较大,内存有压力,解析的时间会比较长

SAXsimple API for XML)是一种XML解析的替代方法。相比于DOMSAX是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。而且相比于DOMSAX可以在解析文档的任意时刻停止解析。

优点: 解析可以立即开始,速度快,没有内存压力

缺点: 不能对节点做修改

 

WEB

简要描述标准 HTML 文档的结构。

HTML 文档的开始需要版本声明,剩下的页面内容需要包含在开始标记<html>和结束标记</html>之间。在<html>元素中,包含两个主要的部分,文件头部分(<head>元素)和主体部分(<body>元素)。

 

简要描述行内元素和块级元素的区别。

块级元素的前后都会自动换行,如同存在换行符一样。默认情况下,块级元素会独占一行。例如,<p><hn><div>都是块级元素。在显示这些元素中间的文本时,都将从新行中开始显示,其后的内容也将在新行中显示。

行内元素可以和其他行内元素位于同一行,在浏览器中显示时不会换行。例如,<a><span>等。

我们可以这样理解:如果元素是块级的,则总是在新行上显示,好比是书中的一个新段落;而元素如果是行内的,那么只能在当前行中显示,就像是段落中的一个单词。

因此,块级元素常用来构建网页上比较大的结构,用于包含其他块级元素、行内元素和文本;而行内元素一般只能包含其他行内元素和文本。

 

锚点的作用是什么?如何创建锚点?

锚点是文档中某行的一个记号,类似于书签,用于链接到文档中的某个位置。当定义了锚点后,我们可以创建直接跳至该锚点(比如页面中某个小节)的链接,这样使用者就无需不停地滚动页面来寻找他们需要的信息了。

在使用<a>元素创建锚点时,需要使用 name 属性为其命名,代码如下:

<a name=”anchorname1”>锚点一</a>

然后就可以创建链接,直接跳转到锚点,代码如下

<a href=”#anchorname1”>回到锚点一</a>

 

简述 CSS 样式表的使用方式。

HTML 页面有三种使用 CSS 样式表的方式:

1、内联样式表:样式规定在单个的元素中,写在元素的 style 属性里;

2、内部样式表:样式定义在HTML页面的头元素中;

3、外部样式表:将样式定义在一个外部的 CSS 文件中,然后由HTML页面引用样式表文件。

 

如何理解 CSS 样式表的层叠性。

CSS使用层叠(Cascade)的原则来考虑继承、层叠次序和优先级等重要特征,从而判断相互冲突的规则中哪个规则应该起作用。

继承性是指,许多CSS的样式规则不但影响选择器所定义的元素,而且会被这些元素的后代继承。

层叠性是指,当一个Web页面使用多个样式表,多个样式表中的样式可层叠为一个。在多个样式表之间所定义的样式没有冲突的时候,浏览器会显示所有的样式。

优先级是指,当发生样式定义冲突时,浏览器首先会按照不同样式规则的优先级来应用样式。CSS 样式的优先级如下所示(其中数字3拥有最高的优先权):

1、浏览器缺省设置;

2、外部样式表(.css 文件)或者内部样式表(位于<head>元素内部);

3、内联样式(作为某个元素的style属性的值)。

同等优先级下,以最后定义的样式为准。

 

CSS 选择器中,元素选择器和类选择器的区别是什么?

元素选择器是最常见的 CSS 选择器,即,文档的元素就是最基本的选择器。选择器通常是某个HTML元素,比如<p><h1><em><a>等,甚至可以是<html>元素本身。

类选择器用于将样式规则与附带class属性的元素匹配,其中该class属性的值为类选择器中指定的值。使用类选择器时,首先需要定义样式类,其语法为:.className {  }

所有能够附带class属性的元素都可以使用此样式声明。只需要将class属性的值设置为“className”,则可以将类选择器的样式与元素关联。

在实际使用时,如果需要为某种元素定义样式,则往往使用元素选择器;如果要应用样式而不考虑具体设计的元素,最常用的方法就是使用类选择器。

 

猜你喜欢

转载自www.cnblogs.com/smartyard/p/11775289.html