java面试题

1.String是最基本的数据类型吗?String和StringBuffer的区别?

不是。Java中的基本数据类型只有8个:byte,short,int,long,float,double,char,boolean,除了基本类型(primitive type),剩下的都是引用类型(reference type),枚举类型(enumeration type)也是引用类型。其中 byte 一个字节,short两个字节,int四个字节,long八个字节,char两个字节。
区别: (1)String:是对象不是原始类型.为不可变对象,一旦被创建,就不能修改它的值.对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.String 是final类,即不能被继承
(2)StringBuffer:是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象。它只能通过构造函数来建立对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.向StringBuffer中付值的时候可以通过它的append方法.
2.int和Integer有什么区别?

int是基本数据类型,Integer是引用数据类型;

int默认值是0,Integer默认值是null

int类型直接存储数值,Integer需要实例化对象,指向对象的地址

3.运行时异常与一般异常有何异同?

1.定义不同,运行时异常都是RuntimeException类及其子类异常,如NullPointerException、IndexOutOfBoundsException等。一般异常是RuntimeException以外的异常,类型上都属于Exception类及其子类。

2.处理方法不同,运行时异常是不检查异常,程序中可以选择捕获处理,也可以不处理。对于一般异常,JAVA编译器强制要求用户必需对出现的这些异常进行**catch并处理****,否则程序就不能编译通过。

3.发生原因不同,运行时异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常。

4.说出Servlet的生命周期,并说出Servlet和CGI的区别?
加载类—>实例化(为对象分配空间)—>初始化(为对象的属性赋值)—>请求处理(服务阶段)—>销毁
服务器启动时(web.xml中配置load-on-startup=1,默认为0)或者第一次请求该servlet时,就会初始化一个Servlet对象,也就是会执行初始化方法init(ServletConfig conf),该servlet对象去处理所有客户端请求,service**(ServletRequest req,ServletResponse res)方法中执行,最后服务器关闭时,才会销毁这个servlet对象**,执行**destroy()**方法。

区别:

1)较好的可移植性。由于Java语言具有跨平台和可移植性强的特点,使得Sevlet也有较好的可移植性, 即无须修改代码就可以部署到多种不同类型的Web服务器上。

2)执行效率高。由于CGI针对每个请求都会创建一一个进程来处理, 而Servlet针对每个请求创建一个线程来执行,而创建线程比创建进程的开销要小,所以,与CGI相比,Servlet在交互过程中有更短的响应时间, 响应效率更高。

3)功能强大。Servlet可以与Web服务器进行交互,而CGI却无法与Web服务器直接交互。

4)使用方便。Servlet 提供了许多非常有用的接口用来读取或设置HTTP头消息,处理Cookie和跟踪会话状态等。
5)可扩展性强。由于Servlet是由Java语言编写的,所以,它具备了Java 语言的所有优势
5.说出ArrayList,Vector,LinkedList的存储性能和特性。
ArrayList 和 Vector 都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector 由于使用了 synchronized 方法(线程安全), 通常性能上较 ArrayList 差,
而 LinkedList 使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。

6、Hibernate 和 MyBatis 的区别
Hiberante 和 MyBatis 的增、删、改、查,对于业务逻辑层来说大同小异,对于映射层而言 Hibernate 的配置不需要接口和 SQL,相反 MyBaits 是需要的。对于 Hibernate 而言,不需要编写大量的 SQL,就可以完全映射,同时提供了日志、缓存、级联(级联比 MyBatis 强大)等特性,此外还提供了 HQL(Hibernate Query Language)对POJO 进行操作,使用十分方便,但是它也有致命的缺陷。由于无需 SQL,当多表关联超过 3 个的时候,通过 Hibernate 的级联就会造成太多性能的丢失

MyBatis 可以自由书写 SQL、支持动态 SQL、处理列表、动态生成表名、支持存储过程。这样就可以灵活地定义查询语句,满足各类需求和性能优化的需要。MyBatis 也有缺陷。首先他要****编写 SQL 和映射规则****,其工作量稍大于 Hibernate。其次,它支持的工具也很有限,不能像 Hibernate 那样有许多的插件可以帮助生成映射代码和关联关系,而即使使用生成工具,往往也需要开发者进一步简化,MyBatis 通过手工编码,工作量相对大些。**所以对于性能要求不太苛刻的系统 ,比如管理系统等推荐使用 Hibernate ;而对于性能要求高、响应快、灵活的系统则推荐使用 Mybatis。**

5.过滤器 拦截器

1.过滤器(Filter):过滤器就是过滤的作用,在web开发中过滤一些我们指定的url,比如过拦截掉我们不需要的接口请求,修改请求(request)和响应(response)内容,完成CORS跨域请求等等

