面试学习笔记(3)——JAVA工程师(1)

面试学习笔记——JAVA工程师

  • JAVA特性
    • Java和PHP的区别
    • Java8的新特性
    • 面向对象的特征
    • 面向对象的“六原则一法则”
  • Java类的问题
    • Java接口
    • 抽象类和接口的异同
    • 方法覆盖和重载
    • 类加载机制,双亲委派模型
    • 常用Object类方法
    • hashCode()和equals()方法
  • 正则表达式
    • Java中如何支持正则表达式操作
    • 正则表达式是什么,有什么用
  • Java和JavaScript
    • 比较Java和JavaScript

JAVA特性

Java和PHP的区别

  • PHP暂时还不能像Java那样JIT运行时编译热点代码,但是PHP有opcache机制,能够把脚本对应的opcode缓存在内存。
  • PHP的库函数用C实现,Java核心运行时类库(jdk/jre/lib/rt.jar,大于60MB)用Java编写(jdk/src.zip),所以Java应用运行的时候,用户编写的代码以及引用的类库和框架都要在JVM上解释运行。Java的HopSopt机制,直到有方法被执行10000次才会触发JIT编译,在此之前运行在解释模式下,以避免出现JIT编译花费的时间比方法解释执行消耗的时间还要多的情况。
  • PHP内置模版引擎,自身就是模版语言。而Java Web需要使用JSP容器如Tomcat或第三方模版引擎。
  • PHP也可以运行在多线程模式下,比如Apache的event MPM和FaceBook的HHVM都是多线程架构。不管是多进程还是多线程呢的PHP Web运行模式,都不需要PHP开发者关心和控制,也就是说PHP开发者不需要写代码参与进程和线程的管理。然而Java多线程需要Java开发者编码参与。

Java8的新特性

  • Lambda表达式:允许把函数作为一个方法的参数。可以使代码更加简介,容易并行计算,但是不容易调试,并且并不常用,代码可读性可能会下降。

    语法格式:(parameters)-> expression或(parameters)-> { statements; }

  • 方法引用:可以直接引用已有的Java类或对象的方法或构造器,与lambda联合使用,方法引用可以使语言构造更加紧凑简洁,减少冗余代码。
  • 默认方法:在接口里有实现的方法。
  • 新工具:新的编译工具,如Nashorn引擎jjs、类依赖分析器jdeps
  • Stream APIjava.util.stream把真正的函数式编程风格引入Java之中。
  • Date Time API:加强对日期和时间的处理。
  • Optional类:用来解决空指针异常
  • Nashorn JavaScript引擎:允许我们在JVM上运行特定的JavaScript应用。

面向对象的特征

  1. 抽象:指的是将同一种事物一致的数据结构和行为抽象成一个类,忽略具体内容而反应共性。包括过程抽象和数据抽象。
  2. 继承:指的是一种派生关系,一种对类的重用和拓展。新类通过继承获得旧类的方法和属性,并可以增加新的方法和属性以满足特殊的需要。
  3. 封装:指把过程和数据包围起来,对外只提供定义好的方法访问。这也是面向对象思想的根本所在,即现实世界可以被描绘成一系列完全自治、封装的对象。
  4. 多态:指的是允许不同类的对象对同一消息作出不用响应的性质,更灵活抽象。包括参数化多态性和包含多态性。

面向对象的“六原则一法则”

六原则:

  1. 单一职责原则(高内聚):一个类只做它该做的事情,不涉及任何与它无关领域的事。
  2. 开闭原则:软件实体应当对外扩展开放,对修改关闭。做到开闭有两个关键,一个是抽象,抽象提供拓展点,一个是封装可变性,即将所有可能变化的部分封装起来,这样就能保证即有可拓展性,也保证核心不被修改。
  3. 依赖倒转原则:面向接口编程。简单来讲,就是声明方法的参数类型,返回类型,变量的引用类型时,尽可能用抽象类型而不是具体类型,因为抽象类型能够被其任何一个子类所替代。
  4. 里氏替换原则:任何时候都可以用子类替换掉父类。
  5. 接口隔离原则:接口尽可能小而且专,而不能过于广泛。接口表示一种规范,一种能力,应当做到高度内聚。
  6. 合成聚合复用原则:优先使用聚合或合成关系复用代码。任何时候都不要继承工具类,工具是可以拥有并使用的,继承只会带来冗余。

一个法则:
迪米特法则:最少知识原则,一个对象应当对其他对象有尽可能少的了解,即模块化的含义。

Java类的问题

Java接口

