java错题总结

10.2

  1. Java语言中,下面哪个语句是创建数组的正确语句?( A B D E )
    float f[][] = new float[6][6];
    float []f[] = new float[6][6];
    float f[][] = new float[][6];
    float [][]f = new float[6][6];
    float [][]f = new float[6][];

分析:
二维数组定义,一维长度必须定义,二维可以后续定义

  1. 关于多线程和多进程,下面描述正确的是(AC):
    多进程里,子进程可获得父进程的所有堆和栈的数据;而线程会与同进程的其他线程共享数据,拥有自己的栈空间。
    线程因为有自己的独立栈空间且共享数据,所有执行的开销相对较大,同时不利于资源管理和保护。
    线程的通信速度更快,切换更快,因为他们在同一地址空间内。
    一个线程可以属于多个进程。
  2. 一个文件中的字符要写到另一个文件中,首先需要(C )
    System.out.print (buffer[i]);
    FileOutputStream fout = new FileOutputStream(this.filename);
    FileInputStream fin = new FileInputStream(this.filename);
    System.in.read(buffer)。

分析:
先要将要写入的内容读入内存:FileInputStream fin = new FileInputStream(this.filename);
然后再写出到目标文件:FileOutputStream

10.4

  1. 有以下代码片段:
    String str1=“hello”;
    String str2=“he”+ new String(“llo”);
    System.out.println(str1==str2);
    请问输出的结果是:(D)
    true
    都不对
    null
    false

分析:
String str1=“hello”;在常量池中
String str2=“he”+ new String(“llo”);在堆中
==是判断两个对象的内存地址是否相同 ,这里时false
+号拼接字符串时会创建一个新对象再返回

  1. 检查程序,是否存在问题,如果存在指出问题所在,如果不存在,说明输出结果。(D)
public class Example {  
  String str = new String("good");  
  char[] ch = {'a','b','c'};  
  public static void main(String[] args) {  
     Example ex = new Example();  
     ex.change(ex.str, ex.ch);  
     System.out.print(ex.str +"and");  
     System.out.print(ex.ch);   
  }  
   
  public void change(String str, char ch[]){  
     str= "test ok";  
     ch[0]= 'g';  
  }  
}  

test okandabc
test okandgbc
goodandabc
goodandgbc

分析:
这里调用了change方法给str和ch重新赋了值,但是并没有改变原来的参数值,因为change 没有返回值,所以最后打印出的内容还是原来的内容拼接

  1. 以下JAVA程序代码的输出是(C)
    public static void main(String args[]) {
    System.out.println(17^5);
    }
    12
    22
    20
    1419857

分析:
“^”是位异运算符号。
运算规则是:两个数转为二进制,然后从高位开始比较,如果相同则为0,不相同则为1。
17:0001 0001
5 : 0000 0101
结果:0001 0100 转10进制:20

  1. 下面哪些具体实现类可以用于存储键,值对,并且方法调用提供了基本的多线程安全支持:( AE )
    java.util.ConcurrentHashMap
    java.util.Map
    java.util.TreeMap
    java.util.SortMap
    java.util.Hashtable
    java.util.HashMap
  2. 为AB类的一个无形式参数无返回值的方法method书写方法头,可以用AB.method()方式调用,该方法头的形式为( A )
    static void method( )
    public void method( )
    final void method( )
    abstract void method( )

分析:
可以用类名.方法调用的,应该定义为静态的方法

  1. 使用mvc模式设计的web应用程序具有以下优点,除了(D)
    可维护行强
    可扩展性强
    代码重复少

    大大减少代码量

分析:一般设计模式都会增加代码量

  1. 以下哪几种方式可用来实现线程间通知和唤醒:( AC)
    Object.wait/notify/notifyAll
    ReentrantLock.wait/notify/notifyAll
    Condition.await/signal/signalAll
    Thread.wait/notify/notifyAll

