面试中常见的问题

1、5个常用的java-api包

  1. Java.util包(List,set,Map)
  2. Java.lang包(String,Class<>,Lock)
  3. Java.sql(Date)
  4. Java.io(字节流,字符流)
  5. Java.net包(反射)

2、String类中常用的5个方法。

  1. Equals();
  2. Split();
  3. ToString()
  4. ToUpcase()
  5. toLowerCase()

3、TCP/IP、HTTP协议。

TCP:是传输层  面向连接的可靠传输协议

HTTP:是一种超文本传输协议,默认端口是80

IP:指的是主机的地址

4、集合相关的问题(重点)

5、HashMap、Hashtable、LinkedHashMap、ConcurrentHashMap、ArrayList、LinkedList的实现和区别之类的。

     LinkedHashMap继承于hashMap的,hashMap是无序的,而LinkedHashMap是有序;的;

  1. HashMap线程不安全。
  2. HashTable线程安全,但性能差,不推荐使用。
  3. ConcurrentHashMap线程安全,在hashMap的基础上的。
  4. ConcurrentHashMap在Java7中使用segment实现,对每个segment加锁。
  5. ConcurrentHashMap在Java8中是直接在HashMap的基础上进行加锁

6、上述集合中的那些是线程安全的,那些不是。

Hashtable, ConcurrentHashMap是线程安全的,hashMap、LinkedHashMap、ArrayList、LinkedList是线程不安全的;

7、List、Map、Set三个接口,存取元素时,各有什么特点。

List:存储的是一组有序且不唯一的对象

Set存储的是一组无序且唯一的对象

Map:存储的是一组以键值对的key-value映射对象

8、创建线程的几种方式。

 3种方式  Thread   Runnable  Callnable

9、线程同步的方法。

通过Object的wait和notify方法 synchronized()实现同步

同步:A线程请求某资源时,B线程正在使用此资源,由于是同步机制,所有A线程请求不到,A线程需要等待B线程执行完后才能使用;

异步:A线程请求某资源,B线程正在使用此资源,由于是异步机制,A线程仍然请求得到,A线程无需等待

特点:同步是安全机制,而异步是不安全的机制,容易导致出现死锁的现象

10、wait和sleep区别:

  1. wait是Object类的方法,sleep是Thead类的方法;
  2. Wait是释放线程对象锁,sleep是等待线程
  3. Wait会释放cpu的执行权,让给其他线程,sleep不会释放线程

11、Runnable接口和Callable接口的区别。

Runnable和Callable都是通过实现接口来完成线程程序的;

Runnable在实现线程过程中没有返回值,且不会抛出受检异常,而Callable会有返回值,且会抛出受检异常。

Runnale在java1.0就有了,而Callable在java1.5才有的;

12、如何实现线程安全。

  1. 1.使用synchronized修饰代码块;
  2. 2.创建Lock对象 lock() : 获得锁   unlock() : 释放锁 

13、Mybatis#和$的区别

#{}是占位符处理,${}是字符串拼接

在处理#{}的时候会使用preparestatement对象的set来赋值,而处理${}的时候只是简单的将字符串拼接起来;

使用#{}可以防止SQL注入式攻击,有效的提高程序的安全性,

14、Hibernate和Mybatis的区别;

1.Hibernate是一个全自动的orm框架,Mybatis是一个半自动的orm框架。

2. hibernate中的SQL语句已经封装好了,直接使用即可,mybatis需要自己编写SQL;

3.hibernate是完整的orm框架,开发过程中,无需关注底层实现,只需要管理对象即可,mybatis需要自行管理和映射;

4,mybatis的移植性差,hibernate相对而言较好;

5.使用hibernate框架,sql语句难以优化和维护(很多SQL都是自动生成的),性能不是很好,而使用mybatis我们可以写出性能比较高的SQL语句

15、Hibernate的缓存机制。

Hibernate有一级缓存和二级缓存

Hibernate的一级缓存:是有session提供的缓存,它存在与session生命周期中,也就是session关闭缓存结束;

一级缓存就是  Session 级别的缓存,存在与session生命周期中,也就是session关闭缓存结束。

二级缓存是 SesionFactory级别的缓存,从应用启动到应用结束有效。是可选的,默认没有二级缓存,需要手动开启。保存数据库后,缓存在内存中保存一份,如果更新了数据库就要同步更新。

16、什么是Hibernate延迟加载.

所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。

17、为什么要用spring。

方便解耦,简化开发,使用spring可以由我们原来的需要自己手动创建对象,现在交由给spring容器去创建及注入;

18、SQL的考察

1.查询每个班级成绩最高的学生。

2.查找出每个班级成绩第二的学生。

3.按照班级查询每个班上总分前三的学生。

4.查找入职员工时间排名倒数第三的员工所有信息。

5.薪水排序后薪水排名在第2--8的员工。

6.按工资进行排名,排名从1开始,工资相同排名相同(如果两人并列第一则没有第二名,从第三名继续排)。

