I hope I have something for you.

初级JAVA工程师面试总结

Posted on By Panda Pan

写在最前

最近再帮公司面试一些fresh man 和 Intern ,总结了一些简单的面试题,供初级JAVA参考。

谈谈RequestMapping

  1. RequestMapping 可以细分为GetMapping,PostMapping,PutMapping,DeleteMapping以及其他的请求方式,主要和前端的请求方式搭配使用,限制请求格式。

  2. RequestMethod, method 定义了请求的方法,具体作用和上一条相同。 RequestMapping(method = RequestMethod.GET)

  3. Params , Params表示了限制参数,例如:RequestMapping(method = RequestMethod.GET, params={“name == pandapanzhu”})。

    就表示必须是Get请求并且请求参数中的name字段必须等于pandapanzhu。

  4. consumes , 指定处理请求中的内容类型,RequestMapping(method = RequestMethod.GET, params={“name == pandapanzhu”},consumes = MediaType.APPLICATION_JSON_UTF8_VALUE,)。

    就表示,请求的参数必须是utf-8编码的Json格式的数据。

  5. headers,指定请求头中的参数 headers = “Accept=application/json;charset=UTF-8”

  6. produces,设置返回数据的类型以及编码,produces = MediaType.APPLICATION_JSON_UTF8_VALUE

String ,StringBuffer,StringBuilder的区别

  1. String 是不可修饰的,因为它被final修饰了,String 是常量,创建后不可更改。

     String s1 = "hello"; 
     String s2 = "world";
     String s3 = s1+s2;
     s3 = s3+s2+s1;
    

    上述代码中,我们看到s3最后被重新赋值,并不是String s3改变了值,而是指向了不同的内存地址。

  2. StringBuilder, 和String 一样都是非线程安全的。

    在上述代码中,s3的重新赋值,在JAVA的Class文件中会转译成StringBuilder进行添加。

  3. StringBuffer, 是StringBuilder的升级版本,它线程安全的,但同时效率也会降低,但还是比直接用String来的快。

String str = new String(“abc”)创建了多少个对象?

首先我们应该搞清楚涉及和创建的概念。

很显然,new只调用了一次,也就是说只创建了一个对象。

而这道题目让人混淆的地方就是这里,这段代码在运行期间确实只创建了一个对象, 即在堆上创建了”abc”对象。

而为什么大家都在说是2个对象呢,这里面要澄清一个概念 ,该段代码执行过程和类的加载过程是有区别的。 在类加载的过程中,确实在运行时常量池中创建了一个”abc”对象,而在代码执行过程中确实只创建了一个String对象。

因此,这个问题如果换成 String str = new String(“abc”)涉及到几个String对象?合理的解释是2个。

个人觉得在面试的时候如果遇到这个问题,可以向面试官询问清楚“是这段代码执行过程中创建了多少个对象还是涉及到多少个对象“再根据具体的来进行回答。

int 的取值范围

int 的 取值范围是 -2^31 到 2^31-1, 即 -2147483648——2147483647

int a = object1;
 
int b = object2;

c= a+b;

如果 a与b之和超过了整型的取值范围,系统将会抛出异常。

我们再来看个例子

        int  a = 200000;
        int b = 200000;
        System.out.println(a==b);

        Integer  a1 = 200000;
        Integer b1 = 200000;
        System.out.println(a1==b1);
        System.out.println(a==b1);
        
        返回信息分别是
        true
        false
        true

这里我就不再做多余的解释了,其中意思需要我们自己去慢慢琢磨。

JAVA实例化顺序

一般实例化顺序为

  1. 父类静态变量
  2. 父类静态代码块
  3. 子类静态变量
  4. 子类静态代码块
  5. 父类非静态变量
  6. 父类非静态代码块
  7. 子类非静态变量
  8. 子类非静态代码块

总结(重要):总之就是先实例化静态数据,再实例化非静态数据,都是从上到下的逻辑。

接口和抽象类的区别

相同点

  1. 接口和抽象类都能定义方法和属性。
  2. 接口和抽象类都是看作是一种特殊的类。大部分的时候,定义的方法要子类来实现
  3. 抽象类和接口都可以不含有抽象方法。
  4. 抽象类和接口都不能创建对象。
  5. 抽象类和接口都能利用多态性原理来使用抽象类引用指向子类对象。
  6. 继承和实现接口或抽象类的子类必须实现接口或抽象类的所有的方法,抽象类若有没有实现的方法就继续作为抽象类,要加abstract修饰。若接口的子类没有实现的方法,也要变为抽象类。

