美文网首页java学习之路知识点
JavaGuide知识点整理——基础常见知识点(上)

JavaGuide知识点整理——基础常见知识点(上)

作者: 唯有努力不欺人丶 | 来源:发表于2022-05-01 19:48 被阅读0次

    又是一年找工作,身处上海,2022年了刚解决温饱问题,开始新一轮面试。闲话不说了,这次立的flag:把JavaGuide页面的知识点整理吸收。其实我记笔记是是自己理解,记忆的过程。(JavaGuide是一个面试题汇总的网页,这里附上原链接:
    https://snailclimb.gitee.io/javaguide)下面开始知识点的整理:

    基础概念与常识

    java语言有哪些特点?

    首先这个问题可能大多数人第一反应是跨平台。毕竟我入行的时候那句一次编写,随处运行就是java的最大优势。但是现在虚拟化技术非常成熟,比如通过docker可以很容易的实现跨平台,所以java现在的特点 ,应该是java强大的生态。这个是一个概念,下面我们还是要列举一下java语言的特点:

    1. 简单易学
    2. 面向对象(封装,继承,多态)
    3. 平台无关性(一次编写,随处运行)
    4. 支持多线程(c++没有内置的多线程机制,需要调用操作系统的多线程功能来进行多线程程序设计,而java语言是提供了多线程支持的。)
    5. 可靠性
    6. 安全性
    7. 支持网络编程 ,并且很方便
    8. 编译与解释共存

    以上这些我觉得有一些比较好懂,比如简单易学(相对于c各种底层),跨平台,面向对象,编译与解释共存,
    还有一些我之前不清楚的,比如支持多线程之前我以为是所有语言都可以。可靠性安全性支持网络编程啥的,反正都比较好记,默背了三遍,不知道能记多久。

    JVM vs JDK vs JRE

    这个从笼统的角度说:

    • JVM是java虚拟机
    • JDK是java开发环境
    • JRE是java运行时环境。

    然后一些小知识点:jvm是有很多种的,jvm其实是一种规范,只要满足这个规范的都可以开发自己的专属JVM,而我们工作中接触到的是 HotSpot VM,是jvm规范的一种实现而已。
    JDK是功能齐全的Java SDK。包含JRE。可以用来开发java项目。
    JRE是Java运行环境,包括jvm,还有一些java类库,常用命令之类的。 比如我们工作中用到的一些工具类就是java类库,JRE是包含这些的。
    有时候我们使用JSP不熟wen应用程序但是却需要JDK,这是因为应用程序服务器会将jsp转换为java servlet,并且需要使用JDK来便于servlet。

    什么是字节码?采用字节码的好处是什么?

    在java中,JVM可以理解的代码就叫做字节码(扩展名为.class的文件)。它不面向特定的处理器,只面向虚拟机。
    java语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题。同时又保留了解释型语言可移植的特点。所以java程序运行时相对来说还是高效的(但是和c++,Rust,Go等语言还是有差距的)而且由于字节码不针对特定的机器,所以这也是java无需重新编译即可在多种不同的操作系统的计算机运行。

    Java程序从源代码到运行的过程
    我们需要注意 .class->机器码 这一步JVM类加载器首先加在字节码文件,然后通过解释器逐行解释执行,这种方式的执行速度会相对比较慢。而且有些方法和代码块会经常被调用(也就是所谓的热点代码),所以后面引进了JIT (just in time compilation 即时编译)编译器,而JIT属于运行时编译。
    当JIT编译器完成第一次编译后,会将字节码对应的机器码保存下来,下次可以直接使用。我们知道机器码的运行效率肯定高于java解释器的,这也解释了我们为什么经常说java是编译与解释共存的语言。

    为什么说java语言“编译与解释并存”?

    上面已经说了,但是这个问题比较重要,所以着重说一下。

    • 编译型:指通过编译器将源代码一次性翻译成可被该平台执行的机器码,一般情况下编译语言的执行速度比较快,开发效率比较低。常见的编译性语言有C,C++,Go,Rust等等。
    • 解释型:会通过解释器一句一句将代码解释为机器代码后再执行。解释型语言开发效率比较快,执行速度比较慢。常见的解释型语言有python,JavaScript,PHP等等。
      两种类型的区别

    为了改善编译语言的效率而发展出了即时编译技术,已经缩小了两种语言之间的差距。
    这种技术混合了编译语言和解释语言的优点,像编译语言一样先把程序源代码编译成字节码,到执行期时,再将字节码直译,之后执行。Java与LLVM是这种技术的代表产物。
    Java语言既有编译型语言的特征,也有解释型语言的特征。因为Java程序要经过先编译,后解释两个步骤。 由于java编写的程序需要先经过编译步骤,生成字节码(.class文件),这种字节码必须由java解释器来解释执行。

    Oracle JDK 和 Open JDK的区别

    感觉这是一个冷知识,简单来说 Open JDK是一个完全开源的,而Oracle JDK是在 Open JDK的基础上完善的。
    因为 Open JDK开源,所以相对有一些冗余的类和一些bug。而Oracle JDK完善了这些bug。
    最后Oracle JDK 9及其以后的版本不能修改,11及其以后的版本商用要付费。

    Java和C++的区别?

    莫名其妙这两个语音总放在一起比。虽然我一点不会c++,但是还要背下来一些知识:

    • 相同点:
      • 都是面向对象的语言
      • 都支持封装,继承,多态
    • 不同点:
      • java不提供指针来直接访问内存,程序内存更安全
      • java的类是单继承,C++支持多继承。不过java虽然类单继承但是接口可以多实现。
      • java有自动内存管理垃圾回收机制(GC),不需要程序员手动释放内存。
      • C++同时支持方法重载和操作符重载,但是Java只支持方法重载。

    基本语法

    字符型常量(char)和字符串常量(String)的区别?

    1. 字符常量是单引号引起的一个字符,字符串常量是双引号引起的若干字符。
    2. 字符常量相当于一个整型值,可以参加表达式运算。字符串常量代表一个地址(该字符串在内存中存放位置)
    3. 字符常量占两个字节,。字符串常量占若干个字节。

    注释有哪几种形式?

    java中有三种注释:

    1. 单行注释
    2. 多行注释
    3. 文档注释
      注释不是越多越好,相当于说明书,应该简洁易懂。好的代码本身就是注释。我们要尽量规范和美化代码来减少不必要的注释。

    标识符和关键字的区别?

    我们编写程序的时候需要大量的为程序,类,方法,变量等取名。简单来说标识符就是一个名字。
    但是有些标识符在java中已经被赋予了特殊的含义。只能用于特定的地方,这些特殊的标识符就是关键字。换句话说关键字是被赋予特殊含义的标识符。比如我们不能给一个方法取名叫public.就好像我们不能开一家店取名叫警察局一样。

    java语言中的关键字有哪些?

    java中的关键字

    所有的关键字都是小写的。default这个关键字很特殊,有些方法没有关键字修饰默认就是default。但是我们不能在代码中明文写上。

    自增自减运算符

    这个其实就++,--。 其实就是+1 -1 的意思。但是有一点:符号在前先加减,符号在后后加减。
    比如 a = a++. 那么这个a的值不会变。
    a = ++a 这个a的值会+1

    continue,break和return的区别是什么?

    在循环结构中

    1. continue指跳过此次循环,继续下一次循环。
    2. break指跳出整个循环体,继续执行下一次的语句。

    return用于跳出方法,结束该方法的运行。return 有两种用法:

    1. return; 用于没有返回值函数的方法
    2. return value; 用于有返回值的方法。

    方法

    什么是方法返回值,方法返回值有哪几种类型?

    方法的返回值是指我们获取到的某个方法体中的代码执行后产生的结果(前提是方法可能产生结果)!返回值的作用是接收出结果,使得它可以用于其他的操作。

    我们可以按照方法的返回值和参数类型将方法分为以下几种:

    1. 无参无返回值的方法
    2. 有参无返回值的方法
    3. 有参有返回值的方法
    4. 无参有返回值的方法

    静态方法为什么不能调用非静态成员?

    这个需要结合jvm的相关知识:

    1. 静态方法是属于类的,在类加载的时候就会分配内存,可以通过类名直接访问。而非静态成员属于实例对象,只有在对象实例化之后才存在。需要通过类的实例对象去访问。
    2. 在类的非静态成员不存在的时候静态成员就已经存在了,此时调用内存中还不存在的非静态成员,属于非法操作。

    静态方法和实例方法有何不同?

    1. 调用方法不同。 静态方法可以直接类.方法名调用。 实例方法只能对象.方法名调用。也就是说调用静态方法无需创建对象。
      不过需要注意的是虽然静态方法可以类.方法名调用也可以对象.方法名调用。但是不建议用对象去调用,因为容易造成混淆。静态方法不需要类的某个对象而是属于这个类。

    2. 访问类成员是否存在限制。静态方法在访问奔雷的成员时,只允许访问静态成员(静态变量和静态方法)。不允许访问实例成员。而实例方法不存在这个限制。

    重写和重载的区别?

    • 重载就是同样的一个方法能够根据输入数据的不同,做出不同的处理。
      重载要发生在同一个方法中,方法名必须相同,参数类型不同,个数不同,顺序不同,返回值和访问修饰符都可以不用。
    • 重写就是当子类继承自父类的相同方法,输入数据一样,但是要做出有别于父类的响应时,你就要覆盖父类方法。
      方法名,参数列表必须相同,子类方法返回值类型要小于等于父类方法返回值。抛出异常的范围小于等于父类。访问修饰符大于等于父类。
      如果父类方法是private/final/static则子类不能重写该方法。 但是被static修饰的方法可以被再次声明。
      构造方法无法被重写。
      综上:重写就是子类对父类方法的重新改造,外部样子不能变,内部逻辑可以变。
      重写与重载对比图

    什么是可变长参数?

    从java5开始,java支持定义可变长参数。所谓可变长参数就是允许在调用方法时传入不定长的参数。

    写法如下:


    可变长参数写法展示

    另外可变长参数只能作为函数的最后一个参数展示。
    遇到方法重载的时候,会优先匹配固定参数的方法。因为固定参数的方法匹配度更高。

    下面有个很好的例子:


    优先匹配固定参数

    看如上demo,第一次调用传了两个字符串作为参数,实际上不管是第一个方法还是第二个方法都可以接收此参数,而系统调用了第一个方法。

    javav的可变参数编译后实际上会被转换成一个数组。

    基本数据类型

    java中的几种基本数据类型

    java中有8种基本数据类型。


    八种基本数据类型默认值及所占空间大小

    基本类型和包装类型的区别?

    1. 包装类型不赋值是null,而基本类型有默认值且不是null。
    2. 包装类型可用于泛型,而基本类型不可以。
    3. 基本数据类型的局部变量存放在java虚拟机栈中的局部变量表中,基本数据类型的成员变量(未被static修饰)存放在jva虚拟机的堆中。包装类型属于对象类型,我们知道几乎所有的对象实例都存放在堆中。
    4. 相比于对象类型,基本数据类型占用的空间非常小。

    为什么说几乎所有对象实例呢?这是因为Hotspot虚拟机引入了JIT优化之后,会对对象进行逃逸分析,如果发现某一个对象并没有逃逸到方法外部,那么就可能通过标量替换来实现栈上分配,而避免堆上分配内存。

    包装类型的常量池技术

    java基本类型的包装类的发部分都实现了常量池技术。
    Byte,Short,Integer,Long这四种包装类默认创建了数值-128到127的相应类型的缓存数据。Character创建了数值在0-127范围的缓存数据。Boolean直接返回True 或者False。
    如果超出对应范围仍然会去创建新的对象,缓存的范围区间的发小只是在性能和资源之间的权衡。
    两种浮点数类型的包装类Float,Double并没有实现常量池技术。

    下面有个很有意思的问题:

    image.png
    如图所示,new出来的Integer和装箱得到的Integer不是一个指针。所有整型包装类对象之间的比较,全部应该使用equals方法比较。

    自动装箱与拆箱原理

    什么是自动拆装箱?

    • 装箱: 将基本类型用他们对应的引用类型包装起来。
    • 拆箱: 将包装类型转换成基本数据类型。

    举例:

    Integer i = 40; //装箱
    int i1 = i; // 拆箱
    

    实际上

    • 装箱是调用了包装类 valueOf()方法
    • 拆箱是调用了xxxValue()方法。

    注意:频繁拆装箱的话会严重影响系统性能。我们应该尽量避免不必要的拆装箱操作。

    相关文章

      网友评论

        本文标题:JavaGuide知识点整理——基础常见知识点(上)

        本文链接:https://www.haomeiwen.com/subject/rauwertx.html