分析:
wait()、notify()和notifyAll()是 Object类 中的方法
Condition是在java 1.5中才出现的,它用来替代传统的Object的wait()、notify()实现线程间的协作,相比使用Object的wait()、notify(),使用Condition1的await()、signal()这种方式实现线程间协作更加安全和高效。

  1. 关于Java中的数组,下面的一些描述,哪些描述是准确的:( ACF )
    数组是一个对象,不同类型的数组具有不同的类
    数组长度是可以动态调整的
    数组是一个连续的存储结构
    一个固定长度的数组可类似这样定义: int array[100]
    两个数组用equals方法比较时,会逐个便利其中的元素,对每个元素进行比较
    可以二维数组,且可以有多维数组,都是在Java中合法的

分析:
A选项,jvm会在运行时动态生成数组类,然后实例化,不同类型的数组当然是不同的类。
B 数组的长度是固定的
D 数组的长度是固定的,int[] array =new int[100]就对了
E 数组是一种引用数据类型,所以肯定是继承自Object类的,所以里面有equals()方法,但是没有被重写过。因此Object.equals()比较的是两个数组的地址,相当于==的作用;如果是遍历数组中的元素,进行一一比较,应该选择Arrays.equals()

  1. 执行下列程序的输出结果为( D )
 public class Test {
 public static void main(String[] args) {
 String s1 = "HelloWorld";
 String s2 = new String("HelloWorld");
 if (s1 == s2) {
 System.out.println("s1 == s2");
 } else {
 System.out.println("s1 != s2");
 }
 if (s1.equals(s2)) {
 System.out.println("s1 equals s2");
 } else {
 System.out.println("s1 not equals s2");
 }
 }
 }

A. s1 == s2
s1 not equals s2
B. s1 == s2
s1 equals s2
C. s1 != s2
s1 not equals s2
D. s1 != s2
s1 equals s2

分析:
“==”:基本数据类型比较的是值;引用类型时比较的是指向的地址 si是一个值s2是一个地址,所以s1 != s2
“equals”:比较的是地址是否相同;若类覆盖了equals()方法则比较的是内容 这里String类里的equals方法被覆盖了因此比较的是内容,所以s1 equals s2

  1. volatile关键字的说法错误的是(A)
    能保证线程安全
    volatile关键字用在多线程同步中,可保证读取的可见性
    JVM保证从主内存加载到线程工作内存的值是最新的
    volatile能禁止进行指令重排序

错误原因:分析题意错误,问的是错误的是哪一项!!!
volatile不能保证线程的安全

  1. 给出以下代码,请给出结果(B)
class Two{
    Byte x;
}
class PassO{
    public static void main(String[] args){
        PassO p=new PassO();
        p.start();
    }
    void start(){
        Two t=new Two();
        System.out.print(t.x+” ”);
        Two t2=fix(t);
        System.out.print(t.x+” ” +t2.x);
    }
    Two fix(Two tt){
        tt.x=42;
        return tt;
    }
}

null null 42
null 42 42
0 0 42
0 42 42
An exception is thrown at runtime
Compilation

分析:
基本类型初始化赋值为0,包装类初始化为null
注意:此处为Byte是byte的包装类型,因此x初始化为null而不是0!!
t.x没有值且是一个包装类,因此是初始值所以是null
t2调用了函数fix函数,将t作为形参传递给了实参tt,最后返回tt.x为42,因此此时t.x的值也是42
将tt的值赋给了t2,因此t2.x的值也是42
.
t作为参数传进去后,返回的 tt(也就是t2)和 t 是一个地址,所以 t.x+” ” +t2.x都是42

10.10

正确的复习知识,错误的反思总结。

  1. java中创建对象有以下几种方法:
    1.用new语句创建对象,这是最常用的创建对象的方式。
    2.运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。
    3.调用对象的clone()方法。
    4.运用反序列化手段,调用java.io.ObjectInputStream对象的readObject()方法.

  2. final的基本规则:
    final修饰的类不能被继承;
    final修饰的成员变量只能赋值一次,可以在类方法中赋值,也可以在声明的时候直接赋值;
    final修饰的局部变量即为常量,只能赋值一次;
    final修饰的方法不允许被子类覆盖;

  3. 关于以下application,说法正确是什么?(B)

