Java面试题
Posted Taboos_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java面试题相关的知识,希望对你有一定的参考价值。
Java面试题
目录
11.String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的
15ArrayList、LinkedList、Vector 的区别。
3.execute,executeQuery,executeUpdate的区别是什么?
5.相对于Statement,PreparedStatement的优点是什么?
7.java.util.Date和java.sql.Date有什么区别?
3.有两张表;请用SQL查询,所有的客户订单日期最新的前五条订单记录。
7.Student学生表(学号,姓名、性别、年龄、组织部门),Course 课程表(编号,课程名称),Sc选课表(学号,课程编号,成绩)
9.查询“001”课程比“002”课程成绩高的所有学生的学号;
14.查询至少有一门课与学号为“1001”的同学所学相同的同学的学号和姓名;
2.undefined,null 和 undeclared 有什么区别?
8.jquery中$.get()提交和$.post()提交有区别吗?
9.window.onload()函数和jQuery中的document.ready()有什么区别?
10.什么是CDN?哪些是流行的jQuery CDN?使用CDN有什么好处?
3.Servlet API中forward()与redirect()的区别?
4.request.getAttribute()和 request.getParameter()有何区别?
11.http的响应码200,404,302,500表示的含义分别是?
16.JSP中动态include和静态include的区别?
4.如果你也用过 struts2.简单介绍下 springMVC 和 struts2 的区别有哪些?
5.@RequestMapping 注解用在类上面有什么作用?
2.Mybatis 动态 sql 是做什么的?都有哪些动态 sql?能简述一下动态 sql 的执行原理不?
4.为什么说 Mybatis 是半自动 ORM 映射工具?它与全自动的区别在哪里?
4.如何重新加载 Spring Boot 上的更改,而无需重新启动服务器?
5.如何在自定义端口上运行 Spring Boot 应用程序?
JavaSE编程基础
1.JDK,JRE,JVM三者关系
-
- 、jdk是JAVA程序开发时用的开发工具包,其内部也有JRE运行环境JRE。
- 、JRE是JAVA程序运行时需要的运行环境,就是说如果你光是运行JAVA程序而不是去搞开发的话,只安装JRE就 能运行已经存在的JAVA程序了。
- 、JDk、JRE内部都包含JAVA虚拟机JVM,JAVA虚拟机内部包含许多应用程序的类的解释器和类加载器等等。
2.面向过程和面向对象的区别
a.、两者都是软件开发思想,先有面向过程,后有面向对象。在大型项目中,针对面向过程的不足推出了面向对象开发思想。 b.、编程思路不同:面向过程以实现功能的函数开发为主,而面向对象要首先抽象出类、属性及其方法,然后通过实例化类、 执行方法来完成功能。
c.、封装性:都具有封装性,但是面向过程是封装的是功能,而面向对象封装的是数据和功能。面向对象具有继承性和多态性, 而面向过程没有继承性和多态 性,所以面向对象优势是明显。
3.Java有哪些基本数据类型
定义:Java语言是强类型语言,对于每一种数据都定义了明确的具体的数据类型,在内存中分配了不同大小的内存空间。 a.、数值型:整数类型(byte,short,int,long)
b、浮点类型(float,double) c、字符型(char)
d、布尔型(boolean)
4.什么Java注释
定义:用于解释说明程序的文字分类:
单行注释:格式: // 注释文字多行注释:格式: /* 注释文字 */
文档注释:格式:/** 注释文字 */
作用:在程序中,尤其是复杂的程序中,适当地加入注释可以增加程序的可读性,有利于程序的修改、调试和交流。注释的内 容在程序编译的时候会被忽视,不会产生目标代码,注释的部分不会对程序的执行结果产生任何影响。
注意事项:多行和文档注释都不能嵌套使用。
5.Java 有没有 goto
goto 是 Java 中的保留字,在目前版本的 Java 中没有使用。
6.final 有什么用?
用于修饰类、属性和方法;
a、被final修饰的类不可以被继承
b、被final修饰的方法不可以被重写
c、被final修饰的变量不可以被改变,被final修饰不可变的是变量的引用,而不是引用指向的内容,引用指向的内容是可以改变 的
7.final finally finalize区别
a、final可以修饰类、变量、方法,修饰类表示该类不能被继承、修饰方法表示该方法不能被重写、修饰变量表示该变量是一个 常量不能被重新赋值。
b、finally一般作用在try-catch代码块中,在处理异常的时候,通常我们将一定要执行的代码方法finally代码块中,表示不管是 否出现异常,该代码块都会执行,一般用来存放一些关闭资源的代码。
c、finalize是一个方法,属于Object类的一个方法,而Object类是所有类的父类,该方法一般由垃圾回收器来调用,当我们调 用System.gc() 方法的时候,由垃圾回收器调用finalize(),回收垃圾,一个对象是否可回收的最后判断。
8.面向对象三大特性
a、封装:隐藏对象的属性和实现细节,仅对外提供公共访问方式,将变化隔离,便于使用,提高复用性和安全性。
b、继承:继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的 功能,但不能选择性地继承父类。通过使用继承可以提高代码复用性。继承是多态的前提。
c、所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序 运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必 须在由程序运行期间才能决定。
9.== 和 equals 的区别是什么
== : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象。(基本数据类型 == 比较的是值,引用数据类型 == 比较的是内存地址)
equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:
情况1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。
情况2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来两个对象的内容相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。
10.String 类的常用方法都有那些?
a、indexOf():返回指定字符的索引。b、charAt():返回指定索引处的字符。 c、replace():字符串替换。
d、trim():去除字符串两端空白。
e、split():分割字符串,返回一个分割后的字符串数组。 f、getBytes():返回字符串的 byte 类型数组。
g、length():返回字符串长度。
h、toLowerCase():将字符串转成小写字母。 i、toUpperCase():将字符串转成大写字符。g、substring():截取字符串。
k、equals():字符串比较。
11.String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的
a、可变性:String类中使用字符数组保存字符串,private final char value[],所以string对象是不可变的。StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串, char[] value,这两种对象都是可变的。
b、线程安全性:String中的对象是不可变的,也就可以理解为常量,线程安全。AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder并没有对方法进行加同步 锁,所以是非线程安全的。
c、性能:每次对String 类型进行改变的时候,都会生成一个新的String对象,然后将指针指向新的String 对象。StringBuffer 每次都会对StringBuffer对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用StirngBuilder 相比使用
StringBuffer 仅能获得10%~15% 左右的性能提升,但却要冒多线程不安全的风险。
对于三者使用的总结:如果要操作少量的数据用 = String,单线程操作字符串缓冲区 下操作大量数据 = StringBuilder,多线程操作字符串缓冲区 下操作大量数据 = StringBuffer
12.自动装箱与拆箱
a、装箱:将基本类型用它们对应的引用类型包装起来; b、拆箱:将包装类型转换为基本数据类型;
13.int 和 Integer 有什么区别
Java 是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java 为每一个基本数据类型都引入了对应的包装类型(wrapper class),int 的包装类就是 Integer,从 Java 5 开始引入了自动装箱/拆箱机制,使得二者可以相互转换。
14.Java 为每个原始类型提供了哪些包装类型:
原始类型: boolean,char,byte,short,int,long,float,double
包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double
15ArrayList、LinkedList、Vector 的区别。
ArrayList,Vector 底层是由数组实现,LinkedList 底层是由双线链表实现,从底层的实现可以得出它们的性能问题, ArrayList,Vector 插入速度相对较慢,查询速度相对较快,而LinkedList 插入速度较快,而查询速度较慢。再者由于 Vevtor 使用了线程安全锁,所以ArrayList 的运行效率高于 Vector。
JDBC技术
1.什么是JDBC,在上面时候会用到它?
JDBC的全称是Java DataBase Connection,也就是Java数据库连接,我们可以用它来操作关系型数据库。JDBC接口及相关类在java.sql包和javax.sql包里。我们可以用它来连接数据库,执行SQL查询,存储过程,并处理返回的结果。
JDBC接口让Java程序和JDBC驱动实现了松耦合,使得切换不同的数据库变得更加简单。
2.JDBC访问数据库的基本步骤是什么? a、加载(注册)数据库驱动(到JVM) b、建立(获取)数据库连接。
c、创建(获取)数据库操作对象。
d、定义操作的SQL语句。e、执行数据库操作。
f、获取并操作结果集。
g、关闭对象,回收数据库资源(关闭结果集-->关闭数据库操作对象-->关闭连接)
3.execute,executeQuery,executeUpdate的区别是什么?
a、Statement的execute(String query)方法用来执行任意的SQL查询,如果查询的结果是一个ResultSet,这个方法就返回true。如果结果不是ResultSet,比如insert或者update查询,它就会返回false。
b、Statement的executeQuery(String query)接口用来执行select查询,并且返回ResultSet。即使查询不到记录返回的ResultSet也不会为null。我们通常使用executeQuery来执行查询语句,这样的话如果传进来的是insert或者update语句的 话,它会抛出错误信息为 “executeQuery method can not be used for update”的java.util.SQLException。
c、Statement的executeUpdate(String query)方法用来执行insert或者update/delete(DML)语句。
d、只有当你不确定是什么语句的时候才应该使用execute()方法,否则应该使用executeQuery或者executeUpdate方法。
4.JDBC的PreparedStatement是什么?
PreparedStatement对象代表的是一个预编译的SQL语句。用它提供的setter方法可以传入查询的变量。由于PreparedStatement是预编译的,通过它可以将对应的SQL语句高效的执行多次。由于PreparedStatement自动对特殊字符转 义,避免了SQL注入攻击,因此应当尽量的使用它。
5.相对于Statement,PreparedStatement的优点是什么?
a、PreparedStatement有助于防止SQL注入,因为它会自动对特殊字符转义。 b、PreparedStatement可以用来进行动态查询。
c、PreparedStatement执行更快。尤其当你重用它或者使用它的拼量查询接口执行多条语句时。
d、使用PreparedStatement的setter方法更容易写出面向对象的代码,而Statement的话,我们得拼接字符串来生成查询语句。 如果参数太多了,字符串拼接看起来会非常丑陋并且容易出错。
6.JDBC的ResultSet是什么?
在查询数据库后会返回一个ResultSet,它就像是查询结果集的一张数据表。ResultSet对象维护了一个游标,指向当前的数据 行。开始的时候这个游标指向的是第一行。如果调用了ResultSet的next()方法游标会下移一行,如果没有更多的数据了, next()方法会返回false。可以在for循环中用它来遍历数据集。
7.java.util.Date和java.sql.Date有什么区别?
java.util.Date包含日期和时间,而java.sql.Date只包含日期信息,而没有具体的时间信息。如果你想把时间信息存储在数据库 里,可以考虑使用Timestamp或者DateTime字段。
8.说说事务的概念,在JDBC编程中处理事务的步骤。
事务是作为单个逻辑工作单元执行的一系列操作,一个逻辑工作单元必须有四个属性,称为原子性、一致性、隔离性和持久性
(ACID) 属性,只有这样才能成为一个事务 。JDBC处理事务有如下操作:
conn.setAutoComit(false);设置提交方式为手工提交conn.commit()提交事务
conn.rollback(),回滚
提交与回滚只选择一个执行。正常情况下提交事务,如果出现异常,则回滚。
9.数据库连接池的原理。为什么要使用连接池。
数据库连接是一种关键的有限的昂贵的资源,对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序 的性能指标。数据库连接池正是针对这个问题提出来的。
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个;释 放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对 数据库操作的性能。
数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了 这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。
10.什么是JDBC的最佳实践?
a、数据库资源是非常昂贵的,用完了应该尽快关闭它。Connection, Statement, ResultSet等JDBC对象都有close方法,调用它就好了。
b、养成在代码中显式关闭掉ResultSet,Statement,Connection的习惯,如果你用的是连接池的话,连接用完后会放回池里, 但是没有关闭的ResultSet和Statement就会造成资源泄漏了。
c、在finally块中关闭资源,保证即便出了异常也能正常关闭。
d、尽量使用PreparedStatement而不是Statement,以避免SQL注入,同时还能通过预编译和缓存机制提升执行的效率。 e、数据库隔离级别越高性能越差,确保你的数据库连接设置的隔离级别是最优的。
f、如果在WEB程序中创建数据库连接,最好通过JNDI使用JDBC的数据源,这样可以对连接进行重用。
Mysql数据库技术
1.数据库MySQL分页时用的语句
使用limit关键字。Select * from 表名 where 条件 limit 开始位置,结束位置。通过动态的改变开始和结束位置的值来实现分页。
2.根据你以往的经验简单叙述一下MYSQL的优化
a、尽可能使用更小的整数类型.(mediumint就比int更合适). b、尽可能的定义字段为not null,除非这个字段需要null.
c、如果想要清空表的所有记录,建议用truncate table tablename而不是delete from tablename. d、避免出现SELECT * FROM table 语句,要明确查出的字段。
e、小心使用 IN 和 OR,需要注意In集合中的数据量。建议集合中的数据不超过200个。
3.有两张表;请用SQL查询,所有的客户订单日期最新的前五条订单记录。
客户信息表(c CUSTOM)有以下字段:id、name、mobile
客户订单表(C_ORDER)有以下字段:id、custom_id、commodity、count、order _date Select * from c_order order by order_date desc limit 0,5;
4.数据库设计中,一对多如何处理?
数据库外键关系表示的其实是一种一对多关系,所以处理一对多时可以使用外键。
5.数据库设计中,多对多一般如何处理?
引入中间表,把一个多对多表示为两个一对多。
6.MySQL数据库中,常用的数据类型
类型名称 | 说明 |
int(integer) | 整数类型 |
double | 小数类型 |
decimal(m,d) | 指定整数位与小数位长度的小数类型 |
date | 日期类型,格式为yyyy-MM-dd,包含年月日,不包含时分秒 |
datetime | 日期类型,格式为yyyy-MM-dd HH:mm:ss,包含年月日时分秒 |
timestamp | 日期类型,时间戳 |
varchar(M) | 文本类型,M为0~65535之间的整数 |
7.Student学生表(学号,姓名、性别、年龄、组织部门),Course 课程表(编号,课程名称),Sc选课表(学号,课程编号,成绩)
a、写一个SQL语句,查询选修了计算机原理的学生学号和姓名
select 学号,姓名 from Student where 学号 in(select 学号 from Sc where 课程编号 in(Select 课程编号 from Course where 课程名称 = ‘计算机原理’))
b、写一个SQL语句,查询“周星驰”同学选修了的课程名字
select 课程名称 from Course where 编号 in (select Sc.课程编号 from Student,Sc where Student.姓名=’周星驰’ and Student.学号 = Sc.学号)
8.表结构说明
下面是学生表的(Student)的结构说明
字段名称 | 字段解释 | 字段类型 | 字段长度 | 约束 |
s_id | 学号 | 字符 | 10 | PK |
s_name | 学生姓名 | 字符 | 50 | Not null |
s_age | 学生年龄 | 数值 | 3 | Not null |
s-sex | 学生性别 | 字符(男:1女:0) | 1 | Not null |
下面是教师表(Teacher )的结构说明
字段名称 | 字段解释 | 字段类型 | 字段长度 | 约束 |
t_id | 教师编号 | 字符 | 10 | PK |
t_name | 教师名字 | 字符 | 50 | Not null |
下面是课程表(Course)的结构说明
字段名称 | 字段解释 | 字段类型 | 字段长度 | 约束 |
c_id | 课程编号 | 字符 | 10 | PK |
c_name | 课程名字 | 字符 | 50 | Not null |
t_id | 教师编号 | 字符 | 10 | Not null |
下面是成绩表(SC)的结构说明
字段名称 | 字段解释 | 字段类型 | 字段长度 | 约束 |
s_id | 学号 | 字符 | 10 | PK |
c_id | 课程编号 | 字符 | 10 | Not null |
score | 成绩 | 数值 | 3 | Not null |
9.查询“001”课程比“002”课程成绩高的所有学生的学号;
select a.s_id from (select s_id,score from SC where C_ID='001') a,(select s_id,scorefrom SC where C_ID='002') b where a.score>b.score and a.s_id=b.s_id;
10.查询平均成绩大于60分的同学的学号和平均成绩;
select S_ID,avg(score) from sc group by S_ID having avg(score) >60;
11.查询所有同学的学号、姓名、选课数、总成绩;
select Student.S_ID,Student.Sname,count(SC.C_ID),sum(score) from Student left Outer join SC on Student.S_ID=SC.S_ID group by Student.S_ID,Sname
12.查询姓“李”的老师的个数;
select count(distinct(Tname)) from Teacher where Tname like '李%';
13.查询所有课程成绩小于60分的同学的学号、姓名;
select S_ID,Sname from Student where S_ID not in (select S.S_ID from Student AS S,SC where S.S_ID=SC.S_ID and score>60);
14.查询至少有一门课与学号为“1001”的同学所学相同的同学的学号和姓名;
select distinct S_ID,Sname from Student,SC where Student.S_ID=SC.S_ID and SC.C_ID in (select C_ID from SC where S_ID='1001');
JavaScript语言和jQuery技术
1.JS中如何将页面重定向到另一个页面?
a、使用 location.href:window.location.href =“https://www.baidu.com/”
b、使用location.replace:window.location.replace(" https://www.baidu.com/;");
2.undefined,null 和 undeclared 有什么区别?
a、null表示"没有对象",即该处不应该有值,转为数值时为0。典型用法是:作为函数的参数,表示该函数的参数不是对象。作 为对象原型链的终点。
b、undefined表示"缺少值",就是此处应该有一个值,但是还没有定义,转为数值时为NaN。典型用法是:变量被声明了,但没 有赋值时,就等于undefined。调用函数时,应该提供的参数没有提供,该参数等于undefined。对象没有赋值的属性,该属性的 值为undefined。函数没有返回值时,默认返回undefined。
c、undeclared:js语法错误,没有申明直接使用,js无法找到对应的上下文。
3. 如何在JavaScript中每x秒调用一个函数
4.JS 中 == 和 === 区别是什么?
a、对于string,number等基础类型,==和===有区别:不同类型间比较,==之比较“转化成同一类型后的值”看“值”是否相等,===如 果类型不同,其结果就是不等。同类型比较,直接进行“值”比较,两者结果一样。
b、对于Array,Object等高级类型,==和===没有区别,进行“指针地址”比较。