不同点

  1. 接口能够多实现,而抽象类只能单独被继承
  2. 方法上,抽象类的方法可以用abstract 和public或者protect修饰。而接口默认为public abstract 修饰
  3. 抽象类的方法可以有需要子类实现的抽象方法,也可以有具体的方法。而接口在老版本的jdk中,只能有抽象方法,但是Java8版本的接口中,接口可以带有默认方法。
  4. 抽象类中可以含有静态代码块和静态方法,而接口不能含有静态方法和静态代码块。
  5. 抽象类可以含有构造方法,接口不能含有构造方法。
  6. Java8中的接口中的默认方法是可以被多重继承的。而抽象类不行。
  7. 接口只能继承接口。而抽象类可以继承普通的类,也能继承接口和抽象类。

error和Exception的区别

Error表示了很难恢复的严重情况,如内存溢出,程序不能自己处理的问题。

常见的Error有:

OutOfMemoryError:内存不足错误。当可用内存不足以让Java虚拟机分配给一个对象时抛出该错误。
StackOverflowError:堆栈溢出错误。当一个应用递归调用的层次太深而导致堆栈溢出时抛出该错误。
ThreadDeath:线程结束。当调用Thread类的stop方法时抛出该错误,用于指示线程结束。
ArithmeticException:算术条件异常。譬如:整数除零等。
AssertionError:断言错。用来指示一个断言失败的情况。
ClassFormatError:类格式错误。当Java虚拟机试图从一个文件中读取Java类,而检测到该文件的内容不符合类的有效格式时抛出。
ExceptionInInitializerError: 初始化程序错误。当执行一个类的静态初始化程序的过程中,发生了异常时抛出。静态初始化程序是指直接包含于类中的static语句段。
IllegalAccessError:违法访问错误。当一个应用试图访问、修改某个类的域(Field)或者调用其方法,但是又违反域或方法的可见性声明,则抛出该异常。

Exception表示的是一种或多种设计和实现上的缺陷,如果程序正常就不会发生的问题。

** (重点来了) ** 同时Exception又分为检出性异常和非检出性异常

检出性异常

所有的检查性异常都继承自java.lang.Exception

检查性异常必须使用try catch或者throws等关键字进行处理,否则编译器会报错;

如: 输入输出异常(IOException),文件不存在异常(FileNotFoundException)、SQL语句异常(SQLException)等

非检出性异常

所有的非检查性异常都继承自java.lang.RuntimeException

非检查性异常一般是程序代码写的不够严谨而导致的问题,可以通过修改代码来规避。

如:空指针异常(NullPointerException),除零异常(ArithmeticException),数组越界异常(ArrayIndexOutOfBoundsException)等

sleep和Wait的区别

sleep() 方法是线程类方法,将执行的机会交给其他线程到时自动恢复。调用sleep不会释放对象锁。

wait() 方法是Object方法,导致本线程放弃对象锁进入等待此对象的等待锁池,通常与notify()或notifyAll() 方法连用。

什么是内存溢出 out of memory

指程序申请内存时,没有足够的内存空间使用

生活例子 : 水杯满了还往里面加水

内存溢出可以通过调整配置来减少发生频率,无法彻底避免

什么是内存泄漏 memory leak

指程序申请了内存后(new),用完的内存没有释放(delete),一直被某个或某些实例所持有却不再被使用导致 GC 不能回收

生活例子 : 电热水器洗完澡不关水,其他人用就没热水的情况

内存泄漏是导致内存溢出的原因之一;内存泄漏累积起来就会造成内存溢出

内存泄漏可以通过完善代码来避免

Java的四大基本特性

  1. 抽象:用abstract修饰,抽象类必须被继承,抽象方法必须被实现。
  2. 封装:将多个方法封装在同一个类中。
  3. 继承:子类不能继承父类的私有变量和方法。
  4. 多态,JAVA的多态主要表现在重写和重载。

Http和Https协议

Http 是互联网上应用最广泛的网络,使用明文传输。

Https 是Http的加强版,全程是Http+SSL,需要CA证书,使用加密传输协议。

cookie和session 的区别

  1. cookie存于客户端,session存于服务端。
  2. session相对cookie更加安全。
  3. 当session的请求过多时,会减缓服务器性能。
  4. 单个cookie保存的数据不能操作4K
  5. 分布式环境下的Session管理,目前有两种方式。 1. session复制(session变化时通过广播的形式通知其他服务器)。2. session共享(常见于redis集群)

参考文档

探秘Java中的String、StringBuilder以及StringBuffer

JAVA8新特性下的接口和抽象类的异同

内存泄漏与内存溢出总结