public class Test {
	static int x=10;
	static {x+=5;}
	public static void main(String[] args) //4
        {
		System.out.println("x="+x);
	}
	static{x/=3;};
}//9

4行与9行不能通过编译,因为缺少方法名和返回类型
编译通过,执行结果是:x=5
编译通过,执行结果是:x=3
9行不能通过编译,因为只能有一个静态初始化器

注意:静态代码先于主方法执行,静态代码块之间遵从代码顺序执行;因此这里执行完静态代码之后x的值变成了5
拓展知识:在类中定义的{}之间被称为构造块,构造块相对于构造方法先执行,构造块之间按照代码编译顺序执行。

  1. 运用下列哪个命令能够获取JVM的内存映像 ( B )
    jinfo
    jmap
    jhat
    jstat

1、jps:查看本机java进程信息。
2、jstack:打印线程的栈信息,制作线程dump文件。
3、jmap:打印内存映射,制作堆dump文件
4、jstat:性能监控工具
5、jhat:内存分析工具
6、jconsole:简易的可视化控制台
7、jvisualvm:功能强大的控制台

  1. 以下程序输出(D)
public static void main(String[] args) {
   int num = 2;
   switch (num) {
   case 1:
        ++num;
   case 2:
        ++num;
   case 3:
        ++num;
   default:
        ++num;
   break;
   }
   System.out.println(num);
 }
}

2
3
4
5

default 是当之前的case都没有匹配上的时候才走这里;
因此第一次num=2,case之后变成了3;继续case变成了4;继续case走deafult变成了5

  1. ^表示异或 就是相同是0 不同是1;
    按位或|
    按位且&
    按位取反~
    左移<<:补0,相当于乘以2
    右移>>:补符号位(无符号补0),相当于除以2

  2. Integer i = 42;
    Long l = 42l;
    Double d = 42.0;
    下面为true的是(G)
    (i == l)
    (i == d)
    (l == d)
    i.equals(d)
    d.equals(l)
    i.equals(l)
    l.equals(42L)

分析:
包装类的“==”运算在不遇到算术运算的情况下不会自动拆箱。因此ABC错,因为类型不相同的==比较会出现编译错误,不能比较;
包装类的equals()方法不处理数据转型。DEF调用了equals方法,因此会先比较类型,DEF错;

  1. 下面有关JVM内存,说法错误的是?(C)
    程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行到了第几行,是线程隔离的
    虚拟机栈描述的是Java方法执行的内存模型,用于存储局部变量,操作数栈,动态链接,方法出口等信息,是线程隔离的

    方法区用于存储JVM加载的类信息、常量、静态变量、以及编译器编译后的代码等数据,是线程隔离的
    原则上讲,所有的对象都在堆区上分配内存,是线程之间共享的

  2. 一个容器类数据结构,读写平均,使用锁机制保证线程安全。如果要综合提高该数据结构的访问性能,最好的办法是___分区段加锁___。

  3. 抛InterruptedException的代表方法有:
    java.lang.Object 类的 wait 方法
    java.lang.Thread 类的 sleep 方法
    java.lang.Thread 类的 join 方法

  4. ArrayLists和LinkedList的区别,下述说法正确的有?(ABCD)
    ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
    对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要迭代器。
    对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。
    ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间。

  5. 下面有关java类加载器,说法正确的是?(ABCD)
    引导类加载器(bootstrap class loader):它用来加载 Java 的核心库,是用原生代码来实现的
    扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。
    系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类
    tomcat为每个App创建一个Loader,里面保存着此WebApp的ClassLoader。需要加载WebApp下的类时,就取出ClassLoader来使用

  6. 以下说法中正确的有?(AD)
    StringBuilder是 线程不安全的
    Java类可以同时用 abstract和final声明
    HashMap中,使用 get(key)==null可以 判断这个Hasmap是否包含这个key
    volatile关键字不保证对变量操作的原子性

C项:Hashmap中的value可以之null,get(key)==null有两种情况:
一是key不存在;
二是该key中存的是null,所以应该使用map.containskey(key)返回的true/false来判断是否存在这个key。

  1. 以下哪些类是线程安全的(ADE)
    Vector
    HashMap
    ArrayList
    StringBuffer
    Properties