Java不支持多继承,当出现一个类或对象要使用多个类或对象里的方法或属性时,单继承机制就不能满足要求。
而接口具有更高的灵活性,接口中没有任何实现代码,当一个类实现接口之后,就要实现接口里的所有方法和属性,并且接口里的属性默认都是public static,方法默认是public,一个类可以实现多个接口。

抽象类和接口的异同

  • 抽象类可以同时包含抽象和非抽象的方法,但接口所有的方法都必须是抽象的。
  • 一个类可以实现多个接口,但是只能继承一个抽象类
  • 类可以不实现抽象类和接口声明中的所有方法,但是,这样的类必须声明成抽象的。
  • 抽象类和接口都不能被实例化

方法覆盖和重载

覆盖(重写)和重载都是实现多态的方式,但是重载实现的是编译时的多态,重写实现的是运行时的多态。
方法重载发生在同一个类里两个或者多个方法的方法名相同但是参数不同的情况。
方法覆盖是说子类重新定义了父类的方法,方法名,参数列表,返回类型必须都相同。

类加载机制,双亲委派模型

某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,只有父类加载器无法完成任务时,才自己加载,这就是双亲委派模型。
这样的好处在于Java类随着它的类加载器一起具备了一种带有优先级的层次关系,例如java.lang.Object,无论哪个类加载器都要加载这个类,最终都委派给Bootstrap ClassLoader进行加载,因此,Object类在程序的各个类加载器环境中都是同一个类。如果没有这一模型,如果用户编写了Object的同名类并放在ClassPath中,那么系统会出现多个Object类,会造成混乱。

常用Object类方法

  1. Object():默认构造方法
  2. clone():创建并返回此对象的一个副本。
  3. equals(Object obj):对象是否相等
  4. finalize():对象的垃圾回收器
  5. getClass():返回对象的运行时类
  6. hasCode():返回该对象的哈希码值
  7. notify():唤醒在此对象监视器上等待的单个线程
  8. notifyAll():唤醒在此对象监视器上等待的所有线程
  9. wait(long timeout):当前线程等待,知道其他线程调用notify()或notifyAll()或超过指定的时间量。
    10.wait(long timeout, int nanos): 当前线程等待,知道其他线程调用notify()或notifyAll()或超过指定的时间量或其他某个线程中断当前线程。

hashCode()和equals()方法

Java对象的hashCode()equals()方法是这样规定的:

  1. 相等(相同)的对象必须具有相等的哈希码(散列码)
  2. 如果两个对象的hashCode相同,他们不一定相同。

当然也可以不满足规定,但是这样会导致使用容器时冲突概率会大大增加。
如果一个类不重写equals()方法,调用时默认比较的是对象的地址,不重写hashCode(),则默认返回的是对象的地址。

正则表达式

Java中如何支持正则表达式操作

Java中的String类提供了支持正则表达式操作的方法,包括:matches()replaceAll()replaceFirst()split()。此外,Java可以使用Pattern类表示正则表达式对象。用法如下:

import java.util.regex.Matcher;
import java.util.regex.Pattern;
class RegExpTest{
  public static void main(string[] args){
    String str = "";
    Pattern p = Pattern.compile(".*?(?=\\())");
    Matcher m = p.matcher(str);
    if(m.find()){
      System.out.println(m.group());
    }
  }
}

正则表达式是什么,有什么用

正则表达式主要用于处理字符串问题,是用于描述复杂字符串规则的工具,或者说,正则表达式就是记录文本规则的代码。

Java和JavaScript

比较Java和JavaScript

Java和JavaScript是两个公司开发的不同产品,Java是一种面向对象的程序设计语言,特别适合互联网应用的开发,而JavaScript是为了拓展浏览器功能而开发的一种可以嵌入Web页面中运行的基于对象和事件驱动的解释性语言。
Java的前身是Oak语言,JavaScript的前身是LiveScript
两者异同如下:

  • 基于对象和面向对象:Java是一种真正的面向对象的语言,即使是开发简单的程序也必须要设计对象。JavaScript是脚本语言,它可以用来制作与网络无关的,与用户交互的复杂软件,是一种基于对象和事件驱动的编程语言,本身就提供了丰富的内部对象供开发者使用。
  • 解释和编译:Java源代码执行之前必须经过编译,而JavaScript作为一种解释性编程语言,源代码不需要经过编译,而是由浏览器解释运行,浏览器通常使用JIT(即时编译)技术来提升JavaScript的运行效率。
  • 强类型变量和弱类型变量:Java采用强类型变量检查,所有变量在编译之前必须做声明,JavaScript中的变量是弱类型的,甚至在使用前可以不做声明。
  • 代码格式也不同。

你可能感兴趣的:(面试学习记录)