题库1

Java 专栏收录该内容
2 篇文章 0 订阅

1. Java跨平台原理(字节码文件、虚拟机)

  • C/C++语言都直接编译成针对特定平台机器码。如果要跨平台,需要使用相应的编译器重新编译。
  • Java源程序(.java)要先编译成与平台无关的字节码文件(.class),然后字节码文件再解释成机器码运行。解释是通过Java虚拟机来执行的。
  • 字节码文件不面向任何具体平台,只面向虚拟机。Java虚拟机是可运行Java字节码文件的虚拟计算机。不同平台的虚拟机是不同的,但它们都提供了相同的接口。
  • Java语言具有一次编译,到处运行的特点。就是说编译后的.class可以跨平台运行,前提是该平台具有相应的Java虚拟机。

对比:C语言是直接执行编码,Java是先将class文件解释成机器码再执行

在这里插入图片描述
在这里插入图片描述

2. 编译与解释

  • 编译:将源代码一次性转换成目标代码的过程,类似英语中的全文翻译。编译过程只进行一次,所以,编译过程的速度并不是关键,目标代码的运行速度是关键。因此,编译器一般都集成尽可能多的优化技术,使生成的目标代码具备更好的执行效率。

  • 解释:将源代码逐条转换成目标代码同时逐条运行的过程,类似英语中的同声传译。解释则在每次程序运行时都需要解释器和源代码,不能集成太多优化技术,因为代码优化技术会消耗运行时间,使整个程序的执行速度受到影响。

  • 静态语言(编译方式):使用编译执行的编程语言,比如C/C++。编译器一次性生成目标代码,优化更充分,程序运行时速度更快。
    1)对于相同的源代码,编译所产生的的目标代码执行速度更快。
    2)目标代码不需要编译器就可以运行,在同类操作系统上使用灵活。

  • 脚本语言(解释方式):使用解释执行的编程语言,比如Python语言,JavaScript、PHP。执行程序时需要源代码,维护更加灵活。
    1)解释执行需要保留源代码,程序纠错和维护十分方便。
    2)只要存在解释器,源代码可以在任何操作系统上运行,可移植性好。

  • Java语言的执行是有解释执行和编译执行两种的

  • Java在编译时期,通过将源代码编译成.class ,配合JVM这种跨平台的抽象,屏蔽了底层计算机操作系统和硬件的区别,实现了“一次编译,到处运行” 。 而在运行时期,目前主流的JVM 都是混合模式(-Xmixed),即解释运行和编译运行配合使用。解释器的优势在于不用等待,编译器则在实际运行当中效率更高。在Java虚拟机运行时,解释器和即时编译器能够相互协作,各自取长补短,从而提高运行效率。

3. Java的安全性

  • 语言层次的安全性主要体现在:
    Java取消了强大但又危险的指针,而代之以引用。由于指针可进行移动运算,指针可随便指向一个内存区域,而不管这个区域是否可用,这样做是危险的,因为原来这个内存地址可能存储着重要数据或者是其他程序运行所占用的,并且使用指针也容易数组越界。
  • 垃圾回收机制:
    不需要程序员直接控制内存回收,由垃圾回收器在后台自动回收不再使用的内存。避免程序忘记及时回收,导致内存泄露。避免程序错误回收程序核心类库的内存,导致系统崩溃。
  • 异常处理机制:
    Java异常机制主要依赖于try、catch、finally、throw、throws五个关键字。
  • 强制类型转换:
    只有在满足强制转换规则的情况下才能强转成功。
  • 底层的安全性可以从以下方面来说明: blog.kuangstudy.com 编辑,整理 by 秦疆
    Java在字节码的传输过程中使用了公开密钥加密机制(PKC)。
  • 在运行环境提供了四级安全性保障机制:
    字节码校验器 -类装载器 -运行时内存布局 -文件访问限制

4. Java三大版本

Java2平台包括标准版(J2SE)、企业版(J2EE)和微缩版(J2ME)三个版本:

  • Standard Edition(标准版) J2SE 包含那些构成Java语言核心的类。
    比如:数据库连接、接口定义、输入/输出、网络编程
  • Enterprise Edition(企业版) J2EE 包含J2SE 中的类,并且还包含用于开发企业级应用的类。
    比如servlet、JSP、XML、事务控制
  • Micro Edition(微缩版) J2ME 包含J2SE中一部分类,用于消费类电子产品的软件开发。
    比如:呼机、智能卡、手机、PDA、机顶盒

他们的范围是:
J2SE包含于J2EE中,J2ME包含了J2SE的核心类,但新添加了一些专有类应用场合,API的覆盖范围各不相同。

J2EE>J2SE>J2ME

