Java面试题_Java基础

1.1 你认为Java与其他(你所了解的)语言相比,有什么优点和缺点?

首先,Java与C/C++相比,Java语言是一种完全的面向对象语言,虽然它的底层(运行时库)是用C语言开发的,可是并不依赖于C,因为Java的运行时在运行时库的支持下进行的,所以运行效率可以更接近底层的C/C++来说效率会有所影响,不过Java的类库采用很好的设计理念,非常好用,也非常实用,已经成为业界的一种标准开发语言,它的跨平台的特性受到开发者的青睐,只需要开发一次就能在所有安装了Java运行时库的环境中运行。

    其次,Java与C#相比,C#是微软开发的一种编程语言,语法类似Java,几乎就是Java的翻版,运行原理和Java也类似,也是通过运行时库的支持运行,不过支持的平台还有限,Java几乎被所有的平台支持,而C#目前只能被Windows和Linux支持,Windows下的支持当然是由微软自己开发的,而Linux下的支持则由mono支持,实际上,mono也是把C#应用转化为java应用而已,所以,本质上,C#仍然只是被微软自己的操作系统支持。应用平台受到限制,是最大的缺点。

    1.  请回答一下几个名词的意思:JVM、 JDK、JRE、 JavaSE、JavaEE、JavaME、GC。

JVM:Java虚拟机,Java Virtual Machine的缩写,是一个虚构出来的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。

JDK:Java开发工具包,Java Development Kit的缩写,JDK是整个Java的核心,包括了Java运行环境、Java工具和Java核心类库。

JRE:Java运行环境,Java Runtime Environment的缩写。运行Java程序锁必须的环境的集合,包含JVM标准实现及Java核心类库。

JavaSE:Java Standard Edition,标准版,是我们常用的一个版本,从JDK1.5开始,改名为JavaSE,主要用于桌面应用软件的编程。

JavaEE:Java Enterprise Edition, 企业版。JavaEE是J2EE的一个新名称,主要用于分布式的网络程序的开发

JavaME:Java Micro Edition,机顶盒、移动电话和PDA之类嵌入式消费电子设备提供的Java语言平台,包括虚拟机和一系列标准化的JavaAPI。

GC:垃圾回收,Garbage Collection的缩写。当Java虚拟机发现内存资源紧张时,会自动的清理无用对象(没有引用到的对象)所占用的内存空间。

    1. JVM能有几个实例?

每个Java程序对应一个JVM实例,当一个Java程序运行时就创建一个JVM实例,因此JVM实例的个数取决于同时执行的程序的个数。

    1. Java跨平台是如何实现的。

Java是利用JVM(Java虚拟机)实现跨平台的。

Java源代码(*.java)经过Java编译器编译成Java字节码(*.class),执行Java字节码,Java字节经过JVM解释为具体平台的具体指令并执行。不同平台有不同的JVM,主流平台都提供了JVM,所以Java字节码可以在主流平台上能够解释执行。在这个意义上Java是跨凭条的,也就是说:Java的字节码是跨平台的。

    1. 简述TCP/UDP协议的区别?

TCP/UDP的比较

比较项

TCP

UDP

是否可连接

面向连接

面向非连接

传输可靠性

可靠

不可靠

应用场合

传输大量的数据

少量的数据

速度

    1. 阐述一下类的命名规则、方法的命名规则、变量的命名规则、包的命名规则、常量的命名规范。

在Java中,类的命名、方法的命名、变量的命名、包的命名以及常量的命名首先符合Java标识符的命名规则:

  1. 可以以字母、数字、下划线、和 $ 符组成。
  2. 首字母不能以数字开头。
  3. 中文可以作为变量名,但不提倡使用。
  4. Java区分大小写。
  5. 不能使用Java保留关键字。

其次,类的命名、方法的命名、变量的命名、包名的命名以及常量的命名要符合以下规范:

  1. 类命名规范:首字母大写,如果由多个单词合成一个类名,要求每个单词的首字母也要大写。
  2. 方法命名规范:首字母小写,中间的每个单词的首字母都要大写。
  3. 变量的命名规范与方法的命名规范一样。
  4. 包的命名规范:Java包的名字都是由小写单词组成。但是由于Java面向对象编程的特性,互联网上的域名是不会重复的,所以一般讲互联网上的域名作为包的唯一前缀。
  5. 常量的命名规范:基本数据类型的常量名为全安歇,如果是由多个单词构成,可以用下划线隔开。
    1. 阐述一下Java共有几种注释方法?

3种:单行注释,多行注释,文档注释。

    1. 如何增加代码的清晰度和可观性?
  1. 代码添加注释。
  2. 类名包名命名规范化
  3. 缩进排版规范
  4. 添加异常处理
  5. 使用测试类与测试方法
    1. Java中的void与null,有什么区别?

Void仅仅用于无返回值的方法中

Null则代表对象/变量的值,表示变量没有被实例化,没有指向具体的内存地址。

    1. Java中结构化程序设计有哪三种基本流程,分别对应哪些语句?

