以下java题目,为我自己面试遇到的问题,在此做个记录,以便于以后自己能随时查阅,若答案有问题,欢迎大佬指出,谢谢!!!!
1.exist和in的区别?以及何时exist效率大于in?何时in的效率大于exist?
in()适合B表比A表数据小的情况
exists()适合B表比A表数据大的情况
当A表数据与B表数据一样大时,in与exists效率差不多,可任选一个使用.
参考连接:https://blog.csdn.net/lilun517735159/article/details/78826521
2.Controller向页面传值有几种方式?如何实现传值?
有五种传值方式:
利用request进行值传递: request.SetAttribute()
利用Model进行值传递: model.addAttribute()
利用hashMap进行传递:hashMap.put();
利用ModelAndView进行传递: xxx.addObject("admin", bean); xxxx.setViewName("Model");
利用Session进行传递: session.setAttribute()
3.页面向Controller传值有几种方式?如何实现传值?
有五种传值方式:
直接将请求参数名作为Controller中方法的形参:
public String login (String username,String password) :
使用@RequestParam 绑定请求参数参数值:
public String login(RequestParam ("username") String name) :
用注解@RequestMapping接收参数的方法
使用实体类 public String login(User user){}
使用request public String login(HttpServletRequest request){String usernma=Request.getParameter("username");}
4.jsp的内置对象,及其作用?
JSP中一共预先定义了9个这样的对象,分别为:request、response、session、application、out、pagecontext、config、page、exception
5.查询所有学科成绩大于80分的学生姓名。
sql1: select name from table group by name having min(fenshu > 80); -------推荐
sql2:select name from table group by name having name not in (select name from table where fenshu <=80); (也可使用 not exist)
sql3: select distinct from table where name not in (select name from table where fenshu <=80); (也可使用 not exist)
6.面向对象的特征,并分别解释下
封装:封装就是隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别.
继承:继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为
多态:多态就是同一个行为具有多个不同表现形式或形态的能力(多态存在条件:继承、重写、父类引用指向子类对象)。
7.==和equals的区别?
==是一个比较运算符,基本数据类型比较的是值,引用类型则比较的是所指向的对象的地址是否相同。
equals()是一个方法,只能比较引用数据类型。默认比较的是所指向的对象的地址是否相同,如String等重写后比较的是所指向的对象的内容是否想等。
8.书写一个单列模式
单列模式的书写公有8中方法,下面只列出推荐使用的几种:
1.饿汉式(线程安全,类加载时就初始化,可能会浪费内存)
public class Singleton { private static Singleton instance = new Singleton(); private Singleton() {} public static Singleton getInstance() { return instance; } }2.懒汉式(线程安全)---推荐
public class Singleton { private Singleton() {} private static class SingletonInstance { private static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance() { return SingletonInstance.INSTANCE; } }
9.如何查询出2个字段完全一样的表的所有数据
使用union或者union all
10.如何查询一个表中重复的数据
select NAME,scoure,SUBJECT from student GROUP BY NAME,scoure,SUBJECT HAVING COUNT(1) >1 -----除了主键外其余相同的字段都要放到group by中
11.书写一个jdbc连接代码?
package mysql; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.Statement; public class Day01 { // public static void main(String[] args) { // try { // Class.forName("com.mysql.jdbc.Driver"); // Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/study?&useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false","root","123456"); // Statement statement = conn.createStatement(); // statement.executeUpdate("insert into test (id,name) values(2,'魏义己')"); // System.out.println("执行完毕"); // // } catch (Exception e) { // // TODO: handle exception // } // } public static void main(String[] args) { try { //注册驱动 Class.forName("com.mysql.jdbc.Driver"); //获取连接 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/study?&useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false","root","123456"); //创建PreparedStatement PreparedStatement pStatement = conn.prepareStatement("insert into test (id,name) values(?,?)"); for(int i=3;i<10;i++) { pStatement.setInt(1, i); pStatement.setString(2, "测试"+i); pStatement.executeUpdate(); } System.out.println("执行完毕"); //关闭连接 conn.close(); } catch (Exception e) { // TODO: handle exception } } }
12.用位运算计算出(Int)x乘以8的结果和过程?
public static void main(String[] args) { System.out.println(num(2)); } public static int num(int a){ return a<<3; }
13.书写一个冒泡算法案例。
/* * 冒泡排序(从小到大排序) */ public class BubbleSort { public static void main(String[] args) { int[] arr={6,3,8,2,9,1}; System.out.println("排序前数组为:"); for(int num:arr){ System.out.print(num+" "); } for(int i=0;i<arr.length-1;i++){//外层循环控制排序趟数 for(int j=0;j<arr.length-1-i;j++){//内层循环控制每一趟排序多少次 if(arr[j]>arr[j+1]){ int temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } System.out.println(); System.out.println("排序后的数组为:"); for(int num:arr){ System.out.print(num+" "); } } }
14.java中如何交换2个字符串的值?
创建一个中间变量,然后直接交换即可
15.java中统计某个字符串中某个字符出现的次数。
方法一:使用replace方法将字符串替换为空,然后用原来总长度减去替换后的长度
public static void way2(String st,String M) { int count = (st.length()-st.replace(M, "").length())/M.length(); System.out.println("指定字符串在原字符串中出现:"+count+"次"); }方法二:使用indexOf和subString方法,循环判断并截取
public static void way1(String st,String M) {
int count = 0;
while(st.indexOf(M)>=0) {
st=st.substring(st.indexOf(M)+M.length());
count++;
}
System.out.println("指定字符串在原字符串中出现:"+count+"次");
}
16.在JSP中<%!%>,<%%><%=%>三个标签有什么区别
<%!%> 表示声明一个变量
<%%>表示所执行的jsp语句块,也就是相应的java代码
<%=%>相当于<%out.println("字符串");%>,在网页中显示某一个变量或某一个表达式的值
1.ArrayList是Array(动态数组)的数据结构,LinkList是Link(链表)的数据结构,此外,它们两个都是对List接口的实现。
2.用get方法访问时,ArraryList效率高,因为LinkList是链表结构,需要移动指针从前到后依次查找。
3.增加删除时LinkList效率更高,因为ArraryList是数组,删除时会对之后的数据下标造成影响,需要进行数据的移动。
18.表空间与用户和数据文件关系?
- 一个表空间有多个数据文件,一个数据文件只能属于一个表空间。
- 一个数据库可以有多个表空间,每一个库都有一个system表空间。
- 一个用户可以使用一个或多个表空间,一个表空间也可以供多个用户使用。
- 用户和表空间没有隶属关系,表空是一个用来管理数据存储逻辑概念,表空间只是和数据文件发生关系,数据文件是物理的,一个表空间可以包含多个数据文件,而一个数据文件只能隶属一个表空间。
- 用户在创建表的时候没有指定表空间,使用该用户的默认表空间(创建用户的时候需要指定)。
19.jsp和Servert的区别?
1.JSP是Servlet技术的扩展,本质上就是Servlet的简易方式,JSP编译后就是“类servlet”。
2.jsp更擅长表现于页面显示,servlet更擅长于逻辑控制.
20.http中404、405、500分别是什么错误?
404 访问路径不存在
500 系统出现重大问题
405 找不到处理请求的方法
21.jsp和freemarker以及thymleaf的区别?
22.try和finally中都有return时返回值是否改变?
首先要确定的一点是,不管有木有出现异常,finally块中代码都会执行
执行try块,执行到return语句时,先执行return的语句,但是不返回到main 方法,接下来执行finally块,遇到finally块中的return语句,执行,并将值返回到main方法,这里就不会再回去返回try块中计算得到的值
23.利用递归算法,计算6!
package com.xuanyin.udp; /** * 递归算法案例 * @author Administrator * */ public class DiGui { public static long fac(int i) { if(i == 1) { return 1; }else { return i*fac(i-1); } } public static void main(String[] args) { System.out.println(fac(6)); } }
24.java参数传递方式?
值传递:不会改变原来的
引用传递:会改变引用对象的值
25.jvm的内存机制介绍?
堆:存储所有new出来的对象(包括成员变量),堆是被所有线程共享的,如果java堆空间不足了,程序会抛出OutOfMemoryError异常。
栈:栈中包含着一个一个的栈帧,栈帧中存储着正在调用方法中的所有局部变量(包括参数),栈不是线程所共享的,每个线程对对应着一个java栈
因此,递归调用方法容易出现StackOverflowError(内存溢出)
方法区:存储了每个类的信息(包括类的名称、方法信息[方法只有一份,通过this来区分具体的对象]、字段信息)、静态变量、常量以及.class字节码文件等,方法区是被线程所共享的
方法区中包含着运行时常量池
本地方法栈:本地方法栈与Java栈的作用和原理非常相似。区别只不过是Java栈是为执行Java方法服务的,而本地方法栈则是为执行本地方法(Native Method)服务的。
程序计数器:用来指示 执行哪条指令的,程序计数器是每个线程所私有的。
26.基本类型的范围?
int 范围: -231 —— 231 -1
byte范围: -27 —— 27 -1
总结:-2n-1 ——2n-1 -1(n是位数,例如:int是4个字节,一个字节占8位,所以是32位)
27.位运算
3&1 结果是1
3 |1 结果是3
先转化成二进制,然后对应每一位进行&或|运算,最后将每位计算结果拼起来再转换成十进制
3 >> 2 结果是0
3 <<2 结果是12 (结论:n << m 结果是: n * 2m)
先将3转换成二进制11,>>是右移2位,变成0,<<是左移2位,变成1100 转换成十进制就是12
28.HashMap、LinkedHashMap、HashTable、TreeMap的区别?
1.Hashtable、HashMap、TreeMap都实现了Map接口,使用键值对的形式存储数据和操作数据。
2.Hashtable是java早期提供的,方法是同步的(加了synchronized,即是线程安全的)。key和value都不能是null值。
3,HashMap的方法不是同步的(即是线程不安全的),支持key和value为null的情况。行为上基本和Hashtable一致。由于Hashtable是同步的,性能开销比较大,一般不推荐使用Hashtable。通常会选择使用HashMap。
4.HashMap进行put和get操作,基本上可以达到常数时间的性能
5.TreeMap是基于红黑树的一种提供顺序访问的Map,和HashMap不同,它的get或put操作的时间复杂度是O(log(n))。具体的顺序由指定的Comparator来决定,或者根据键key的具体顺序来决定。
6.LinkedHashMap保存了记录的插入顺序,在用Iteraor遍历LinkedHashMap时,先得到的记录肯定是先插入的。在遍历的时候会比HashMap慢。有HashMap的全部特性。
29.Lock与synchronize的区别?
Lock是一个接口,而synchronized是关键字。.
synchronized会自动释放锁,而Lock必须手动释放锁。
Lock可以让等待锁的线程响应中断,而synchronized不会,线程会一直等待下去。
通过Lock可以知道线程有没有拿到锁,而synchronized不能。
Lock能提高多个线程读操作的效率。
synchronized能锁住类、方法和代码块,而Lock是块范围内的
30.Mysql如何查看正在执行sql的运行情况?
再mysql输入命令行show processlist查询即可
31.java中常见的线程安全和不安全的类有那些?
线程安全的:Vector(向量类)、hashtable、String类、StringBuffer
线程不全的:HashMap、ArrayList、StringBuilder
32.java中常见的线程池?
33.spring中bean的作用域
singleton:IOC容器仅创建一个Bean实例,IOC容器每次返回的是同一个Bean实例。
prototype: IOC容器可以创建多个Bean实例,每次返回的都是一个新的实例。
request:该属性仅对HTTP请求产生作用,使用该属性定义Bean时,每次HTTP请求都会创建一个新的Bean,适用于WebApplicationContext环境。
session:该属性仅用于HTTP Session,同一个Session共享一个Bean实例。不同Session使用不同的实例。
global-session:该属性仅用于HTTP Session,同session作用域不同的是,所有的Session共享一个Bean实例。
34.常见的RuntimeExcetion有哪些?
ArithmeticException:数学计算异常。
NullPointerException:空指针异常。
ArrayOutOfBoundsException:数组索引越界异常。
ClassNotFoundException:类文件未找到异常。
ClassCastException:类型强制转换异常。
FileNotFoundException:文件未找到异常。
NumberFormatException:字符串转换为数字异常。
35.为什么重写equals,就必须重写hashcode,什么情况下可以不重写hashcode?
(1)当所在类不使用HashSet、Hashtable、HashMap等散列集合进行存储的时候,可以不使用hashcode。
(2)当在HashSet、Hashtable、HashMap中使用该类时,hashcode和equals是有关系的,hashcode和equals需要同时重写才能保证元素的唯一性。hashcode是为了提高散列结构存储中查找的效率,在线性表中没有作用。
36.synchronize和Lock锁的区别?
Lock是一个接口,而synchronized是关键字。
synchronized会自动释放锁,而Lock必须手动释放锁。
Lock可以让等待锁的线程响应中断,而synchronized不会,线程会一直等待下去。
通过Lock可以知道线程有没有拿到锁,而synchronized不能。
Lock能提高多个线程读操作的效率。
synchronized能锁住类、方法和代码块,而Lock是块范围内的
37.springboot如何在项目启动后添加输出语句?
1..实现 ApplicationRunnerImpl
2.实现CommandLineRunnerImpl
38.为什么HashMap是不安全得?
初始桶的数量为16,超过阈值后就会进行扩容操作(每次都变成原理的2倍),在扩容操时可能出现线程不安全。比如:
put的时候导致的多线程数据不一致。
HashMap的get操作可能因为resize而引起死循环
39.多线程同时操作HashMap是会出现什么情况?
会造成数据不一致得错误,如:A线程put时,B线程也调用了put,并且把值插入进去了,当A线程和B线程插入得key一样时,A插入成功后,会把B线程插入的值覆盖掉
40.Mysql数据量过大时,limit 100000,100 查询效率很低,该如何进行优化?
首先limit 100000,100查询的是前10W条之后的100条数据,limit 后边如果只有一个数字则是查询前多少条记录
优化方式:利用子查询优化,修改成 where id >=(select id from XXX limit 10000,1)
41.Mysql优化方案有哪些?
1.数据库方面优化:
a.设计表时字段大小的定义,主外键的指定
b.尽量把字段设置为NOT NULL
c.适当的添加索引、视图、函数等
d.选择正确的存储引擎
2.查询方式的优化:
a.适当的采用分页查询和子查询
b.查询所需字段即可,尽量避免查询所有字段
c.sql的优化等
42.已知π/2≈1+1/3+1/3*2/5+1/3*2/5*3/7…… 计算π的近似值,保留10位小数
private static double fun2() { double he = 1; //和 double a = 1; // 每一项的值 int b = 1; //第几项 while (a > 0.000000000001) { a = (b*1.0) / (b * 2 + 1) * a; he += a; b++; } BigDecimal adafa = new BigDecimal(he*2); he = adafa.setScale(10, BigDecimal.ROUND_HALF_UP).doubleValue(); return he; }
43.ArrayList的扩容机制是什么?
在第一个添加元素时,创建一个长度为10的数组,之后随着元素的增加,以1.5倍原数组的长度创建一个新数组,即10, 15, 22, 33,。。这样序列建立,将原来的元素拷贝到新数组之中,如果数组长度达到上限,则会以MAX_ARRAY_SIZE 或者 Integer.MAX_VALUE作为最大长度,而多余的元素就会被舍弃掉。