5. 什么是JVM?什么是JDK? 什么是JRE?

  • JVM:
    JVM是Java Virtual Machine(Java虚拟机)的缩写,它是整个Java实现跨平台的最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行,也就是说class并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行。JVM是Java平台的基础,和实际的机器一样,它也有自己的指令集,并且在运行时操作不同的内存区域。 JVM通过抽象操作系统和CPU结构,提供了一种与平台无关的代码执行方法,即与特殊的实现方法、主机硬件、主机操作系统无关。JVM的主要工作是解释自己的指令集即字节码)到CPU的指令集或对应的系统调用,保护用户免被恶意程序骚扰。 JVM对上层的Java源文件是不关心的,它关注的只是由源文件生成的类文件(.class文件)。
  • JRE:
    JRE是Java Runtime Environment(Java运行环境)的缩写。光有JVM还不能让class文件执行,因为在解释class的时候JVM需要调用解释所需要的类库lib。在JDK的安装目录里你可以找到JRE目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和lib和起来就称为jre。所以,在你写完java程序编译成.class之后,可以把这个.class文件和jre一起打包发给朋友,这样你的朋友就可以运行你写的程序了(jre里有运行.class 的java.exe)。
    JRE是Sun公司发布的一个更大的系统,它里面就有一个JVM。JRE就与具体的CPU结构和操作系统有关,是运行Java程序必不可少的(除非用其他一些编译环境编译成.exe可执行文件……),JRE的地位就象一台PC机一样,我们写好的Win32应用程序需要操作系统帮我们运行,同样的,我们编写的Java程序也必须要JRE才能运
    行。
  • JDK:
    JDK是java development kit(Java开发工具包)的缩写。每个学java的人都会先在机器上装一个JDK。在安装目录下面有六个文件夹、一个src类库源码压缩包、和其他几个声明文件。其中,真正在运行Java时起作用的是以下四个文件夹:bin、include、lib、jre。现在我们可以看出这样一个关系,JDK包含JRE,而JRE包含JVM。
    bin: 最主要的是编译器(javac.exe)
    include: java和JVM交互用的头文件
    lib:类库
    jre: java运行环境
    (注意:这里的bin、lib文件夹和jre里的bin、lib是不同的)
    总的来说JDK是用于java程序的开发,而jre则是只能运行class而没有编译的功能。eclipse、idea等其他IDE有自己的编
    译器而不是用JDK bin目录中自带的,所以在安装时你会发现他们只要求你选jre路径就ok了。
  • JDK,JRE,JVM三者关系概括如下
    JDK是Java程序开发时用的开发工具包,其内部也有JRE运行环境JRE。
    JRE是JAVA程序运行时需要的运行环境,就是说如果你光是运行JAVA程序而不是去搞开发的话,只安装JRE就能运行已经存在的JAVA程序了。
    JDK、JRE内部都包含Java虚拟机JVM,JAVA虚拟机内部包含许多应用程序的类的解释器和类加载器等等。

JRE = JVM + 类库
JDK = JRE+ Java开发工具

6. 八种基本数据类型及其字节数

在这里插入图片描述

7. i++和++i的异同之处

共同点:
1、i++和++i都是变量自增1,都等价于i=i+1
2、如果i++,++i是一条单独的语句,两者没有任何区别
3、i++和++i的使用仅仅针对变量。 5++和++5会报错,因为5不是变量。
不同点:
如果i++,++i不是一条单独的语句,他们就有区别

i++ :先运算后增1。如:

int x=5;int y=x++; System.out.println("x="+x+", y="+y);
//以上代码运行后输出结果为:x=6, y=5

++i : 先增1后运算。如:

int x=5;int y=++x; System.out.println("x="+x+", y="+y);
//以上代码运行后输出结果为:x=6, y=6

8. &和&& , |和|| 的区别和联系

&和&&的联系(共同点):
&和&&都可以用作逻辑与运算符,但是要看使用时的具体条件来决定。

操作数1&操作数2,操作数1&&操作数2,
表达式1&表达式2,表达式1&&表达式2,

情况1: 当上述的操作数是boolean类型变量时,&和&&都可以用作逻辑与运算符。
情况2: 当上述的表达式结果是boolean类型变量时,&和&&都可以用作逻辑与运算符。表示逻辑与(and),当运算符两边的表达式的结果或操作数都为true时,整个运算结果才为true,否则,只要有一方为false,结果都为false。

&和&&的区别(不同点):
1.& 称为逻辑与运算符,&& 称为短路与运算符,也可叫逻辑与运算符。

对于&:无论任何情况,&两边的操作数或表达式都会参与计算。
对于&&:当&&左边的操作数为false或左边表达式结果为false时,&&右边的操作数或表达式将不参与计算,此时最终结果都为false。

综上所述,如果逻辑与运算的第一个操作数是false或第一个表达式的结果为false时,对于第二个操作数或表达式是否进行运算,对最终的结果没有影响,结果肯定是false。推介平时多使用&&,因为它效率更高些。

2.&还可以用作位运算符。当&两边操作数或两边表达式的结果不是boolean类型时,&用于按位与运算符的操作。

|和||的区别和联系与&和&&的区别和联系类似。

9. 用最有效率的方法算出2乘以8等于多少

使用位运算来实现效率最高。位运算符是对操作数以二进制比特位为单位进行操作和运算,操作数和结果都是整型数。
对于位运算符“<<”, 是将一个数左移n位,就相当于乘以了2的n次方,那么,一个数乘以8只要将其左移3位即可,位运算cpu直接支持的,效率最高。所以,2乘以8等于几的最效率的方法是2 << 3

10. 基本数据类型的类型转换规则

基本类型转换分为自动转换和强制转换。

自动转换规则:
容量小的数据类型 可以自动转换成容量大的数据类型,也可以说低级自动向高级转换。这儿的容量指的不是字节数,而是指类型表述的范围。
,

强制转换规则:
高级变为低级需要强制转换。
如何转换:
在java中强制类型转换分为基本数据类型引用数据类型两种

  1. 赋值运算符“=”右边的转换,先自动转换成表达式中级别最高的数据类型,再进行运算。
  2. 赋值运算符“=”两侧的转换,若左边级别>右边级别,会自动转换;若左边级别 == 右边级别,不用转换;若左边级别 < 右边级别,需强制转换。
  3. 可以将整型常量直接赋值给byte, short, char等类型变量,而不需要进行强制类型转换,前提是不超出其表述范围,否则必须进行强制转换。
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值