Java面试题总结:基础及语法 1~20

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

C/C++语言都直接编译成针对特定平台机器码。如果要跨平台,需要使用相应的编译器重新编译。

Java源程序(.java)要先编译成与平台无关的字节码文件(.class),然后字节码文件再解释成机器码运行。解释是通过Java虚拟机来执行的。

字节码文件不面向任何具体平台,只面向虚拟机

Java虚拟机是可运行Java字节码文件的虚拟计算机

Java语言具有**一次编译,到处运行**的特点。就是说编译后的.class可以跨平台运行,前提是该平台具有相应的Java虚拟机。但是性能比C/C++要低。

Java的跨平台原理决定了其性能没有C/C++高

2.java的安全性

**语言层次的安全性主要体现在:**删除强大但危险的指针,取而代之的引用

**垃圾回收机制:**不需要程序员内存回收,由垃圾回收器在后台自动回收不再使用的内存

异常处理机制 java异常机制主要依赖于try,catch,finally,throw,throws无关关键字

**强制类型转换:**只有满足强制类型转换根据的情况下才能强转成功

**底层的安全性可以从以下方面来说明:**java在字节码的传输过程中使用了公开密钥加密机制(PKC)

在运行环境提供了四级安全性保障机制 字节码校验器 类转载器 运行时内存布局 文件访问限制

3.java三大版本

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

j2se包含那些构成java语言核心的类 例如:数据库连接、接口定义、输入输出、网络编程

j2ee包含j2se中的列,标签还包含用于开发企业级应用的类 例如:servlet ,jsp ,xml,事务控制

j2me包含j2se中一部分类,用于消费类电子产品的软件开发: 呼机,智能卡,手机 机顶盒

他们的范围是

j2se包含于j2ee中,j2me包含了j2se的黄兴磊,但形体佳了一些专有类应用场合,API的覆盖范围各不相同

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

JVM

JVM是java虚拟机的缩写,他是这种能java实现跨平台的最核心的部分,使用的java程序会首先被编译为.class的类文件,这种文件可以在虚拟机上执行。

JRE

JRE是java运行环境的缩写。光有JVM还不能让class文件执行,因为咋解释class 的适合JVM需要调用解释所需的类库lib。在JDK的案件目镜你可以找到jre目录,里面有两个文件夹bin和lib,在这里认为bin里的就是jvm,lib中则是jvm引领需要的类库。==JRE就与具体的cpu几个和操作系统有关,是运行java程序必不可少的,我们编写的家啊啊女啊程序也必须JRE才能运行

JDK

JDK是java开发工具包的缩写。每个人学java的人都会先在机器上装上一个jdk,jdk安装目录下6大文件夹最重要的是bin,include,lib,jre四大文件。关系:JDK包含JRE,而JRE包含JVM

bin:最主要的是编译器

include:java和JVM交互用的头文件

lib:类库

jre:java运行环境

5.Java三种注释类型

单行注释,多行注释,文档注释3种注释类型。

单行注释,采用//方式,只能注释一行代码

多行注释,采用/**/方式,可注释多行代码,其中不允许出现嵌套

文档注释 采用/** */方式

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

整数型 byte 1字节 short 2字节 int 4字节 long 8字节

浮动性 float 4字节 double 8字节

布尔型 Boolean 1位 char 2字节

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

共同点

  1. i++和++i都是变量自增1,都等价于i=i+1
  2. 如果i++,++i是一条单独语句,两则没有区别
  3. i++和++i的使用仅仅针对变量。常量会报错

不同点

如果i++,++i不是一条单独的语句,他们就要区别

i++:先运算后增1

++i:先增1后运算

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

&和&&的联系(共同点):

&和&&都可以用作逻辑与运算符,但是要看使用时的具体条件决定

当操作数是boolean类型变量是,&和&&都可以作垃圾与运算符,当为变量时当运算符两边为true时,整个结果才为true ,一方为false则结果为false

&和&&的联系(不同点):

1.& 称为逻辑与运算符,&& 称为短路与运算符,也可叫逻辑与运算符

&:无论如何情况,&两边的操作数或表达式都会参与计算

&&:但==&&左边的操作数为false或左边表达式结果为false时,&&右边的操作数或表达式将不参与计算,此时最终结果都为false==

|与||运算运算符两边为false时,整个结果才为false,一方为true结果为true------其余的与&和&&的区别类似

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

使用位运算效率最高。位运算符是对操作数以二进制比特为为单位竞选操作和运算,操作数和结果都是整型数。

对于位运算符"<<"是将一个数左移n位,就相对乘以2的n次方,那么一个数乘以8只需要将其左移3位即可,所以

2乘以8对于几的最有效率的方法是2<<3

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

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

自动装换规矩:

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

byte–>short–>int

int–>long---->double int–>double

int---->float–>double long---->float

---->表示装换时有可能损失精度–>表示无精度损失转换

强制类型装换规矩:

高级变成低级需要强制转换