Properties实现了Map接口,是线程安全的;

  1. Java类Demo中存在方法func1、func2、func3和func4,请问该方法中,哪些是不合法的定义?( AD )
public class Demo{

  float func1()
  {
    int i=1;
    return;
  }
  float func2()
  {
    short i=2;
    return i;
  }
  float func3()
  {
    long i=3;
    return i;
  }
  float func4()
  {
    double i=4;
    return i;
  }
}

func1
func2
func3
func4

A项,没有返回值,错误;
B项,short->float无需强制转换,正确;
C项,long->float无需强制转换,正确;
D项,double->float精度丢失,错误;

  1. 以下说法哪个是正确的(ABCD)***
    IOException在编译时会被发现
    NullPointerEception在编译时不被发现
    SQLException在编译时会被发现
    FileNotFoundException在编译时会被发现

编译时能被发现的是必须加上try catch的异常,这些异常在编译时可以被发现
Java的异常分为两种,一种是运行时异常(RuntimeException),一种是非运行异常也叫检查式异常(CheckedException)。

  1. 运行时异常不需要程序员去处理,当异常出现时,JVM会帮助处理。常见的运行时异常有:
    ClassCastException(类转换异常)
    ClassNotFoundException
    IndexOutOfBoundsException(数组越界异常)
    NullPointerException(空指针异常)
    ArrayStoreException(数组存储异常,即数组存储类型不一致)
    还有IO操作的BufferOverflowException异常
  2. 非运行异常需要程序员手动去捕获或者抛出异常进行显示的处理,因为Java认为Checked异常都是可以被修复的异常。常见的异常有:
    IOException
    SqlException

10.18

  1. 一个类的构造器不能调用这个类中的其他构造器。(× )

this()和super()都是构造器,this()调用本类构造器,super()调用父类构造器

  1. java中可以将布尔值与整数进行比较吗(不可以)

  2. java的跨平台特性表述:“一次编译,到处运行”。java程序运行在JVM上,而JVM上屏蔽了底层操作系统的差异,即跨平台的特性主要体现在JVM虚拟机上

  3. 一个Java源程序文件中定义几个类和接口,则编译该文件后生成几个以.class为后缀的字节码文件 (√)

  4. 下面字段声明中哪一个在interface主体内是合法的? (B)
    private final static int answer = 42;
    public static int answer = 42;
    final static answer = 42;
    int answer;

接口默认是public abstract修饰的;接口中的方法默认是public abstract;接口中的属性(常量)默认是public static final修饰的

  1. 有一个源代码,只包含import java.util.* ; 这一个import语句,下面叙述正确的是? ( C )
    只能写在源代码的第一句
    可以访问java/util目录下及其子目录下的所有类
    能访问java/util目录下的所有类,不能访问java/util子目录下的所有类
    编译错误

导入java.util.*不能读取其子目录的类,因为如果java.util里面有个a类,java.util.regex里面也有个a类,我们若是要调用a类的方法或属性时,应该使用哪个a类呢

  1. 下面代码将输出什么内容:(B)
public class SystemUtil{
    public static boolean isAdmin(String userId){
        return userId.toLowerCase()=="admin";
    }
    public static void main(String[] args){
        System.out.println(isAdmin("Admin"));
    }
}

true
false
1
编译错误

== 比较引用类型的时候比较的是地址。
题目里toLowerCase()底层的实现是return new String(result, 0, len + resultOffset);,即new了一个对象,因此比较是用常量池中的字符串“admin”和对象去比较,这俩的地址不同,所以为false

  1. 已知x >= y and y >= z 为真,那么x > z or y = z 值为(C)


    无法确定
    x y z同为正数时为真

  2. 在根类Object中包含一下方法:
    clone();
    equals();
    finalize();
    getClass();[align=left][/align]
    notify(),notifyAll();
    hashCode();
    toString();
    wait();

  3. 下面有关Java的说法正确的是( ACDF )
    一个类可以实现多个接口
    抽象类必须有抽象方法
    protected成员在子类可见性可以修改
    通过super可以调用父类构造函数
    final的成员方法实现中只能读取类的成员变量
    String是不可修改的,且java运行环境中对string对象有一个常量池保存

