Java学习记录——错题总结(四)

第一套

//point X
public class Foo {
    public static void main(String[] args) throws Exception {
 
        PrintWriter out = new PrintWriter(
                new java.io.OutputStreamWriter(System.out), true);
        out.println("Hello");
    }
 
}

下面哪个选项放在point X这里可以正确执行?
import java.io.PrintWriter;
include java.io.PrintWriter;
import java.io.OutputStreamWriter;
include java.io.OutputStreamWriter;
no statement is needed.

解析:代码中使用了PrintWriter类,所以要引用此类

为什么不是C java.io.OutputStreamWrite已经是完整的类,无需在导入,而printWrite这个类,并不是调用完整的类名。则需要import导入
注意:
在创建OutputStreamWriter的时候,使用的是类的全名称。所以不需要使用import
故:选择A

2.哪个类可用于处理 Unicode?
InputStreamReader
BufferedReader
Writer
PipedInputStream

解析:InputStreamReader用于将字节流转换为字符流供我们使用,同时还可以指定编码,显然处理unicode应该采用InputStreamReader,其他三种均不能指定编码。

3.下面有关maven和ant的描述,描述错误的是?
正确答案: C
Ant 没有正式的约定如一个一般项目的目录结构,你必须明确的告诉 Ant 哪里去找源代码
Maven 拥有约定,因为你遵循了约定,它已经知道你的源代码在哪里
maven和ant都有“生命周期”的概念,当你输入一个命令后,maven或者ant会执行一系列的有序的步骤,直到到达你指定的生命周期
Ant构建文件默认命名为build.xml,Maven默认构建文件为pom.xml

Ant和Maven都是基于Java的构建(build)工具。理论上来说,有些类似于(Unix)C中的make ,但没有make的缺陷。Ant是软件构建工具,Maven的定位是软件项目管理和理解工具。
Ant特点
没有一个约定的目录结构
›必须明确让ant做什么,什么时候做,然后编译,打包
›没有生命周期,必须定义目标及其实现的任务序列
›没有集成依赖管理
Maven特点
拥有约定,知道你的代码在哪里,放到哪里去
›拥有一个生命周期,例如执行 mvn install 就可以自动执行编译,测试,打包等构建过程
›只需要定义一个pom.xml,然后把源码放到默认的目录,Maven帮你处理其他事情
›拥有依赖管理,仓库管理

4.针对以下代码,哪些选项执行后是true的:()

class CompareReference{
   public static void main(String [] args){
   float f=42.0f;
   float f1[]=new float[2];
   float f2[]=new float[2];
   float[] f3=f1;
   long x=42;
   f1[0]=42.0f;
  }
}

正确答案: B C
f1= =f2
x= =f1[0]
f1= =f3
f2= =f1[1]

解析:c相等很好理解,着重说一下b选项的原因
java核心卷I中43页有如下表述:两个数值进行二元操作时,会有如下的转换操作:
如果两个操作数其中有一个是double类型,另一个操作就会转换为double类型。
否则,如果其中一个操作数是float类型,另一个将会转换为float类型。
否则,如果其中一个操作数是long类型,另一个会转换为long类型。
否则,两个操作数都转换为int类型。
故,x==f1[0]中,x将会转换为float类型。

总结:基本类型之间的比较,应该会将低精度类型自动转为高精度类型再比较。

第二套

1.给出以下代码

public class TestObj{
    public static void main(String[] args){
        Object o=new Object(){
            public boolean equals(Object obj){
                return true;
            }
        };
        System.out.println(o.equals("Fred"));
    }
}

请给出结果:()true
可以以这样的形式重写父类的方法:

Object o=new Object(){
            public boolean equals(Object obj){
                return true;
            }

2.以下代码结果是什么?

public class foo {
    public static void main(String sgf[]) {
 
        StringBuffer a=new StringBuffer("A");
 
        StringBuffer b=new StringBuffer("B");
 
        operate(a,b);
 
        System.out.println(a+"."+b);
    }
    static void operate(StringBuffer x,StringBuffer y) {
        x.append(y);
        y=x;
    }
}

正确答案: C
代码可以编译运行,输出“AB.AB”。
代码可以编译运行,输出“A.A”。
代码可以编译运行,输出“AB.B”。
代码可以编译运行,输出“A.B”。

理由:引用a指向对象A
引用b指向对象B
引用x指向对象A
引用y指向对象B
在operate方法中(传引用),引用x指向的对象A被连接了B,对象A也就被改变为AB
然后又把引用y指向了x所指向的对象地址(语句y=x),也就是此时引用a,x,y指向同一个对象AB

而引用b没有发生任何变化,依旧指向对象B。

3.关于运行时常量池,下列哪个说法是正确的
正确答案: B C D
运行时常量池大小受栈区大小的影响
运行时常量池大小受方法区大小的影响
存放了编译时期生成的各种字面量
存放编译时期生成的符号引用

方法区是什么?
方法区是广义上的概念,是一个定义、标准,可以理解为Java中的接口,在Jdk6、7方法区的实现叫永久代;Jdk8之后方法区的实现叫元空间,并从JVM内存中移除,放到了直接内存中;
方法区是被所有方法线程共享的一块内存区域.

运行时常量池是什么?
运行时常量池是每一个类或接口的常量池的运行时表示形式.
具体体现就是在Java编译后生成的.class文件中,会有class常量池,也就是静态的运行时常量池;

运行时常量池存放的位置?
运行时常量池一直是方法区的一部分,在不同版本的JDK中,由于方法区位置的变化,运行时常量池所处的位置也不一样.JDK1.7及之前方法区位于永久代.由于一些原因在JDK1.8之后彻底祛除了永久代,用元空间代替。

运行时常量池存放什么?
存放编译期生成的各种字面量和符号引用;(字面量和符号引用不懂的同学请自行查阅)
运行时常量池中包含多种不同的常量,包括编译期就已经明确的数值字面量,也包括到运行期解析后才能够获得的方法或者字段引用。 此时不再是常量池中的符号地址了,这里换为真实地址。

运行时常量池与字符串常量池?(可能有同学把他俩搞混)
字符串常量池:在JVM中,为了减少相同的字符串的重复创建,为了达到节省内存的目的。会单独开辟一块内存,用于保存字符串常量,这个内存区域被叫做字符串常量池.

字符串常量池位置?
JDK1.6时字符串常量池,被存放在方法区中(永久代),而到了JDK1.7,因为永久代垃圾回收频率低;而字符串使用频率比较高,不能及时回收字符串,会导致导致永久代内存不足,就被移动到了堆内存中。

第三套

1.在 JAVA 编程中, Java 编译器会将 Java 程序转换为( )

正确答案: A
字节码
可执行代码
机器代码
以上都不对

解析:
1.编译器将Java源代码编译成字节码class文件
2.类加载到JVM里面后,执行引擎把字节码转为可执行代码
3.执行的过程,再把可执行代码转为机器码,由底层的操作系统完成执行。

2.从以下四个选项选出不同的一个。
LVS
Nginx
Lighttpd
Apache

LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。 Nginx (“engine
x”) 是一个高性能的 HTTP 和 反向*** 服务器,也是一个 IMAP/POP3/SMTP ***服务器。 Lighttpd
是一个德国人领导的开源Web服务器软件,其根本的目的是提供一个专门针对高性能网站,安全、快速、兼容性好并且灵活的web
server环境。具有非常低的内存开销、cpu占用率低、效能好以及丰富的模块等特点。
Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。

3.subset(form,true,to,true)是Treeset的非静态方法,该方法返回从form元素到to元素的一个set集合,两个boolean类型是确认是否包含边境值用的。

TreeSet<Integer> set = new TreeSet<Integer>();
TreeSet<Integer> subSet = new TreeSet<Integer>();
for(int i=606;i<613;i++){
    if(i%2==0){
     set.add(i);
     }
 }
subSet = (TreeSet)set.subSet(608,true,611,true);
set.add(609);
System.out.println(set+" "+subSet);

结果为:[606, 608, 609,610, 612] [608, 609,610]

4.下列关于JAVA多线程的叙述正确的是()

调用start()方法和run()都可以启动一个线程
CyclicBarrier和CountDownLatch都可以让一组线程等待其他线程
Callable类的call()方法可以返回值和抛出异常
新建的线程调用start()方法就能立即进行运行状态

A,start是开启线程,run是线程的执行体,run是线程执行的入口。
B,CyclicBarrier和CountDownLatch都可以让一组线程等待其他线程。前者是让一组线程相互等待到某一个状态再执行。后者是一个线程等待其他线程结束再执行。
C,Callable中的call比Runnable中的run厉害就厉害在有返回值和可以抛出异常。同时这个返回值和线程池一起用的时候可以返回一个异步对象Future。
D,start是把线程从new变成了runnable

5.final、finally和finalize的区别中,下述说法正确的有?
正确答案: A B
final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。

finally是异常处理语句结构的一部分,表示总是执行。

finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源的回收,例如关闭文件等。

引用变量被final修饰之后,不能再指向其他对象,它指向的对象的内容也是不可变的。

选AB A,D考的一个知识点,final修饰变量,变量的引用(也就是指向的地址)不可变,但是引用的内容可以变(地址中的内容可变)。
B,finally表示总是执行。但是其实finally也有不执行的时候,但是这个题不要扣字眼。

  1. 在try中调用System.exit(0),强制退出了程序,finally块不执行。
  2. 在进入try块前,出现了异常,finally块不执行。 C,finalize方法,这个选项错就错在,这个方法一个对象只能执行一次,只能在第一次进入被回收的队列,而且对象所属于的类重写了finalize方法才会被执行。第二次进入回收队列的时候,不会再执行其finalize方法,而是直接被二次标记,在下一次GC的时候被GC。
    放一张图吧
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
作为一个AI语言模型,我无法编写完整的Java应用程序,但我可以给你一些指导,希望能帮到你。 首先,你需要确定你的错题本App需要包含哪些功能。以下是一个简单的功能列表: 1. 用户登录和注册 2. 添加题目和答案 3. 查看错题列表 4. 删除错题 5. 修改错题 6. 退出登录 接下来,你需要设计数据库表结构。你可以使用MySQL或其他数据库管理系统来存储数据。以下是一个简单的数据库表结构: 1. 用户表:包含用户ID、用户名和密码 2. 题目表:包含题目ID、题目、答案和用户ID 3. 错题表:包含错题ID、题目ID和用户ID 然后,你需要编写Java代码来实现上述功能。以下是一个简单的代码示例: 1. 用户登录和注册: ``` // 登录 public boolean login(String username, String password) { // 根据用户名和密码查询用户表 // 如果查询到了用户记录,返回true,否则返回false } // 注册 public boolean register(String username, String password) { // 插入新用户记录到用户表 // 如果插入成功,返回true,否则返回false } ``` 2. 添加题目和答案: ``` public boolean addQuestion(String question, String answer, int userId) { // 插入新题目记录到题目表 // 如果插入成功,返回true,否则返回false } ``` 3. 查看错题列表: ``` public List<Question> getWrongQuestions(int userId) { // 根据用户ID查询错题表和题目表,返回错题列表 } ``` 4. 删除错题: ``` public boolean deleteWrongQuestion(int wrongQuestionId) { // 根据错题ID删除错题记录 // 如果删除成功,返回true,否则返回false } ``` 5. 修改错题: ``` public boolean updateWrongQuestion(int wrongQuestionId, String question, String answer) { // 根据错题ID更新题目表中的题目和答案 // 如果更新成功,返回true,否则返回false } ``` 6. 退出登录: ``` public void logout() { // 清除用户登录状态 } ``` 最后,你需要将这些代码整合到一个Java应用程序中,并使用Java Swing或其他UI框架来实现用户界面。你还需要编写一些单元测试来确保你的代码能够正确地处理各种情况。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值