7.用一条sql语句取出所有姓名有重复的学员姓名和重复的记录数。

19、JSP的内置对象以及作用。

Request:只能在同一个请求中使用

Response::

Session :只能在同一个回话中使用

Application:做同一个项目中使用

Out:输出对象

Exception:

page:jsp页面本身

pageContext:页面的上下文

config :

20、JSTL的常用标签

<c:if><c:set><c:url><c:out>

21、Servlet的生命周期。

加载和实例化,初始化,处理请求 服务结束四个阶段;

Web容器启动,加载servlet,生命周期开始,首先服务器会调用servlet的构造方法执行实例化操作,然后调用init()执行初始化操作,请求到达时UR根据servlet的service()会自动调用与请求对应的doXX方法,来处理请求,当服务器决定将实例销毁前调用destroy()

22、URL和URI的区别。

URL是统一资源定位符

URI是统一资源标识符

23、Ajax同步和异步的区别。

同步:指的是修改页面的某一处需要重新加载整个页面;

异步:无需加载整个界面,实现部分内容更新

  1. 使用ajax发送异步请求的流程。
  1. 创建ajax异步对象
  2. 绑定监听事件
  3. 打开连接(创建请求)
  4. 发送请求

24、&和&&的区别。

两者都是逻辑运算符:&在做判断的时候只要处理的第一个值为true则不会操作第二个值;

&&在处理数据的时候,首选判断第一个数值是否为true,为true则处理第二个数值,为false则处理不会继续处理第二个数值;

25、==和equals的区别。

== 可以比较基本数据类型,比较基本数据类型是值是否相等,比较引用类型是地址是否相等;

Equals比较的是两个对象的地址是否相等;

26、int和Integer的自动拆箱/装箱相关问题。

将整数转换为包装类型就是装箱操作

将Integer转为int则是拆箱操作

27、IO和NIO的区别。

IO是面向流的操作

NIO是面向缓冲的操作

28、final、finally、finalize的区别

final用于修饰属性,方法,类 分别表示 属性不可改变,方法不可重写,类不可被继承

29、重载(Overload)和重写(Override)的区别。

重载:在同一个作用域中方法名相同,参数列表不同,与返回值和修饰符无关;

重写:重写与被重写的方法的名和返回类型必须一致,被重写的方法不能多于重写方法所抛出的异常,重写的方法访问修饰符不能小于被重写的访问修饰符

30、String、StringBuffer和StringBuilder的区别。

STRING作为不可变字符串,而stringbuffer和stringbuild对象

当我们的某些对象需要经常改变的时候我们可以使用stringbuffer,一些不需要常修改的字符串使用string

另外string对象提供了equlas方法而stringbuffer没有

String对象赋值之后,如果去修改的话,就会重新创建一个新的对象,而stringbuffer会用原来的对象

31、如何实现浅克隆和深克隆

深克隆:实现Cloneable接口后,重现clone的方法,回去属性的对象再克隆一次;

浅克隆:实现Cloneable接口后,直接调用clone方法进行克隆称之为浅克隆;

32、单例模式的实现以及最优。

/*
 * 饿汉式的实现
 */
public class Student {
    private static final Student s = new Student();

    public Student() {
    }

    public static Student getInstance() {
        return s;
    }
}

/**
 * 懒汉式的实现
 * 
 * @author lmj
 *
 *         2021年8月17日
 */
class Teacher {
    private static Teacher te = null;

    public Teacher() {
    }

    public static synchronized Teacher getInstance() {
        if (te == null) {
            te = new Teacher();
        }
        return te;
    }
}

33、排序的实现(冒泡、选择、快速等)。

public class Sorted {

/**
     * 冒泡排序从小到大
     */
    public static void sorted() {
        int[] arr = { 1, 6, 3, 7, 4, 5, 2, 9, 8 };
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr.length - i - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j];// 声明一个临时变量存放数据
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }

            }
        }
        System.out.println(Arrays.toString(arr));
    }

/**
     * 冒泡排序从大到小
     */
    public static void sorted() {
        int[] arr = { 1, 6, 3, 7, 4, 5, 2, 9, 8 };
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr.length - i - 1; j++) {
                if (arr[j + 1] > arr[j]) {
                    int temp = arr[j + 1];// 声明一个临时变量存放数据
                    arr[j + 1] = arr[j];
                    arr[j] = temp;
                }

            }
        }
        System.out.println(Arrays.toString(arr));
    }

}

34、去除重复的元素(实际是重写equals和hashcode)。

public class ListTest {
    public static void main(String[] args) {
        List<Teacher> list = new ArrayList<Teacher>();
        list.add(new Teacher("aaa"));
        list.add(new Teacher("bbb"));
        list.add(new Teacher("ccc"));
        list.add(new Teacher("ccc"));
        list.add(new Teacher("aaa"));

        /**
         * 使用hashSet去重
         */
        Set<Teacher> set = new HashSet<Teacher>();
        set.addAll(list);
        for (Teacher t : set) {
            System.out.println(t.toString());
        }
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值