Java中结构化程序设计有三种基本流程,分别是顺序、选择、循环。其中,顺序表示程序中的各操作是按照出现的先后顺序执行的,选择对应Java语言中的if语句和switch语句;循环对应Java语言中的for与、do-while语句以及while语句。

    1. & 和 &&的区别?

&运算是把逻辑表达式全部计算完,&&运算具有短路计算功能,所谓短路计算,是指系统从左向右进行逻辑表达式的计算,一旦出现计算结果已经确定的情况下,则计算过程即终止。

    1. Java中8中基本数据类型及字节长度?

Java基本数据类型介绍  

类型名称

字节空间

说明

byte

1字节(8位)

存储1个字节数据

short

2字节(16位)

兼容性考虑,一般不用

int

4字节(32位)

存储整数(常用)

long

8字节(64位)

存储长整数(常用)

float

4字节(32位)

存储浮点数

double

8字节(64位)

存储双精度浮点数

char

2字节(16位)

存储一个字符

boolean

1字节(8位)

存储逻辑变量(true,false)

    1. 请描述一下JVM加载class文件的原理机制?

JVM中类的装载是由ClassLoader和它的子类来实现的, Java ClassLoader是一个重要Java运行时系统组件,它负责在运行时查找和装入类文件中的类。

    1. 你对软件开发中迭代的含义的理解?

软件开发中,各个开发阶段不是顺序执行的,而各个阶段都进行迭代,然后在进入下一个阶段的开发。这样对于开发中的需求变化,及人员变动都能得到更好的适应。

    软件开发过程汇总迭代模型如下图所示。

    1. 什么是进程?

进程是操作系统结构的基础,是一个计算机中正在运行的程序实例。可分配给处理器并由处理器执行的一个实体,由单一顺序的执行显示,一个当前状态和一组相关的系统资源所描述的活动单元。

    1. 什么是垃圾回收?什么时候触发垃圾回收?如何降低垃圾回收的触发频率?它能保证程序有足够的可用内存吗?

1)垃圾回收(GC)是Java语言的一个重要特性,作用是释放不再被使用内存。

2)垃圾回收由系统进行管理,在系统认为需要的时候自动启动一个县城进行处理。

3) 尽量减少垃圾内存,也就是新建对象的数量,可以降低垃圾回收的频率。

4) 垃圾回收机制无法保证有足够的内存。

1.17   Java中会存在内存泄露吗?请简单描述。

    会出现内存泄露。内存泄露有两种情况:1)堆中分配的内存,在没有将其释放掉的时候,就将所有能访问这块内存的方式都删掉;(2)在内存对象已经不需要的时候,还仍然保留这块内存和它的访问方式(引用)。

    List list = new ArrayList<>();

    for(int i=1;i<100;i++){

        Object o = new Object();

        list.add(o);

        o=null;

}

    1. Java源文件中是否可以包括多个类,有什么限制?

一个Java源文件可以包含多个类,每个源文件中之多有一个public类如果有的话,那么源文件的名字必须与之相同。如果源文件中没有pulbic类,则源文件用什么名字都可以;但最好还具有特定的意义,免得不清楚具体的含义,建议一个java源文件包含一个java类。

    1. 列出自己常用的jdk包。
  1. java.lang包:这个包中包含了jdk提供的基础类,比如String等都是这里面的,这个包是唯一一个不用导入就可以使用的包;
  2. java.io包:包含了与输入输出相关的类;比如文件操作等
  3. java.net包:包含了与网络相关的类,比如URL,URLConnection等
  4. java.util包:这个是系统辅助类,特别是集合类Collection,List,Map等
  5. java.sql包:数据库操作的类,Connection,Statement,ResultSet等。
    1. 简单说明什么是递归?什么情况下回使用?并使用Java实现一个简单的递归程序?
  1. 递归作为一种算法在程序设计语言中广泛应用,是指函数、过程、子程序在运行过程中直接或间接调用自身而产生的重入现象。
  2. 递归算法一般用于解决三类问题:
    1. 数据的定义是按递归定义的(Fibonacci(斐波那契)函数)
    2. 问题解法按递归算法实现(回溯)
    3. 数据的结构形式是按递归定义的(树的遍历,图的搜索)
    1. 写出n!的算法。

public  static void main(String []args){

    long    n = 5;

    System.out.pringln(doFactoria(n));

}

public  static long doFactorial(n){

    if(n<1){

        System.out.println(“ERROR”);

        return 0;

}else if(n==1||n==2){

    return n;

}else{

    return n*doFactorial(n-1);

}

 

}

    1. 排序都有哪些方法?

排序的方法有:插入排序(直接插入排序、希尔排序)、交换排序(冒泡排序、快速排序)、选择排序(直接选择排序、堆排序)、归并排序、分配排序(箱排序、基数排序)。

    1. 写一个排序算法,将10个1-100随机数字进行排序。

public class SelectSort{