2.拦截器(Interceptor):是面向切面编程(AOP,Aspect Oriented Program)的。就是在Service或者一个方法前调用一个方法,或者在方法后调用一个方法。比如动态代理就是拦截器的简单实现,在调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在调用方法后打印出字符串,甚至在抛出异常的时候做业务逻辑的操作

6.jsp内置对象

1、request对象 request 该对象代表了客户端的请求信息

2、response对象 response 代表的是对客户端的响应,

3、session对象 session 对象是由服务器自动创建的与用户请求相关的对象。

4、application对象 application 对象可将信息保存在服务器中,直到服务器关闭,

5、out 对象 out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。

6、pageContext 对象 pageContext 对象的作用是取得任何范围的参数

7、config 对象 config 对象的主要作用是取得服务器的配置信息。

8、page 对象 page 对象代表JSP本身,只有在JSP页面内才是合法的。

9、exception 对象 exception 对象的作用是显示异常信息

7.四大作用域

  1. page域: 只能在当前jsp页面使用 (当前页面)

  2. request域: 只能在同一个请求中使用 (转发)

  3. session域: 只能在同一个会话(session对象)中使用 (私有的)

  4. context域: 只能在同一个web应用中使用 (全局的)

8.Ajax

AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

9.jquery

jQuery是一个快速、简洁的JavaScript框架,它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Ajax交互。

10.jsp指令和动作各自原
三个指令: page include taglib 标签指令 六个动作: < jsp:include > 动态包含 < jsp:forward> 请求转发 < jsp:param> 设置请求参数 < jsp : useBean> < jsp : setProperty> 给指定的对象属性赋值 < jsp : getProperty >取出指定对象的属性值

1.一个单例

