面试_java_一些区别

93 阅读7分钟

Java变量的静态绑定与动态绑定

  • 静态绑定发生在编译时期;动态绑定发生在运行时
  • 静态绑定使用类信息完成;动态绑定使用对象信息完成
  • 使用static或final修饰的,为静态绑定;使用虚函数的,为动态绑定
  • 重载的方法为静态绑定;重写的方法为动态绑定



静态链接与动态链接的区别

  • 在链接阶段,将汇编生成的.o目标文件与引用到的库一起链接打包到可执行文件中。

    程序在运行时与函数库再无瓜葛,易于移植

  • 动态库把对库函数的链接推迟到程序运行时。可以实现进程之间的资源共享

    因此动态库也称为共享库




内存溢出与内存泄漏的区别

  • 内存溢出:指程序申请内存时,没有足够的内存供申请者使用。

  • 内存泄漏:指未能及时释放掉已经申请的但不再使用的内存。

    c++使用varglind、mtrace来处理内存泄漏




缓存(Cache)和缓冲(Buffer)的区别

  • cache 是为了提高cpu和内存之间的数据交换速度而引入的中间层,具体是利用局部性原理,把常用数据存储到可以快速获取的区域,以备重复利用。起到加快访问速度的作用。

  • buffer 的主要目的进行流量整形,把突发的大数量较小规模的 I/O 整理成平稳的小数量较大规模的 I/O,以减少I/O次数(比如从网上下电影,你不能下一点点数据就写一下硬盘,而是积攒一定量的数据以后一整块一起写,减少I/O次数)。




栈和队列的异同

相同点:

  • 都是线性结构。
  • 插入操作都是限定在表尾进行。
  • 都可以通过顺序结构和链式结构实现。
  • 插入与删除的时间复杂度都是O(1),在空间复杂度上两者也一样。

不同点:

  • 一个是单端操作,一个是双端操作

  • 栈能够实现多栈空间共享,而队列不能。

  • 应用场景不同。栈:括号匹配、表达式的转换和求值、函数调用和递归实现、深度优先搜索遍历等;

    ​ 队列:打印机、广度优先搜索遍历等。




堆和栈的区别

  • 按管理方式

    • 栈是系统编译器启动管理,不需要程序员手动管理
    • 堆的释放由程序员手动管理,不及时回收容易产生内存泄露
  • 按分配方式

    • 栈有两种分配方式:静态分配和动态分配
    • 堆是动态分配和回收内存的,没有静态分配的堆
  • 按分配大小

    • 栈是向低地址扩展的数据结构,是一块连续的内存区域
    • 堆是向高地址扩展的数据结构,是不连续的内存区域
  • 按存储内容

    • 栈:存放函数的参数值,局部变变量的值等。

    • 堆:new或者malloc出来的东西




重写和重载的区别

  • 重写是子类根据自己的需要对父类允许访问的方法重新编写, 但返回类型和参数列表都不能改变。即外壳不变,核心重写

    子类方法不能比父类的访问权限更严格。 子类方法饭然返回值类型和异常类型不能比父类更“高级(Object类最高级)”

    声明为final或static的方法不能被重写

  • 重载是在一个类里面,存在多个名字相同,而参数列表不同的函数。其返回类型可以相同也可以不同。

方法的重写和重载是多态性的不同表现。 重写是父类与子类之间多态性的一种表现;重载是一个类中多态性的一种表现。

构造方法因为不能被继承,所以不能重写,但是可以重载

segmentfault.com/a/119000001…




重定向和转发的区别

重定向

比如服务器中有两个组件,A和B,他们各自的功能没有联系是独立的。现在有一个请求想访问完A再访问B,那么就不要让A把request转移给B,因为这样就产生了耦合,而是访问完A后,A返回302状态码,告诉浏览器去新的组件继续执行请求。浏览器收到建议后使用新的request去访问B,最后由B返回结果给浏览器。这个过程中浏览器的url发生了变化,因为两次访问没有任何联系,是两个独立的request对象,A只是给了浏览器建议,让它去访问B。这就是重定向。优点是低耦合,缺点就是两次请求不能使用request做信息上的交互,如果两次请求想共用一份数据,就只能使用session之类的技术。


转发

转发的场景是A和B有功能上的联系,他们协作才能完成一个完整的功能。浏览器先访问A,但A只能完成功能的一半,A完成它自己的任务后就将数据存到request作用域然后把request转移给B,让B做后续的处理最后返回给浏览器结果。整个过程是同一个request请求,在服务器内部转发,用户感知不到,url不变。优点就是共用一个request,数据和逻辑可以复用,并且浏览器只用发一次请求,总体的效率更高。


耦合:没有关系的两个功能,产生了关系

B:可以是 Servlet、HTML、JSP或其它信息资源


区别:

  1. 地址栏是否变化

  2. 第二次请求的发起者;第二次请求的路径形式(前者为绝对路径;后者为相对路径)

  3. 速度,后者快,因为浏览器只需要发起一次请求

  4. 重定向可以跨域访问,而转发是在web服务器内部进行的,不能跨域访问。


  • 重定向:return "redirect:/index";
  • 直接转发:return "forward:/index";
  • 页面跳转: return "/index";

易错点:

  1. 这里的 index 是controller中请求的映射路径,不是页面的名称(比如index.ftl)。使用页面跳转的是 return "/index"; ,这里的 index 才是具体的html页面,需要配合Model

  2. 如果用重定向,url会变化,而项目很多时候都需要这种变化

  3. 如果用重定向,那么前端是接收不到 model.addAttribute 的数据的,因为到index页面时,已经换到第二个请求了,数据只能在第一个请求里能用。

    如果用【session.setAttribute】传数据,不论是转发还是重定向前端都可以收到数据




@Mapper注解和@Repository注解的区别

@Repository需要用@MapperScan扫描mapper才能注入@Bean

而@Mapper注解相当于@Repository注解+@MapperScan注解,通过xml文件下的namespace命名空间自动注入bean




ModelAndView和Mode的区别

  • ModelAndView:更加直观,把Model和View的数据都撞到一个对象里返回给Dispatcher

  • Model:Model对象不是自己创建的,它写在方法的参数列表里,Dispatcher在调用方法时能看到,就给自动实例化,并且持有这个对象的引用,往这个对象中添加数据时Dispatcher也能得到,最后return视图View的路径给Dispatcher。这样的话,Dispatcher也能拿到两份数据,所以最终效果和上面的一致。




& 和 && 的区别?

当&&第一个条件不成之后,后面的条件都不执行了,而&则还是继续执行




形参与实参区别

形参出现在被调用的函数定义中,在整个函数体内都可以使用, 离开该函数则不能使用。

实参出现在 主调函数中,进入被调函数后,实参变量也不能使用。


当形参和实参不是指针类型时,在该函数运行时,形参和实参是不同的变量,他们在内存中位于不同的位置,形参将实参的内容复制一份,在该函数运行结束的时候形参被释放,而实参内容不会改变。

而如果函数的参数是指针类型变量,在调用该函数的过程中,传给函数的是实参的地址,在函数体内部使用的也是实参的地址,即使用的就是实参本身。所以在函数体内部可以改变实参的值。