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#仍然只是被微软自己的操作系统支持。应用平台受到限制,是最大的缺点。
-
- 请回答一下几个名词的意思: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虚拟机发现内存资源紧张时,会自动的清理无用对象(没有引用到的对象)所占用的内存空间。
-
- JVM能有几个实例?
每个Java程序对应一个JVM实例,当一个Java程序运行时就创建一个JVM实例,因此JVM实例的个数取决于同时执行的程序的个数。
-
- Java跨平台是如何实现的。
Java是利用JVM(Java虚拟机)实现跨平台的。
Java源代码(*.java)经过Java编译器编译成Java字节码(*.class),执行Java字节码,Java字节经过JVM解释为具体平台的具体指令并执行。不同平台有不同的JVM,主流平台都提供了JVM,所以Java字节码可以在主流平台上能够解释执行。在这个意义上Java是跨凭条的,也就是说:Java的字节码是跨平台的。
-
- 简述TCP/UDP协议的区别?
TCP/UDP的比较
比较项 | TCP | UDP |
是否可连接 | 面向连接 | 面向非连接 |
传输可靠性 | 可靠 | 不可靠 |
应用场合 | 传输大量的数据 | 少量的数据 |
速度 | 慢 | 快 |
-
- 阐述一下类的命名规则、方法的命名规则、变量的命名规则、包的命名规则、常量的命名规范。
在Java中,类的命名、方法的命名、变量的命名、包的命名以及常量的命名首先符合Java标识符的命名规则:
- 可以以字母、数字、下划线、和 $ 符组成。
- 首字母不能以数字开头。
- 中文可以作为变量名,但不提倡使用。
- Java区分大小写。
- 不能使用Java保留关键字。
其次,类的命名、方法的命名、变量的命名、包名的命名以及常量的命名要符合以下规范:
- 类命名规范:首字母大写,如果由多个单词合成一个类名,要求每个单词的首字母也要大写。
- 方法命名规范:首字母小写,中间的每个单词的首字母都要大写。
- 变量的命名规范与方法的命名规范一样。
- 包的命名规范:Java包的名字都是由小写单词组成。但是由于Java面向对象编程的特性,互联网上的域名是不会重复的,所以一般讲互联网上的域名作为包的唯一前缀。
- 常量的命名规范:基本数据类型的常量名为全安歇,如果是由多个单词构成,可以用下划线隔开。
- 阐述一下Java共有几种注释方法?
3种:单行注释,多行注释,文档注释。
-
- 如何增加代码的清晰度和可观性?
- 代码添加注释。
- 类名包名命名规范化
- 缩进排版规范
- 添加异常处理
- 使用测试类与测试方法
- Java中的void与null,有什么区别?
Void仅仅用于无返回值的方法中
Null则代表对象/变量的值,表示变量没有被实例化,没有指向具体的内存地址。
-
- Java中结构化程序设计有哪三种基本流程,分别对应哪些语句?
Java中结构化程序设计有三种基本流程,分别是顺序、选择、循环。其中,顺序表示程序中的各操作是按照出现的先后顺序执行的,选择对应Java语言中的if语句和switch语句;循环对应Java语言中的for与、do-while语句以及while语句。
-
- & 和 &&的区别?
&运算是把逻辑表达式全部计算完,&&运算具有短路计算功能,所谓短路计算,是指系统从左向右进行逻辑表达式的计算,一旦出现计算结果已经确定的情况下,则计算过程即终止。
-
- 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) |
-
- 请描述一下JVM加载class文件的原理机制?
JVM中类的装载是由ClassLoader和它的子类来实现的, Java ClassLoader是一个重要Java运行时系统组件,它负责在运行时查找和装入类文件中的类。
-
- 你对软件开发中迭代的含义的理解?
软件开发中,各个开发阶段不是顺序执行的,而各个阶段都进行迭代,然后在进入下一个阶段的开发。这样对于开发中的需求变化,及人员变动都能得到更好的适应。
软件开发过程汇总迭代模型如下图所示。
-
- 什么是进程?
进程是操作系统结构的基础,是一个计算机中正在运行的程序实例。可分配给处理器并由处理器执行的一个实体,由单一顺序的执行显示,一个当前状态和一组相关的系统资源所描述的活动单元。
-
- 什么是垃圾回收?什么时候触发垃圾回收?如何降低垃圾回收的触发频率?它能保证程序有足够的可用内存吗?
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;
}
-
- Java源文件中是否可以包括多个类,有什么限制?
一个Java源文件可以包含多个类,每个源文件中之多有一个public类如果有的话,那么源文件的名字必须与之相同。如果源文件中没有pulbic类,则源文件用什么名字都可以;但最好还具有特定的意义,免得不清楚具体的含义,建议一个java源文件包含一个java类。
-
- 列出自己常用的jdk包。
- java.lang包:这个包中包含了jdk提供的基础类,比如String等都是这里面的,这个包是唯一一个不用导入就可以使用的包;
- java.io包:包含了与输入输出相关的类;比如文件操作等
- java.net包:包含了与网络相关的类,比如URL,URLConnection等
- java.util包:这个是系统辅助类,特别是集合类Collection,List,Map等
- java.sql包:数据库操作的类,Connection,Statement,ResultSet等。
- 简单说明什么是递归?什么情况下回使用?并使用Java实现一个简单的递归程序?
- 递归作为一种算法在程序设计语言中广泛应用,是指函数、过程、子程序在运行过程中直接或间接调用自身而产生的重入现象。
- 递归算法一般用于解决三类问题:
- 数据的定义是按递归定义的(Fibonacci(斐波那契)函数)
- 问题解法按递归算法实现(回溯)
- 数据的结构形式是按递归定义的(树的遍历,图的搜索)
-
- 写出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);
}
}
-
- 排序都有哪些方法?
排序的方法有:插入排序(直接插入排序、希尔排序)、交换排序(冒泡排序、快速排序)、选择排序(直接选择排序、堆排序)、归并排序、分配排序(箱排序、基数排序)。
-
- 写一个排序算法,将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]);
}
}
}
-
- 请用java语言编写一个完成冒泡算法的程序?
-
- 有一数组a[1000]存放了1000个数,这1000个数取自1-999,且只有两个相同的数,剩下的998个数不同,写一个搜索算法找出相同的那个数的值。
参考答案:下列代码中使用了二分搜索算法实现了从数组a[1000]中,查找两个相同的数,代码如下所示
-
- 现有一个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-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,2,2,3,4,5六个数字,用Java写一个main函数,打印出所有不同的排列,如:512234,412345等,要求:”4”不能再第三位,”3”与”5”不能相连。
-
- 编写一个命令行程序,提示让用户输入2个整数,然后计算这2个整数之间能被5整除的所有整数的和,并打印显示?
-
- 编写一个命令程序,提示让用户名和密码。如果用户名和密码都是admin,则显示登陆成功;如果不是则显示登陆失败,让用户重新输入。如果用户连续3次认证失败,则锁定终止程序?
-
- 写Java代码,打印如下的杨辉三角:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
-
- 使用Java完成快速排序算法。
-
- 编程:设有n个人围成一圈,从第一个开始报数,数到第m个人出列,然后从出列的下一个人开始报数,数到m个人又出列,反复直到全部出列,设n个人的编号分别为1,2,…n,打印出出列的顺序;
-
- 写 一段小程序检查数字是否为质数?
-
- 1到100自然数,放入到a【99】这个数组中,写一个函数找到没有被放进数组的那个数字?
-
- 找出101到200自然数中的质数,for循环越少越好(用2个for循环)
-
- 用数组实现一个栈(stack)至少有入栈方法push和出栈方法pop?
-
- a、b、c为3个整形变量,在不引入第4个变量的前提下写一个算法实现a=b、b=c、c=a。
-
- Java编程写出1000-2000可以被3整除的数?
-
- 编程:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,加入兔子都不死,问每个月的兔子总数为多少?
1.41 查找有哪几种方法:试写其中一种方法的小例子。
顺序查找、二分查找、分块查找、二叉排序树查找等。下面是按照顺序查找的案例(顺序查找适合于存储结构为顺序存储或链接存储的线性表)
-
- 写代码判断两个数字(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个西瓜,第一天卖一半多两个,以后每天卖剩下的一半多两个,问第几天能卖完?