当前位置:编程学堂 > Android和Java的一些面试题详解(附详细答案)

Android和Java的一些面试题详解(附详细答案)

  • 发布:2023-09-29 11:58

1. String、StringBuffer、StringBuilder 有什么区别? String 为什么它是不可变的?

答案:

1String 是字符串常量,StringBufferStringBuilder 都是字符串变量。后两者的字符内容是可变的,而前者的内容在创建后是不可变的。

2String 是不可变的,因为 String 在 JDK 中是不可变的 类被声明为 final 类。

3StringBuffer 是线程安全的,而 StringBuilder 不是线程安全的。

ps:线程安全会带来额外的系统开销,所以StringBuilderStringBuffer 高。如果你非常熟悉系统中的线程是否安全,可以使用StringBuffer,并在线程不安全的地方添加关键字Synchronize

2. Vector、ArrayList、LinkedList有什么区别?

答案:

1VectorArrayList都以类似数组的形式存储在内存中,LinkedList以链表的形式存储。

2List 中的元素是有序的,并且允许重复元素。 Set中的元素是无序的,不允许有重复的元素。

3矢量线程同步、ArrayListLinkedList线程不同步。

4LinkedList 适合指定位置的插入、删除操作,不适合搜索; ArrayListVector适合搜索,但不适合指定位置的插入、删除操作。

5ArrayList 当元素填满容器时会自动扩展容器大小50% 和 矢量100% ,因此ArrayList 更节省空间。

三、HashTable、HashMapTreeMap有什么区别?

答案:

1HashTable线程同步、HashMap非线程同步。

2HashTable 不允许 Value> 具有空值, HashMap允许< , > 具有空值。

3HashTable 使用 枚举HashMap使用迭代器

4HashTablehash数组默认大小为11,增加方法旧*2+1, HashMap hash中的数组默认大小为16,增长方式必须为2的指数倍数。

5TreeMap可以对其保存的记录按key进行排序,默认是升序排列。

和 的区别?

答案:

1Apache 是一个 Http 服务器、Tomcat Web 服务器,JBoss是应用服务器。

3 可以解析jsp动态页面,也可以充当servlet容器。

VI、GETPOST有什么区别?

答案:

基础知识:Http的请求格式如下。

主要包含三个信息:1、请求类型(GETPOST ), 2, 资源访问的(例如 \res\img\a.jif)、3Http 版本 (http/1.1 )

用于描述服务器要使用的附加信息

这是http的规则,一行必须为空

[] 请求的内容数据

差异:

1Get是从服务器端获取数据,Post是向服务器端发送数据。

2,在客户端,Get方法通过URL提交数据,在提交数据URL 请求消息可以在地址栏,消息编码通过; 帖子数据在Html标题中提交。

3,对于Get方法,服务器端使用Request.QueryString来获取变量的值;相反,使用 Post 方法,在服务器端使用 Request.Form 获取提交的数据值。

4Get提交的数据最大数量为1024字节,而Post则没有限制。

5Get提交的参数和参数值会显示在地址栏中,这是不安全的,但Post则不会,即更安全。

七、会话、Cookie差异

答案:

1Session是应用服务器维护的服务器端存储空间; Cookie是浏览器维护的客户端存储空间。

2,用户可以通过浏览器设置决定是否保存Cookie,但无法决定是否保存Session,因为 Session 的维护者的服务器端。

3Session 存储对象,Cookie 存储字符串。

4SessionCookie 无法跨窗口使用。每次打开浏览器时,系统都会分配一个 SessionID,此时 SessionID 是不同的。要完成跨浏览器访问数据,可以使用Application

5SessionCookie都有过期时间,过期后会自动删除,以减少系统开销。


八,Servlet生命周期

答案:

大致分为4部分:Servlet类加载-->即时服务-->服务--> 摧毁

下图是ServletTomcat中的时序图。

九、HTTP 消息包含内容

答案:

主要包含四个部分:

1请求专线

2标题行

3空白线

4请求正文


1、Web 客户端Servlet容器(Tomcat) ​​ 发出 Http 请求。

2Servlet 容器接收来自Client 端的请求。

3Servlet 容器创建 HttpRequest 对象并转换 Client 的请求信息封装在该对象中。

4Servlet 创建一个 HttpResponse 对象。

5Servlet 调用 HttpServlet 对象的 服务 方法采用 HttpRequest 对象和 HttpResponse 该对象作为参数传递给 HttpServlet 对象。

6HttpServlet调用HttpRequest对象的方法获取 Http请求并进行相应处理。

7,处理完成HttpServlet调用HttpResponse对象的方法并返回响应数据。