单例模式
public class Singleton {
private Singleton(){
}
private static volatile Singleton instance = null;
public static Singleton getInstance() {
if (instance == null) {
synchronized(Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
2.介绍线程死锁

线程死锁,当线程为了安全及同步时,用全局信号 量进行相互等待或是相互制约时程序 进入 了一个死锁状态 时(两个线程都停掉了)叫线程死锁。

4.XML解析方式
DOM(Document Object Model) 生成和解析XML文档。由W3C提供的接口,它将整个XML文档读入内存,构建一个DOM树来对各个节点(Node)进行操作。

SAX(Simple API for XML) 生成和解析XML文档。SAX不用将整个文档加载到内存,基于事件驱动的API(Observer模式),用户只需要注册自己感兴趣的事件即可。

DOM4J生成和解析XML文档。dom4j是目前在xml解析方面是最优秀的(Hibernate、Sun的JAXM也都使用dom4j来解析XML),它合并了许多超出基本 XML 文档表示的功能,包括集成的 XPath 支持、XML Schema 支持以及用于大文档或流化文档的基于事件的处理 JDOM生成和解析XML 。

JDOM与DOM非常类似,它是处理XML的纯JAVA API,API大量使用了Collections类,且JDOM仅使用具体类而不使用接口。
5.JDK与JRE

JDK与JRE的区别 JRE: Java Runtime Environment JDK:Java Development Kit JRE顾名思义是java运行时环境,包含了java虚拟机,java基础类库。是使用java语言编写的程序运行所需要的软件环境,是提供给想运行java程序的用户使用的。

JDK顾名思义是java开发工具包,是程序员使用java语言编写java程序所需的开发工具包,是提供给程序员使用的。

JDK包含了JRE,同时还包含了编译java源码的编译器javac,还包含了很多java程序调试和分析的工具:jconsole,jvisualvm等工具软件,还包含了java程序编写所需的文档和demo例子程序。

6.内存回收机制

分配内存与回收内存的标准是八个字:分代分配,分代回收。 由于字符串、对象和数组没有固定大小,所有当他们的大小已知时才能对他们进行动态的存储分配。JavaScript程序每次创建字符串、数组或对象时,解释器都必须分配内存来存储那个实体。只要像这样动态地分配了内存,最终都要释放这些内存以便他们能够被再用。
7.断点快捷键
快捷键 功能描述 F8 单步调试,不进入函数内部 F7 单步调试,进入函数内部 Shift+F7 选择要进入的函数 Shift+F8 跳出函数 Alt+F9 运行到断点 Alt+F8 执行表达式查看结果 F9 继续执行,进入下一个断点或执行完程序 Ctrl+F8 设置/取消当前行断点 Ctrl+Shift+F8 查看断点
8.自动装箱拆箱

自动装箱,就是自动将基本数据类型转换为包装器类型;

自动拆箱,就是自动将包装器类型转换为基本数据类型

9.css样式怎么定义

1.新建一个HTML页面,命名为test.html,用于对CSS样式定义的说明。

2.在test.html页面定义一个div元素,并且通过<style type="text/…

3.给div定义CSS样式,可以直接使用元素div作为选择器来实现样式定义。

2.oracle分页

String sql = "select * from " + (select ,rownum rid from (select * from students order by postime desc) where rid<=" + pagesizepagenumber + “) as t” + “where t>” + pageSize*(pageNumber-1);
3.8种基本类型
在这里插入图片描述
4.final,finally,finalize的区别
一、final :

1、修饰符(关键字) 如果一个类被声明为final,意味着它不能再派生新的子类,不能作为父类被继承。

2、将变量或方法声明为final,可以保证他们使用中不被改变。被声明为final的变量必须在声明时给定初值,而以后的引用中只能读取,不可修改,被声明为final的方法也同样只能使用,不能重载。

二、finally: 在异常处理时提供finally块来执行清楚操作。如果抛出一个异常,那么相匹配的catch语句就会执行,然后控制就会进入finally块,如果有的话。

三、finalize: 是方法名。java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除之前做必要的清理工作。这个方法是在垃圾收集器在确定了,被清理对象没有被引用的情况下调用的。 finalize是在Object类中定义的,因此,所有的类都继承了它。子类可以覆盖finalize()方法,来整理系统资源或者执行其他清理工作。

5.怎么启动线程

继承Thread类

1.自定义类MyThread继承Thread类

2.MyThread类重写run方法。

实现Runnable接口

1.自定义类MyRunnable实现Runnable接口

2.重写run()方法

3.创建MyRunnable类的对象

4.创建Thread类的对象,并把步骤3创建的对象作为构造参数传递

7.get,post请求的区别

1、 Get请求提交的数据会在地址栏显示出来,而post请求不会再地址栏显示出

2、 传输数据的大小 http Get请求由于浏览器对地址长度的限制而导致传输的数据有限制。而POST请求不会因为地址长度限制而导致传输数据限制。

3、 安全性**,POST的安全性要比GET的安全性高**。由于数据是会在地址中呈现,所以可以通过历史记录找到密码等关键信息。

8.list和set的区别

List是有序的Collection。Java List一共三个实现类: 分别是ArrayList、Vector和LinkedList。

Set**是唯一的,不可重复的,**常用的实现类有HashSet、TreeSet、LinkedHashSet

9.hashmap怎么用

HashMap根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快 的访问速度,但遍历顺序却是不确定的。

HashMap最多只允许一条记录的键为null,允许多条记 录的值为 null。HashMap 非线程安全。

10.还有ajax怎么实现同步和异步

AJAX中根据async的值不同分为同步(async = false)和异步(async = true)

11.还有文件传输怎么传

第一种:以字符串传参的方式发送到指定的接口取出其值(多个就采用数组)
第二种:采用流传输的方式传接口,这种可以批量传输且,大小无限制,支持多种类型文件上传

12.sevrlet 生命周期

①服务器加载Sevrlet。

创建Sevrlet,只有在请求Sevrlet时,才会调用构造方法,创建实例。

init()初始化,创建Sevrlet实例后立即被调用,且只执行一次

④service()处理用户请求,可以被多次调用,每次请求都会调用service方法,实际用于响应请求的。

destory()销毁,只被调用一次,在当前Servlet所在的WEB应用被卸载前调用,用于释放当前Servlet所占用的资源

1)第一种import驱动类,然后实例化 (实例化的过程进行了类加载)

不导入写全包名即可。

2)第二种通过class.forName(String 驱动类),进行类加载(实质上加载驱动的)。

JDBC连接数据库的步骤
JDBC连接数据库可以概括为6步,分别是加载JDBC驱动、建立数据库连接、创建一个语句对象、执行一个查询、处理结果集和关闭数据库连接,下面将分别予以详细介绍。

  1.  加载JDBC驱动
    

如果使用第一种数据库驱动(JDBC-ODBC桥)连接,那么可以使用java反射机制中的方法forName()进行加载,如:

Class.forName(“sun.jdbc.odbc.jdbcOdbcDriver”);

另外还有几种常见的驱动程序包括Oracle的驱动程序、Microsoft SQL Server的驱动程序和MySQL的JDBC的驱动程序,其加载语句分别是:

Class.forName(“oracle.jdbc.driver.OracleDriver”);

Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver”);

Class.forName(“com.mysql.jdbc.Driver”);

  1.  建立数据库连接
    

驱动管理类DriverManager使用特定的驱动程序,通过getConnection(Stringusr)方法建与某个特定数据库的连接。每个JDBC驱动都对应一个URL地址用于自我标识,常见的有连接Sun公司的JDBC-ODBC驱动URL、连接Oracle公司的URL、连接Microsoft公司SQL Server的URL和连接MySQL的URL,分别是:

jdbc:odbc:pubsdb;

jdbc:oracle:thin:@localhost:1521:orcl;

jdbc:Microsoft:sqlserver://127.0.0.1:1433;

jdbc:mysql://localhost:3306/mysql;

例如,连接MySQL:

Connection con

=DriverManager.getConnection(“jdbc:mysql://localhost/sample”,username,password);

String url=”jdbc:mysql://localhost/sample”; //sample表示的是数据库,localhost为主机或服务器

String username, //登录MySQL数据库的用户名

String password; //登录MySQL数据库的密码

Connection con=DriverManager.getConnection(“url”,”username”,password);

  1.  创建一个语句对象
    

创建一个语句对象则需要调用接口java.sql.Connection中的createStatement()方法创建Statement类的语句对象,如:

Statement stmt=con.createStatement();

通过创建一个语句对象则可以发送SQL语句到数据库准备执行相应的操作。

  1.  执行SQL语句
    

将SQL语句发送到数据库之后,根据发送的SQL语句确定执行executeQuery()方法或executeUpdate()方法,如果发送的SQL语句是SELECT语句则需要执行executeQuery()方法,如果发送的是SQL语句是Insert()语句、Create语句、Delete语句和Update语句则需要执行executeUpdate()方法,如:

//执行select类型的SQL语句。

ResultSet rs=statement.executeQuery(“SELECT sno,snameFROM student”);

//执行insert类型的SQL语句。

intnum=statement.executeQuery(“INSERT INTO student values(‘2006081203’,’san’,’女’)”);

执行executeQuery()方法后,返回的是一个结果集(ResultSet),结果集是一个对象,用来表示使用SQL语句的查询结果,结果集由许多行组成,行的格式由Select语句的列进行定义,结果集使用游标进行处理数据,游标是指向结果集的句柄,返回结果集时游标指向的是第一行之前,因此如果需要获取数据时必须先将结果集下移1行,数据获取完成之后将结果集再下移1行,用于获取下1条数据。

执行executeUpdate()方法后,返回的并不是结果集,而是该操作影响数据库的行数。

  1.  处理结果集
    

如果需要从返回的结果集中获取数据,那么可以通过结果集对象调用ResultSet接口的getXXX()方法进行获取,然后可以通过JavaBean的setXXX()方法将获取到的数据设置在其中,再将整个JavaBean放入集合中,以方便以后进行获取数据。

  1.  关闭数据库连接
    

结果集处理完成之后,为了释放资源需要在finally语句块中首先关闭语句对象,再关闭数据库连接,如:

stmt.close(); //关闭语句对象。

conn.close(); //关闭数据库连接。

Class 类中的方法

  1. getClasses 和 getDeclaredClasses

getDeclaredClasses 获取到类里所有的的class ,interface 包括了private ,protected,default,public

1.class rechard.learn.reflect.Payment$InnerAccount

  1. getConstructors 和 getDeclaredConstructors

getDeclaredConstructors 打印出类的所有的构造函数

  1. new instance

利用反射创建对象的三种方式
在这里插入图片描述

servlet的生命周期是指servlet从加载、初始化、服务到销毁的一个过程
在这里插入图片描述
tcp/ip 协议 协议包括的层 从底到上 依次为 1.网络接口层,2.互联网层 3.传输层 4.应用层
tcp/ip 是 网络上 数据通信的一种协议,如果没有这个协议,你就在tcp/ip 网络上 什么也做不了

http 协议是 tcp/ip 协议里面包含的 应用层的协议而已,没有这个协议 只是 不能浏览网页而已,其他的 服务是正常的 比如 邮件smtp,pop3 协议,ftp等协议,这些协议都是 应用层协议
ps:
还有tcp/ip 协议里 有 网络接口层,互联网层,传输层,应用层(http协议就包含在应用层里的 一个协议)

  1. is-a来说明对象之间的继承关系
  2. 冒泡排序:将最大值放到末尾,一直缩小范围到第一位
    假设一个 list初始化为{2,9,5,4,8,1}。 在第一次冒泡排序后,list变成了254819
  3. java Thread中,run方法和start方法的区别
    1.start方法 用 start方法来启动线程,是真正实现了多线程, 通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法。但要注意的是,此时无需等待run()方法执行完毕,即可继续执行下面的代码。所以run()方法并没有实现多线程。
    2.run方法 run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码。
  4. 在java代码中以下名命正确的是?在这里插入图片描述
    代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。
  5. 在这里插入图片描述
  6. 在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值