日常Java练习题(每天进步一点点系列)

简介: 日常Java练习题(每天进步一点点系列)

1、现有如下代码段:


x = 2;
while(x<n/2){
  x = 2*x;
}  

假设n>=0,则其时间复杂度应为( )

正确答案: A 你的答案: A (正确)

O(log2(n))

O(nlog2(n))

O(n)

O(n^2)


题解:

循环终止条件是 x > n/2

1.png


2、对于非运行时异常,程序中一般可不做处理,由java虚拟机自动进行处理。

正确答案: B 你的答案: B (正确)

正确

错误


题解:

运行异常,可以通过java虚拟机来自行处理。非运行异常,我们应该捕获或者抛出。


3、多重继承的概念在Java中实现是通过如下哪些?()

I. 扩展两个或多个类

II. 扩展一个类并实现一个或多个接口。

III. 实现两个或更多接口。

正确答案: B 你的答案: B (正确)

只有I &II

只有II & III

只有III

都是


题解:

Java只支持单继承,实现多重继承三种方式:

(1)直接实现多个接口

(2)扩展(extends)一个类然后实现一个或多个接口

(3)通过内部类去继承其他类


4、关于 Socket 通信编程,以下描述正确的是:( )

正确答案: C 你的答案: C (正确)

客户端通过new ServerSocket()创建TCP连接对象

客户端通过TCP连接对象调用accept()方法创建通信的Socket对象

客户端通过new Socket()方法创建通信的Socket对象

服务器端通过new ServerSocket()创建通信的Socket对象


题解:

客户端通过new Socket()方法创建通信的Socket对象

服务器端通过new ServerSocket()创建TCP连接对象


5、以下哪个命令用于查看tar(backup.tar)文件的内容而不提取它?()

正确答案: B 你的答案: B (正确)

tar -xvf backup.tar

tar -tvf backup.tar

tar -svf backup.tar

none of these


题解:

-s 还原文件的顺序和备份文件内的存放顺序相同。

-t 列出备份文件的内容。

-v 显示指令执行过程。

-f 指定压缩文件

-x 从备份文件中还原文件。

所以不能有x和s


把常用的tar解压命令总结下,当作备忘:


tar
-c: 建立压缩档案
-x:解压
-t:查看内容
-r:向压缩归档文件末尾追加文件
-u:更新原压缩包中的文件
这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个。下面的参数是根据需要在压缩或解压档案时可选的。
-z:有gzip属性的
-j:有bz2属性的
-Z:有compress属性的
-v:显示所有过程
-O:将文件解开到标准输出
下面的参数-f是必须的
-f: 使用档案名字,切记,这个参数是最后一个参数,后面只能接档案名。
# tar -cf all.tar *.jpg 
这条命令是将所有.jpg的文件打成一个名为all.tar的包。-c是表示产生新的包,-f指定包的文件名。
# tar -rf all.tar *.gif 
这条命令是将所有.gif的文件增加到all.tar的包里面去。-r是表示增加文件的意思。
# tar -uf all.tar logo.gif 
这条命令是更新原来tar包all.tar中logo.gif文件,-u是表示更新文件的意思。
# tar -tf all.tar 
这条命令是列出all.tar包中所有文件,-t是列出文件的意思
# tar -xf all.tar 
这条命令是解出all.tar包中所有文件,-x是解开的意思
压缩
tar –cvf jpg.tar *.jpg  将目录里所有jpg文件打包成tar.jpg
tar –czf jpg.tar.gz *.jpg   将目录里所有jpg文件打包成jpg.tar后,并且将其用gzip压缩,生成一个gzip压缩过的包,命名为jpg.tar.gz
tar –cjf jpg.tar.bz2 *.jpg 将目录里所有jpg文件打包成jpg.tar后,并且将其用bzip2压缩,生成一个bzip2压缩过的包,命名为jpg.tar.bz2
tar –cZf jpg.tar.Z *.jpg   将目录里所有jpg文件打包成jpg.tar后,并且将其用compress压缩,生成一个umcompress压缩过的包,命名为jpg.tar.Z
rar a jpg.rar *.jpg rar格式的压缩,需要先下载rar for linux
zip jpg.zip *.jpg   zip格式的压缩,需要先下载zip for linux 
解压
tar –xvf file.tar  解压 tar包
tar -xzvf file.tar.gz 解压tar.gz
tar -xjvf file.tar.bz2   解压 tar.bz2
tar –xZvf file.tar.Z   解压tar.Z
unrar e file.rar 解压rar
unzip file.zip 解压zip
总结
*.tar 用 tar –xvf 解压
*.gz 用 gzip -d或者gunzip 解压
*.tar.gz和*.tgz 用 tar –xzf 解压
*.bz2 用 bzip2 -d或者用bunzip2 解压
*.tar.bz2用tar –xjf 解压
*.Z 用 uncompress 解压
*.tar.Z 用tar –xZf 解压
*.rar 用 unrar e解压
*.zip 用 unzip 解压
linux下最常用的打包程序就是tar了,使用tar程序打出来的包我们常称为tar包,tar包文件的命令通常都是以.tar结尾的。生成tar包后,就可以用其它的程序来进行压缩。
1.命令格式:
tar[必要参数][选择参数][文件] 
2.命令功能:
用来压缩和解压文件。tar本身不具有压缩功能。他是调用压缩功能实现的 
3.命令参数:
必要参数有如下:
-A 新增压缩文件到已存在的压缩
-B 设置区块大小
-c 建立新的压缩文件
-d 记录文件的差别
-r 添加文件到已经压缩的文件
-u 添加改变了和现有的文件到已经存在的压缩文件
-x 从压缩的文件中提取文件
-t 显示压缩文件的内容
-z 支持gzip解压文件
-j 支持bzip2解压文件
-Z 支持compress解压文件
-v 显示操作过程
-l 文件系统边界设置
-k 保留原有文件不覆盖
-m 保留文件不被覆盖
-W 确认压缩文件的正确性
可选参数如下:
-b 设置区块数目
-C 切换到指定目录
-f 指定压缩文件
--help 显示帮助信息
--version 显示版本信息
4.常见解压/压缩命令
tar 
解包:tar xvf FileName.tar
打包:tar cvf FileName.tar DirName
(注:tar是打包,不是压缩!)
.gz
解压1:gunzip FileName.gz
解压2:gzip -d FileName.gz
压缩:gzip FileName
.tar.gz 和 .tgz
解压:tar zxvf FileName.tar.gz
压缩:tar zcvf FileName.tar.gz DirName
.bz2
解压1:bzip2 -d FileName.bz2
解压2:bunzip2 FileName.bz2
压缩: bzip2 -z FileName
.tar.bz2
解压:tar jxvf FileName.tar.bz2
压缩:tar jcvf FileName.tar.bz2 DirName
.bz
解压1:bzip2 -d FileName.bz
解压2:bunzip2 FileName.bz
压缩:未知
.tar.bz
解压:tar jxvf FileName.tar.bz
压缩:未知
.Z
解压:uncompress FileName.Z
压缩:compress FileName
.tar.Z
解压:tar Zxvf FileName.tar.Z
压缩:tar Zcvf FileName.tar.Z DirName
.zip
解压:unzip FileName.zip
压缩:zip FileName.zip DirName
.rar
解压:rar x FileName.rar
压缩:rar a FileName.rar DirName 
5.使用实例
实例1:将文件全部打包成tar包
命令:
tar -cvf log.tar log2012.log
tar -zcvf log.tar.gz log2012.log
tar -jcvf log.tar.bz2 log2012.log

