Java后台常见面试题

SpringBoot与Spring区别

  1. Spring 框架就是由框架来帮你管理这些对象,包括它的创建,销毁等。 Spring框架还是体现高内举,低耦合的。Spring Framework 本身并未提供太多具体的功能,它主要专注于让你的项目代码组织更加优雅,使其具有极好的灵活性和扩展性,同时又能通过Spring集成业界优秀的解决方案
  2. SpringMVC主要用于开发WEB应用和网络接口,它是Spring的一个模块,通过Dispatcher Servlet, ModelAndView 和 View Resolver,让应用开发变得很容易。
  3. SpringBoot目的在于实现自动配置,降低项目搭建的复杂度。
  4. 最后一句话总结:Spring MVC和Spring Boot都属于Spring,Spring MVC 是基于Spring的一个 MVC 框架,而Spring Boot 是基于Spring的一套快速开发整合包

布尔类型占几个字节?为什么占这么多字节?

“虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持。在Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达式所操作的boolean值,在编译之后都使用Java虚拟机中的int数据类型来代替,而boolean数组将会被编码成Java虚拟机的byte数组,每个元素boolean元素占8位”。这样我们可以得出boolean类型占了单独使用是4个字节,在数组中又是1个字节。

显然第三条是更准确的说法,那虚拟机为什么要用int来代替boolean呢?为什么不用byte或short,这样不是更节省内存空间吗。大多数人都会很自然的这样去想,我同样也有这个疑问,经过查阅资料发现,使用int的原因是,对于当下32位的处理器(CPU)来说,一次处理数据是32位(这里不是指的是32/64位系统,而是指CPU硬件层面),具有高效存取的特点。

数据库中的并发一致性问题

  • 丢失修改
    T1 和 T2 两个事务都对一个数据进行修改,T1 先修改,T2 随后修改,T2 的修改覆盖了 T1 的修改。
  • 读脏数据
    T1 修改一个数据,T2 随后读取这个数据。如果 T1 撤销了这次修改,那么 T2 读取的数据是脏数据。
  • 不可重复读
    T2 读取一个数据,T1 对该数据做了修改。如果 T2 再次读取这个数据,此时读取的结果和第一次读取的结果不同。
  • 幻影读

T1 读取某个范围的数据,T2 在这个范围内插入新的数据,T1 再次读取这个范围的数据,此时读取的结果和和第一次读取的结果不同。

产生并发不一致性问题主要原因是破坏了事务的隔离性,解决方法是通过并发控制来保证隔离性。并发控制可以通过封锁来实现,但是封锁操作需要用户自己控制,相当复杂。数据库管理系统提供了事务的隔离级别,让用户以一种更轻松的方式处理并发一致性问题。

数据库中的事物隔离级别

  • 未提交读(read uncommitted)
    事务中的修改,即使没有提交,对其它事务也是可见的
  • 提交读(read committed)
    一个事务智能读取已经提交的事务所做的修改。即,一个事务所做的修改在提交之前对于其它事务来说是不可见的。
  • 可重复读(repeatable read)
    保证同一个事务中多次读取同样的数据的结果是一样的。
  • 可串行化
    强制事务串行执行
隔离级别 脏读 不可重复读 幻影读 加锁读
未提交读
提交读
可重复读
可串行化

mybatis中的#{}和${}区别

  1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by “111”, 如果传入的值是id,则解析成的sql为order by “id”.

    $将传入的数据直接显示生成在sql中。如:order by u s e r i d user_id userid,如果传入的值是111,那么解析成sql时的值为order by user_id, 如果传入的值是id,则解析成的sql为order by id.

  2. #方式能够很大程度防止sql注入。$方式无法防止Sql注入。

5.KaTeX parse error: Expected 'EOF', got '#' at position 32: …传入表名.    6.一般能用#̲的就别用.

MyBatis排序时使用order by 动态参数时需要注意,用$而不是#

Http的错误码

500 内部错误 — 因为意外情况,服务器不能完成请求。
304 未修改 — 未按预期修改文档。
302 已找到 — 请求的数据临时具有不同 URI。

了解过concurrent包下的类吗?其中concurrentHashMap的key能不能为空?HashMap的key呢?如果HashMap的key为null,是怎么存储的呢?

ConcurrentHashMap不允许插入为null的key\value,get也不可以,会包nullpointerException。

hashtable,concurrenthashmap它们是用于多线程的,并发的 ,如果map.get(key)得到了null,不能判断到底是映射的value是null,还是因为没有找到对应的key而为空,而用于单线程状态的hashmap却可以用containKey(key) 去判断到底是否包含了这个null。

hashtable为什么就不能containKey(key) ??因为一个线程先get(key)再containKey(key),这两个方法的中间时刻,其他线程怎么操作这个key都会可能发生,例如删掉这个key

单例模式和线程安全的单例模式

  • 仅用于单线程下的
public class Singeton
{
    private Singeton()
    {

    }

    private static Singeton singeton = null;

    public static Singeton getInstance()
    {
        if (singeton == null)
            return new Singeton();
        else
            return singeton;
    }

}
  • 利用静态构造函数
/**
 * 利用静态构造函数
 */
public class Singeton
{
    private Singeton()
    {

    }

    private static Singeton singeton = new Singeton();

    public Singeton getSingeton()
    {
        return singeton;
    }
}

如果我们自己写一个包名和类名跟jdk中的类完全一样,那么类加载器会加装这个类吗?

不能自己写以"java."开头的类,其要么不能加载进内存,要么即使你用自定义的类加载器去强行加载,也会收到一个SecurityException。

JVM是怎么进行垃圾回收的

  1. 针对方法区和堆,这两个地方是线程间共享的。程序计数器,虚拟机栈,本地方法栈都是线程内私有的,线程消失之后,也随之消失。
  2. 如何判断一个对象可不可以被回收。引用计数法和可达性分析法。
  3. 垃圾收集算法:标记-清除,标记-整理,复制,分代收集。
  4. 有七种垃圾收集器,现在都是多种垃圾收集器组合使用。

冒泡排序

public class BubbleSort
{
    public static void main(String[] args)
    {
        int[] arr = {1,1,2,0,9,3,12,7,8,3,4,65,22};
        bubbleSort(arr,arr.length);
        printArr(arr);
    }

    public static void printArr(int[] a)
    {
        for (int element : a)
        {
            System.out.print( element + " ");
        }
        System.out.println();
    }

    public static void bubbleSort(int[] a,int n)
    {
        for(int i=0;i a[j])
                {
                    int temp = a[j-1];
                    a[j-1] = a[j];
                    a[j] = temp;
                }
            }
        }
    }
}

如何实现nginx动静态分离

你可能感兴趣的:(java,java入坑之路)