    public static void selectionSort(int [] number){

        for(int i = 0; i < number.length; i++){

            int m = i;

            for(int j = i + 1; j < number.length; j++){

                m = j;

}

if(i != m){

    swap(number, i, m);

}

}

}

//用于交换数组中索引为i、j的元素

private static void swap(int[] number, int i, int j){

    int t;

    t = number[i];

    number[i] = number[j];

    number[j] = t;

}

public static void main(String args[]){

    //定义一个数组

    int [] num = new int[10];

    for(int I = 0; I < number.length; i++){

        num[i] = (int)(Math.random() * 100) + 1;

}

//排序

selectionSort(num);

for(int i=0; i<num.length; i++){

    System.out.println(num[i]);

}

}

}

    1. 请用java语言编写一个完成冒泡算法的程序?

    1. 有一数组a[1000]存放了1000个数,这1000个数取自1-999,且只有两个相同的数,剩下的998个数不同,写一个搜索算法找出相同的那个数的值。

参考答案:下列代码中使用了二分搜索算法实现了从数组a[1000]中,查找两个相同的数,代码如下所示

    1. 现有一个32位的整形变量value和一个32个元素的数组a[32],要求:1、对value随机复制;2、让数组a[n]的值等于value’位n’的值,0<=n<=31。举例:如果value的“位0”(Bit0)=0;如果value的“位10”(Bit10)=1,那么a[10]=1。

    1. 有1-100共一百个自然数,已随机放入一个98个元素的数组a[98]。要求写出一个尽量简单的方案,找出没有被放入数组的那2个数,并在屏幕上打印这2个数。注意:程序不用事先自然数随机放入数组的过程。

public static void main(String [] args){

    int[] b = new int[]{存入98个随机的1-100的整数}

    int [] a = new int[100];

    for(int t:b){

        a[t-1]=t;

        System.out.println(t+1);

}

}

    1. 用1,2,2,3,4,5六个数字,用Java写一个main函数,打印出所有不同的排列,如:512234,412345等,要求:”4”不能再第三位,”3”与”5”不能相连。

    1. 编写一个命令行程序,提示让用户输入2个整数,然后计算这2个整数之间能被5整除的所有整数的和,并打印显示?

    1. 编写一个命令程序,提示让用户名和密码。如果用户名和密码都是admin,则显示登陆成功;如果不是则显示登陆失败,让用户重新输入。如果用户连续3次认证失败,则锁定终止程序?

    1. 写Java代码,打印如下的杨辉三角:

1

1       1

1               2               1

1               3               3               1

1               4               6               4               1

1               5               10             10             5               1

    1. 使用Java完成快速排序算法。

    1. 编程:设有n个人围成一圈,从第一个开始报数,数到第m个人出列,然后从出列的下一个人开始报数,数到m个人又出列,反复直到全部出列,设n个人的编号分别为1,2,…n,打印出出列的顺序;

    1. 写 一段小程序检查数字是否为质数?

    1. 1到100自然数,放入到a【99】这个数组中,写一个函数找到没有被放进数组的那个数字?

    1. 找出101到200自然数中的质数,for循环越少越好(用2个for循环)

    1. 用数组实现一个栈(stack)至少有入栈方法push和出栈方法pop?

    1. a、b、c为3个整形变量,在不引入第4个变量的前提下写一个算法实现a=b、b=c、c=a。

    1. Java编程写出1000-2000可以被3整除的数?

    1. 编程:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,加入兔子都不死,问每个月的兔子总数为多少?

1.41 查找有哪几种方法:试写其中一种方法的小例子。

    顺序查找、二分查找、分块查找、二叉排序树查找等。下面是按照顺序查找的案例(顺序查找适合于存储结构为顺序存储或链接存储的线性表)

    1.    写代码判断两个数字(x、y)大大小,并返回大树能否被小整数整除?

1.43 将一个整形十进制数转化为二进制数(不能使用Java的类库)

1.44 编一个函数1000以内,可以被5整除,可以被7整除,但不能被5和7同时整除,输出符合结果的所有数?

1.45 生成一个六位数的验证码 包括大写字母、小写字母和数字?

1.46 有这样一类数字,他们顺着看和倒着看是相同的数,例如:121、656、2332等,这样的数字就称为回文数字。编写一个Java程序,判断从键盘接受的数字是否为回文数字。

1.47 编写程序输出9*9乘法口诀。

1.48 有5个人坐在一起,问第5个人多少岁?他说比第4个人大两岁,问第四个人多少岁?他说比第三个人大两岁,问第三个人多少岁?他说比第三个人大两岁,问第二个人多少岁?他说比第一个人大两岁,问最后一个人多少岁?他说10岁,请问第5个人多大?(递归实现)

1.49 公鸡每只3元,母鸡每只5元,小鸡三只一元,问100元买100只鸡有几种买法?

1.50 编程:有1020个西瓜,第一天卖一半多两个,以后每天卖剩下的一半多两个,问第几天能卖完?

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值