6、下列哪个选项是Java调试器?如果编译器返回程序代码的错误,可以用它对程序进行调试。

正确答案: C 你的答案: C (正确)

java.exe

javadoc.exe

jdb.exe

javaprof.exe


题解:

javac.exe是编译.java文件

java.exe是执行编译好的.class文件

javadoc.exe是生成Java说明文档

jdb.exe是Java调试器

javaprof.exe是剖析工具


7、检查程序,是否存在问题,如果存在指出问题所在,如果不存在,说明输出结果。


package algorithms.com.guan.javajicu;  
public class Inc {  
    public static void main(String[] args) {  
       Inc inc = new Inc();  
       int i = 0;  
       inc.fermin(i);  
       i= i ++;  
       System.out.println(i); 
    }  
    void fermin(int i){  
       i++;  
    }  
}  

正确答案: A 你的答案: A (正确)

0

1

2

3


题解:

i++ 先赋值在计算结果;

++i 先计算结果再赋值。

int i = 0;

i = i ++; // 左边这个i其实是障眼法,就是一个中间变量,可以和下行的i合并;

System.out.println(i); 这里等价于:

int i = 0;

System.out.println(i++); 这下再看,先赋值(先将i传给println函数打印出来,在计算表达式结果)

所以打印出来的是0,实际上整个表达式的结果已经是1了,只是没有打印出整个表达式的结果。

所以我们知道如下结论:

1、无论怎么变,i++和++i的整个表达式的结果都是1.

2、有时我们打印的是表达式的结果(System.out.println(++i)),

有时我们打印的只是一个中间变量(System.out.println(i++))。

Ps:

int i = 0;

i++;

System.out.println(i); //值为1 打印的是表达式的结果

int i = 0;

++i;

System.out.println(i); //值为1 打印的是表达式的结果

int i = 0;

i = i++;

System.out.println(i); //值为0 打印的是中间变量(JVM中间缓存变量机制)

int i = 0;

i = ++i;

System.out.println(i); //值为1 打印的是表达式的结果


8、在 myjsp.jsp 中,关于下面的代码说法错误的是: ( )

<%@ page language=“java” import=“java.util.*” errorPage=“error.jsp” isErrorPage=“false” %>

正确答案: A 你的答案: A (正确)

该页面可以使用 exception 对象

该页面发生异常会转向 error.jsp

存在 errorPage 属性时,isErrorPage 是默认为 false

error.jsp 页面一定要有isErrorPage 属性且值为 true


题解:

A项:页面有isErrorPage属性且值为false,不可以使用 exception 对象