C项:子类继承父类的方法,访问权限可以相同或往大了改 ,对
E项:final修饰的方法不能被重写;static修饰的方法才只能访问类的成员变量

  1. 下列有关java构造函数叙述正确的是(CD)
    构造器的返回值为void类型
    如果一个源文件中有多个类,那么构造器必须与公共类同名
    构造器可以有0个,1个或一个以上的参数
    每个类可以有一个以上的构造器

错因:误选B,B项中当一个源文件中有多个类时,构造器(构造方法)不一定与公共类同名,每个类都可以有自己的构造函数,函数名与自己的类名相同即可

  1. 面哪些Java中的流对象是字节流?(ABCD)
    FileInputStream
    BufferedInputStream
    PushbackInputStream
    ByteArrayInputStream

Stream结尾的都是字节流;
Reader和Writer结尾都是字符流
两者的区别:字节流读写的时候按字节读写;字符流读写的时候按字符读写

  1. Java创建对象的说法正确的有(ABCD)
    用new语句创建对象,是最常见的创建对象的方法。
    运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。
    调用对象的clone()方法。
    运用反序列化手段,调用java.io.ObjectInputStream对象的 readObject()方法。

  2. 下面选项中,哪些是interface中合法方法定义?(ACD)
    public void main(String [] args);
    private int getSum();
    boolean setFlag(Boolean [] test);
    public float get(int x);

接口中的方法默认是public static的;接口中的属性默认是public static final的

10.19

100个选择

  1. 使用java语言编写的源程序保存时的文件扩展名是 .java ,源程序编译后文件的扩展名是 .class
  2. 要构造ArrayList类的一个实例,此类继承了List接口,则实例化该类的正确方法是:List myList = new ArrayList();
  3. java中各个类型的初始值:
  • 整数的默认类型时int
  • 小数默认是double类型浮点型;
  • 在定义float类型时必须在数字后面跟上F或f; 否则会报错
类型初始值
byte0
short0
int0
long0L
float0.0f
double0.0d
char‘u0000’
String (or any object)null
booleanfalse
  1. java语言使用的字符码集是Unicode,每个Unicode码占用16个比特位,2个字节(一个字节占8位)。
  2. 抽象方法说法正确的是:是没有方法体的方法
  3. int x=-3; int y=-10; System.out.println(y%x);的输出结果是**(-1)**
    被除数决定了余数的正负
  4. 当编译单元中有public类时,每个编译单元(文件)都只能有一个public类,并且要求与文件名相同(包括大小写),否则无法编译;
    编译单元中可以没有public类,这种情况下可以任意命名你的文件名
  5. 三个类型转换函数了解:
Integer.parseInt(String s)  //将字符串解析为int类型数据
Integer.valueOf() //把int转换成Integer对象,返回给定参数的原生 Number 对象值,参数可以是原生数据类型, String等
Integer.intValue() //将一个Integer类型转换成原始类型int数据
  1. 为了使得一个包ch4在当前程序中可见,应当使用什么语句:用包语句导入需要的包 import ch4.*
  2. 属性可以是简单变量,也可以是一个对象
  3. this和super不能用在main()方法中。 main方法是静态的,静态方法中不能有this和super
  4. 接口之间可以有继承关系
  5. 对于已经被定义过可能抛出异常的语句,在编程时:必须使用try-catch语句处理异常,或用throws将其抛出
  6. 在面向对象的方法中,一个对象请求另一个对象为其服务的方式是发送(消息
    消息就是对象的成员函数(或者叫方法)。传递消息就是指一个对象调用另一个对象的方法的过程
  7. 临时性变量声明修饰符:transient;共享变量修饰符:volatile
  8. java.io包中定义的流类型来实习那输入和输出功能,可以从不同角度对其进行分类:
    按功能分为:节点流和处理流
    按方向分为:输入流和输出流
    按内容分为:字节流和字符流
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值