如何转换:

  1. 赋值运算符“=”右边的装换,先自动装换成表达式中级别最高的数据类型,在进行运算

  2. 赋值运算符“=”两侧的转换,若左边级别>右边级别,会自动转换;若左边级别 == 右边级别,不用转换;若左

    边级别 < 右边级别,需强制转换

  3. 可以将整型常量直接赋值给byte, short, char等类型变量,而不需要进行强制类型转换,前提是不超出其表述

    范围,否则必须进行强制转换

11.if和switch的异同之处

相同之处:

都是分支语句,多超过一种的情况竞选判断处理。

不同之处:

switch更适合用于多分支情况,就是有很多种情况需要判断处理,判读昂条件类型单一,只有一个入口,在分支执行完后==(如果没有break跳出),不加判断地执行下去。==而if-elseif-else多分支主要适用于分支较少的分支结构,判断类型不是单一,只要一个分支被执行后,后面的分支不再执行

switch为等值判断(不允许>=<=),而if为等值和区间都可以,if使用范围大。

12.while和do-while循环的区别

while先判断后执行,第一次判断为false,循环体一次都不执行

do while先执行 后判断,最少执行一次

如果while循环第一次判断为true,则两种循环没有区别

13.break和continue的作用

break结束当前循环并退出当前循环体。break还可以退出switch语句

continue:循环体中后续的语句不执行,但是循环没有结束,继续进行循环条件的判断(for循环还会i++)。continue知识结束本次循环

14.请使用递归算法计算n!

Recursion 读法:递归

一个正整数的阶乘是所有小于及等于该数的正整数的积,并且0的阶乘为1.自然数n的阶乘写作n!。

/*
n阶乘
*/
public class Recursion{
    //阶乘算法
    public int factorial(int num){
        if(num==0 || num==1){
            return 1;
        }else{
            return num*factorial(num-1);
        }
    }
    public static void main(String[] args){
        Recursion recursion =new Recursion();
        int n=0;
        int factorial=recursion.factorial(n);
        System.out.println(factorial);
    }
}
15.递归的定义和优缺点

递归算法是一种直接或者间接地调用自身算法的过程。在计算机编写程序中,递归算法对解决一大类问题是是否有效的,它往往使算法的描述简洁而且易于理解。

递归算法解决问题的特点:

  1. 递归就是在过程或函数里调用自身
  2. 在使用递归此话时,必须需有一个明确的递归特殊条件,称为递归出口
  3. 递归算法解题通常显得很简洁,但运行效率较低。所以一般不提倡用递归算法设计程序。
  4. 在递归调用的过程当中系统为每一层的返回点,局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。
16.数组的特征

数组是(相同类型数据)的(有序)(集合)

数组会在内存中开闭一块连续的框架,每个空间相当于之前的一个变量,称为数组的元素element

元素的表示 数组名[下标或者索引] 例如 array[0] arr[5]

索引从0开始

每个数组元素有默认值 double 0.0 boolean false int 0

数组元素有序的,不是大小顺序,是索引的顺序

数组中可以存储基本数据类型可以存储引用数据类型;但是对于一个数组而言,数组的类型是固定的,只能是一个

length:数组的长度

数组的长度是固定的,一经定义,不能再发生变化(数组的扩容)

17.写出冒泡排序代码

冒泡排序是一种计算机科学领域的较简单的排序算法

原理:

  1. 比较相邻的元素。如果第一个比第二个打,就交换他们两个
  2. 对每一对相邻元素做同样的工作,从开始第一队到结尾的最后一对。在这一点,最后的元素应该会是最大的整数
  3. 针对所有的元素重复以上的步骤,除了最后一个
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
18.选择排序

选择排序是一种简单直观的排序算法,她的工作原理是每一次从待排序的数据元素中选出最小,大的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小,大元素,然后放到已排序序列的末尾。以此类推,知道全部待排序的数据元素排完。选择排序是不稳定的排序方法

19.插入排序

有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这 个时候就要用到一种新的排序方法——插入排序法

插入排序的基本思想是:每步将一个待排序的记录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直 到全部插入完为止

20.可变参数的作用和特点

总结:可变参数

1.可变参数的形式 …

2.可变参数只能是方法的形参

3.可变参数对应的实参可以0,1,2…n个,也可以是一个数组

4.在可变参数的方法中,将可变参数当做数组来处理

5.可变参数最多有一个,只能是最后一个

6.可变参数好处:方便 简单 减少重载方法的数量

7.如果定义了可变参数的方法,不允许同时定义相同类型数组参数的方法

总结: 数组做形参和可变参数做形参联系和区别

联系:

1.实参都可以是数组;

2.方法体中,可变参数本质就是当做数组来处理

区别

  1. 个数不同可变参数只能有一个数组参数可以多个
  2. 位置不同可变参数只能是嘴和一个,数组参数位置容易
  3. 实参不同可变参数实参可以0.1.2个,也可以是一个数组,数组的实参只能是数组

部分装载加总结,如有雷同,还请见谅 !!!!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不脱顶的程序员小王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值