当isErrorPage ="false"时,用errorPage=“error.jsp”(isErrorPage默认是false)

当isErrorPage ="true"时,页面会直接使用exception


9、根据下面的代码,

String s = null;

会抛出NullPointerException异常的有()。

正确答案: A C 你的答案: A C (正确)


if( (s!=null) & (s.length()>0) )
if( (s!=null) && (s.length()>0) )
if( (s==null) | (s.length()==0) )
if( (s==null) || (s.length()==0) )

题解:

逻辑运算符:&&和|| 是按照“短路”方式求值的。如果第一个操作数已经能够确定表达式的值,第二个操作数就不必计算了。

位移运算符:&和| 运算符应用于布尔值,得到的结果也是布尔值,不按“短路”方式计算。即在得到计算结果之前,一定要计算两个操作数的值。

String s=null;没有给s开辟任何空间,当执行length()方法时候,

因为没有具体指向的内存空间,所以报出NullPointerException没有指向的错误。

A项: &是与,位运算,两个都得执行,执行到s.length()自然就报错了。

B项: S!=null 结果为false 整体就为false ,&& 后面就不会执行。下面的同理。


10、关于Java中的ClassLoader下面的哪些描述是错误的:( )

正确答案: B D F 你的答案: B D F (正确)

A:默认情况下,Java应用启动过程涉及三个ClassLoader: Boostrap, Extension, System

B:一般的情况不同ClassLoader装载的类是不相同的,但接口类例外,对于同一接口所有类装载器装载所获得的类是相同的

C:类装载器需要保证类装载过程的线程安全

D:ClassLoader的loadClass在装载一个类时,如果该类不存在它将返回null

E:ClassLoader的父子结构中,默认装载采用了父优先

F:所有ClassLoader装载的类都来自CLASSPATH环境指定的路径


题解:

A、java中类的加载有5个过程,加载、验证、准备、解析、初始化;这便是类加载的5个过程,而类加载器的任务是根据一个类的全限定名来读取此类的二进制字节流到JVM中,然后转换为一个与目标类对应的java.lang.Class对象实例,在虚拟机提供了3种类加载器,引导(Bootstrap)类加载器、扩展(Extension)类加载器、系统(System)类加载器(也称应用类加载器)。A正确

B、一个类,由不同的类加载器实例加载的话,会在方法区产生两个不同的类,彼此不可见,并且在堆中生成不同Class实例。所以B前面部分是正确的,后面接口的部分真的没有尝试过,等一个大佬的讲解吧;

C、类加载器是肯定要保证线程安全的;C正确

D、装载一个不存在的类的时候,因为采用的双亲加载模式,所以强制加载会直接报错,D错误

java.lang.SecurityException: Prohibited package name: java.lang

E、双亲委派模式是在Java 1.2后引入的,其工作原理的是,如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行,如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器,如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式,即每个儿子都很懒,每次有活就丢给父亲去干,直到父亲说这件事我也干不了时,儿子自己想办法去完成,所以默认是父装载,E正确

F、自定义类加载器实现 继承ClassLoader后重写了findClass方法加载指定路径上的class,F错误


答案汇总:

1、正确答案: A

2、正确答案: B

3、正确答案: B

4、正确答案: C

5、正确答案: B

6、正确答案: C

7、正确答案: A

8、正确答案: A

9、正确答案: A C

10、正确答案: B D F


以上部分题解来自牛客评论区,感谢评论区大佬的解释。


相关文章
|
5月前
|
存储 Java
创建一个乘法练习题生成器 using Java
创建一个乘法练习题生成器 using Java
|
6月前
|
人工智能 Java
Java练习题-输出二维数组对角线元素和
Java练习题-输出二维数组对角线元素和
|
6月前
|
存储 Java 索引
Java练习题-获取数组元素最大值
Java练习题-获取数组元素最大值
Java练习题-获取数组元素最大值
|
6月前
|
Java
<Java SE> 数组详解大全(附带练习题).一维数组、二维数组、数组拷贝、数组遍历...
<Java SE> 数组详解大全(附带练习题).一维数组、二维数组、数组拷贝、数组遍历
44 0
|
6月前
|
Java 索引
Java练习题-用冒泡排序法实现数组排序
Java练习题-用冒泡排序法实现数组排序
|
6月前
|
Java
Java练习题-键盘录入字符串实现大小写转换
Java练习题-键盘录入字符串实现大小写转换
|
6月前
|
Java
Java练习题-输出斐波那契(Fibonacci)数列
Java练习题-输出斐波那契(Fibonacci)数列
|
6月前
|
存储 Java
Java程序设计练习题8异常处理
Java程序设计练习题8异常处理
161 0
|
6月前
|
算法 Java 程序员
Java数组全套深入探究——进阶知识阶段4、一维数组练习题
Java数组全套深入探究——进阶知识阶段4、一维数组练习题
57 0
Java数组全套深入探究——进阶知识阶段4、一维数组练习题
|
6月前
|
Java
java字符串练习题8、同构字符串
java字符串练习题8、同构字符串
52 0
java字符串练习题8、同构字符串