8Servlet容器将HttpServlet的响应结果传回客户端。


3 方法之一说明了 Servlet

1init():负责初始化Servlet对象。

2service():负责响应客户端请求。

3destroy():负责在Servlet对象启动时释放占用的资源。


ten、StatementPreparedStatement之间的区别,什么是SQL注入,如何预防 SQL注入

答案:

1PreparedStatement支持动态设置参数,Statement不支持。

2, PreparedStatement 可以像 单引号 一样避免使用编码很麻烦,但是声明是不可能的。

3PreparedStatement 支持预编译,Statement 不支持。

4,当sql语句出现错误时,PreparedStatement不容易检查,并且 声明 更容易检查错误。

5PreparedStatement 可防止 Sql 并提供更安全的帮助,同时 声明没有。

什么是SQL注入:是通过拼接sql实现的 statements 不带参数查询数据库数据的方法。

例如,sql 语句是从名称=“+appName+”的表中选择*,使用appName 输入参数值,生成恶意sql语句。例如传入['or'1'='1'] ,就可以在数据库中执行。

所以你可以使用PrepareStatement来避免Sql 注入,服务器端接收到参数数据后,进行验证,此时 PrepareStatement 会自动检测到,但是Statement不起作用,需要手动检测。


十一、发送重定向、转发差异

答案:

1foward是服务器端控制页面重定向,重定向后的地址不会显示在客户端的浏览器地址中; sendRedirect完成跳转,浏览器中会显示重定向的地址,并再次发送请求链接

原理:转发是服务器请求资源时,服务器直接访问URL的目标地址,并提出阅读的回复内容URL,然后将内容返回到浏览器。浏览器不知道服务器发送的内容来自哪里,所以地址栏仍然是原来的地址。

redirect 服务器根据逻辑发送一个状态码,告诉浏览器重新请求该地址,浏览器会重新发送一个带有刚才所有参数的新请求。

?属性,几种方法。

答案:

因为JAVA中的对象都放在了堆中,所以如果你想即时iate 100 次,将生成 100堆 一个对象。一般来说,对象及其属性和方法属于一个整体。但是,如果 属性和方法是静态的,即使用 static 关键字声明,则这些属性属于该类。并且方法在内存中始终只有一份副本。

13。说说对Hibernate的理解,一级和二级缓存的作用,以及Hibernate在项目中如何使用缓存。

答案:

Hibernate 是一个开发的对象关系映射框架 (ORM)。它提供了JDBC非凡的对象封装,而Hibernate允许程序员以面向对象的方式操作关系数据库。

休眠优点:

1,程序更加面向对象

2、提高生产力

3,易于移植

4,非侵入性。

缺点:

1,效率比JDBC

稍差

2,不适合批量操作

3。只能配置一种关联关系

Hibernate 有四种查询方式:

1getload方法,根据id 查询对象编号。

2Hibernate 查询语言

3,标准查询语言

4,通过sql查询

冬眠工作原理:

1,配置hibernate对象关系映射文件,启动服务器

2,服务器实例化Configuration对象,读取hibernate.cfg.xml文件的配置内容,并构建根据相关需求。表和表之间的映射关系。

3,通过实例化的Configuration对象创建SeesionFactory实例,通过 SessionFactory 实例创建 Session 对象。

4,通过Seesion对象完成数据库增删改查操作。

休眠状态转换

临时状态(暂时

1,不在 会话缓存

2, 数据库中没有对象记录

java如何进入临时状态:1,通过new语句创建对象时。 2时,只需调用sessiondelete方法,从seesion中删除一个 缓存对象时间。

持续状态 (持续)

1,在 会话缓存

2, 持久对象数据库中没有对象记录

3seesion 将保存两者在特定时刻的同步

java如何进入持久化状态:1seesionsave() 方法。 2seesionload().get()方法返回的对象。 3seesionfind() 方法返回存储在 list 中的对象 收藏。 4Sessionupdate().save() 方法。

分离状态(分离

1,不再位于 会话缓存

2,从持久态转变为自由对象,数据库中没有对应的记录。

java如何进入无家可归状态:1Session关闭()Sessionevict() 方法从缓存中删除对象。

详情如下图:


Hibernate中的缓存主要包括Session缓存(一级缓存)和SessionFactoryCache(二级缓存,一般由第三方提供)。

14。先说说反射,主要是概念反射机制在哪里,反射的性能如何优化

答案:

反射机制定义:

处于运行状态。对于任何一个类,你都可以知道这个类的所有属性和方法。对于任何对象,都可以通过反射机制调用类的任何方法。这种动态获取类信息以及动态调用类对象方法的功能就称为java的反射机制。

反射的作用:

1,动态创建类的实例,将类绑定到现有对象,或从现有对象获取类型。

2,应用程序需要在运行时从特定程序集中加载特定类

15。来说说HibernateIbatis的区别,哪个性能会更高

答案:

1Hibernate更倾向于对象操作来达到数据库相关操作的目的;而ibatis更偏向于sql语句的优化。

2Hibernate使用的查询语句是它自己的hql1 ib atis 是标准 sql 语句。

3Hibernate 相对复杂且难以学习; ibatis类似于sql 语句,简单易学。

性能:

1。如果系统数据处理量巨大,对性能要求极高,往往需要手动编写高性能的sql语句或错误存储过程。此时,ibatis拥有更好的可控性,因此比Hibernate有更好的性能。

2,同样的需求下,因为hibernate可以自动生成hql语句,并且 ibatis需要手动编写sql 声明,使用Hibernate的效率高于ibatis

16。项目中使用的Spring是怎样理解的?如何使用它? IOCAOP

》的理解和实施原则

答案:

Spring是一个开源框架,是MVC模式中的控制层。它可以应对需求的快速变化。主要原因是它具有面向切面编程(AOP的优点),其次它提高了系统性能,因为通过依赖反转机制(IOC) ),系统中使用的对象并不是在系统加载时全部实例化,而是只有在调用该类时才会实例化该类的对象,从而提高系统性能。这两个优秀的属性Spring受到很多J2EE公司的青睐,比如阿里用的最多的就是Spring相关技术。

弹簧优点:

1,减少组件之间的耦合,实现软件层之间的解耦。

2,您可以轻松使用提供的许多服务,例如事务管理、消息服务、日志记录等。

3,容器提供AOP技术,可以轻松实现权限拦截、运行时监控等功能。

Spring中的AOP技术就是设计模式中的动态代理模式。只需要实现jdk提供的动态代理接口IncationHandler即可。代理对象的所有方法均由 IncationHandler 处理。 。在面向方面的编程中,您还需要了解入口点、方面、通知和编织等概念。

IOC中的

Spring利用了Java的强大反射机制实现。所谓依赖注入,是指组件之间的依赖关系是在运行时由容器决定的。依赖注入有两种方法,通过构造函数注入和通过set方法注入。

十七、线程同步,如何控制并发操作

答案:

Java可以在方法名前加上关键字syschronized来处理多线程同时访问共享资源时的问题。 syschronized相当于一个锁。当申请人申请

当资源被使用时,如果资源没有被占用,那么资源将交付给申请者。在此期间,其他申请者只能申请但不能使用该资源。当资源被使用时,它会释放对该资源的锁定,以便其他申请者可以申请使用。

并发控制主要是针对多线程操作带来的资源读写问题。如果不加空间,可能会出现死锁、脏数据读、不可重复读、丢失更新等异常情况。

可以通过锁定来控制并发操作。锁可以分为乐观锁和悲观锁。

悲观锁:

悲观锁并发模型假设系统中有足够多的数据修改操作,任何确定的读操作都可能受到单个用户所做的数据修改的影响。换句话说,悲观锁假设冲突总是会发生,并通过独占占用正在读取的数据来避免冲突。但是独占数据会阻止其他进程修改数据,造成阻塞。读数据和写数据会互相阻塞。

乐观锁:

乐观锁假设系统数据修改只会引起很少的冲突,这意味着任何进程都不可能修改其他进程正在访问的数据。乐观并发模式下,读数据和写数据不会发生冲突,只有写数据和写数据之间会发生冲突。即读数据不会造成阻塞,只有写数据才会造成阻塞。

18。 struts

工作流程说明

答案:

1,当web应用程序启动时,加载并初始化ActionServlet Action Servlet 来自 struts-config.xml file 从 中读取配置信息,并将其存储在每个配置对象中。

? ,它将返回有关用户请求路径的无效信息。 。

3,如果ActionForm实例不存在,则创建ActionForm对象,并将客户提交的表单数据保存到ActionForm 对象。

ActionFormvalidate() 方法返回 null 或返回 不包含 ActionMessagectionErrors 对象,则表示表单验证成功。

5ActionServlet 根据ActionMapping 中包含的映射信息确定将请求转发到哪个 实例。 Action 如果对应的Action实例不存在,则先创建一个实例,然后调用的execute()方法行动

6Actionexecute() 方法返回 ActionForward 对象,ActionServlet 然后将客户请求转发到ActionForward 对象指向 JSP 组件。

7ActionForward对象指向JSP组件来生成动态网页并将其返回给客户。


相关文章