10.2
- 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][];
分析:
二维数组定义,一维长度必须定义,二维可以后续定义
- 关于多线程和多进程,下面描述正确的是(AC):
多进程里,子进程可获得父进程的所有堆和栈的数据;而线程会与同进程的其他线程共享数据,拥有自己的栈空间。
线程因为有自己的独立栈空间且共享数据,所有执行的开销相对较大,同时不利于资源管理和保护。
线程的通信速度更快,切换更快,因为他们在同一地址空间内。
一个线程可以属于多个进程。 - 一个文件中的字符要写到另一个文件中,首先需要(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
- 有以下代码片段:
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
+号拼接字符串时会创建一个新对象再返回
- 检查程序,是否存在问题,如果存在指出问题所在,如果不存在,说明输出结果。(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 没有返回值,所以最后打印出的内容还是原来的内容拼接
- 以下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
- 下面哪些具体实现类可以用于存储键,值对,并且方法调用提供了基本的多线程安全支持:( AE )
java.util.ConcurrentHashMap
java.util.Map
java.util.TreeMap
java.util.SortMap
java.util.Hashtable
java.util.HashMap - 为AB类的一个无形式参数无返回值的方法method书写方法头,可以用AB.method()方式调用,该方法头的形式为( A )
static void method( )
public void method( )
final void method( )
abstract void method( )
分析:
可以用类名.方法调用的,应该定义为静态的方法
- 使用mvc模式设计的web应用程序具有以下优点,除了(D)
可维护行强
可扩展性强
代码重复少
大大减少代码量
分析:一般设计模式都会增加代码量
- 以下哪几种方式可用来实现线程间通知和唤醒:( 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()这种方式实现线程间协作更加安全和高效。
- 关于Java中的数组,下面的一些描述,哪些描述是准确的:( ACF )
数组是一个对象,不同类型的数组具有不同的类
数组长度是可以动态调整的
数组是一个连续的存储结构
一个固定长度的数组可类似这样定义: int array[100]
两个数组用equals方法比较时,会逐个便利其中的元素,对每个元素进行比较
可以二维数组,且可以有多维数组,都是在Java中合法的
分析:
A选项,jvm会在运行时动态生成数组类,然后实例化,不同类型的数组当然是不同的类。
B 数组的长度是固定的
D 数组的长度是固定的,int[] array =new int[100]就对了
E 数组是一种引用数据类型,所以肯定是继承自Object类的,所以里面有equals()方法,但是没有被重写过。因此Object.equals()比较的是两个数组的地址,相当于==的作用;如果是遍历数组中的元素,进行一一比较,应该选择Arrays.equals()
- 执行下列程序的输出结果为( 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
- volatile关键字的说法错误的是(A)
能保证线程安全
volatile关键字用在多线程同步中,可保证读取的可见性
JVM保证从主内存加载到线程工作内存的值是最新的
volatile能禁止进行指令重排序
错误原因:分析题意错误,问的是错误的是哪一项!!!
volatile不能保证线程的安全
- 给出以下代码,请给出结果(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
正确的复习知识,错误的反思总结。
-
java中创建对象有以下几种方法:
1.用new语句创建对象,这是最常用的创建对象的方式。
2.运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。
3.调用对象的clone()方法。
4.运用反序列化手段,调用java.io.ObjectInputStream对象的readObject()方法. -
final的基本规则:
final修饰的类不能被继承;
final修饰的成员变量只能赋值一次,可以在类方法中赋值,也可以在声明的时候直接赋值;
final修饰的局部变量即为常量,只能赋值一次;
final修饰的方法不允许被子类覆盖; -
关于以下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
拓展知识:在类中定义的{}之间被称为构造块,构造块相对于构造方法先执行,构造块之间按照代码编译顺序执行。
- 运用下列哪个命令能够获取JVM的内存映像 ( B )
jinfo
jmap
jhat
jstat
1、jps:查看本机java进程信息。
2、jstack:打印线程的栈信息,制作线程dump文件。
3、jmap:打印内存映射,制作堆dump文件
4、jstat:性能监控工具
5、jhat:内存分析工具
6、jconsole:简易的可视化控制台
7、jvisualvm:功能强大的控制台
- 以下程序输出(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
-
^
表示异或 就是相同是0 不同是1;
按位或|
按位且&
按位取反~
左移<<:补0,相当于乘以2
右移>>:补符号位(无符号补0),相当于除以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错;
-
下面有关JVM内存,说法错误的是?(C)
程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行到了第几行,是线程隔离的
虚拟机栈描述的是Java方法执行的内存模型,用于存储局部变量,操作数栈,动态链接,方法出口等信息,是线程隔离的
方法区用于存储JVM加载的类信息、常量、静态变量、以及编译器编译后的代码等数据,是线程隔离的
原则上讲,所有的对象都在堆区上分配内存,是线程之间共享的 -
一个容器类数据结构,读写平均,使用锁机制保证线程安全。如果要综合提高该数据结构的访问性能,最好的办法是___分区段加锁___。
-
抛InterruptedException的代表方法有:
java.lang.Object 类的 wait 方法
java.lang.Thread 类的 sleep 方法
java.lang.Thread 类的 join 方法 -
ArrayLists和LinkedList的区别,下述说法正确的有?(ABCD)
ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要迭代器。
对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。
ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间。 -
下面有关java类加载器,说法正确的是?(ABCD)
引导类加载器(bootstrap class loader):它用来加载 Java 的核心库,是用原生代码来实现的
扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。
系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类
tomcat为每个App创建一个Loader,里面保存着此WebApp的ClassLoader。需要加载WebApp下的类时,就取出ClassLoader来使用 -
以下说法中正确的有?(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。
- 以下哪些类是线程安全的(ADE)
Vector
HashMap
ArrayList
StringBuffer
Properties
Properties实现了Map接口,是线程安全的;
- 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精度丢失,错误;
- 以下说法哪个是正确的(ABCD)***
IOException在编译时会被发现
NullPointerEception在编译时不被发现
SQLException在编译时会被发现
FileNotFoundException在编译时会被发现
编译时能被发现的是必须加上try catch的异常,这些异常在编译时可以被发现
Java的异常分为两种,一种是运行时异常(RuntimeException),一种是非运行异常也叫检查式异常(CheckedException)。
- 运行时异常不需要程序员去处理,当异常出现时,JVM会帮助处理。常见的运行时异常有:
ClassCastException(类转换异常)
ClassNotFoundException
IndexOutOfBoundsException(数组越界异常)
NullPointerException(空指针异常)
ArrayStoreException(数组存储异常,即数组存储类型不一致)
还有IO操作的BufferOverflowException异常 - 非运行异常需要程序员手动去捕获或者抛出异常进行显示的处理,因为Java认为Checked异常都是可以被修复的异常。常见的异常有:
IOException
SqlException
10.18
- 一个类的构造器不能调用这个类中的其他构造器。(× )
this()和super()都是构造器,this()调用本类构造器,super()调用父类构造器
-
java中可以将布尔值与整数进行比较吗(不可以)
-
java的跨平台特性表述:“一次编译,到处运行”。java程序运行在JVM上,而JVM上屏蔽了底层操作系统的差异,即跨平台的特性主要体现在JVM虚拟机上
-
一个Java源程序文件中定义几个类和接口,则编译该文件后生成几个以.class为后缀的字节码文件 (√)
-
下面字段声明中哪一个在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修饰的
- 有一个源代码,只包含import java.util.* ; 这一个import语句,下面叙述正确的是? ( C )
只能写在源代码的第一句
可以访问java/util目录下及其子目录下的所有类
能访问java/util目录下的所有类,不能访问java/util子目录下的所有类
编译错误
导入java.util.*不能读取其子目录的类,因为如果java.util里面有个a类,java.util.regex里面也有个a类,我们若是要调用a类的方法或属性时,应该使用哪个a类呢
- 下面代码将输出什么内容:(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
-
已知x >= y and y >= z 为真,那么x > z or y = z 值为(C)
真
假
无法确定
x y z同为正数时为真 -
在根类Object中包含一下方法:
clone();
equals();
finalize();
getClass();[align=left][/align]
notify(),notifyAll();
hashCode();
toString();
wait(); -
下面有关Java的说法正确的是( ACDF )
一个类可以实现多个接口
抽象类必须有抽象方法
protected成员在子类可见性可以修改
通过super可以调用父类构造函数
final的成员方法实现中只能读取类的成员变量
String是不可修改的,且java运行环境中对string对象有一个常量池保存
C项:子类继承父类的方法,访问权限可以相同或往大了改 ,对
E项:final修饰的方法不能被重写;static修饰的方法才只能访问类的成员变量
- 下列有关java构造函数叙述正确的是(CD)
构造器的返回值为void类型
如果一个源文件中有多个类,那么构造器必须与公共类同名
构造器可以有0个,1个或一个以上的参数
每个类可以有一个以上的构造器
错因:误选B,B项中当一个源文件中有多个类时,构造器(构造方法)不一定与公共类同名,每个类都可以有自己的构造函数,函数名与自己的类名相同即可
- 面哪些Java中的流对象是字节流?(ABCD)
FileInputStream
BufferedInputStream
PushbackInputStream
ByteArrayInputStream
Stream结尾的都是字节流;
Reader和Writer结尾都是字符流
两者的区别:字节流读写的时候按字节读写;字符流读写的时候按字符读写
-
Java创建对象的说法正确的有(ABCD)
用new语句创建对象,是最常见的创建对象的方法。
运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。
调用对象的clone()方法。
运用反序列化手段,调用java.io.ObjectInputStream对象的 readObject()方法。 -
下面选项中,哪些是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个选择
- 使用java语言编写的源程序保存时的文件扩展名是 .java ,源程序编译后文件的扩展名是 .class
- 要构造ArrayList类的一个实例,此类继承了List接口,则实例化该类的正确方法是:List myList = new ArrayList();
- java中各个类型的初始值:
- 整数的默认类型时int
- 小数默认是double类型浮点型;
- 在定义float类型时必须在数字后面跟上F或f; 否则会报错
类型 | 初始值 |
---|---|
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
char | ‘u0000’ |
String (or any object) | null |
boolean | false |
- java语言使用的字符码集是Unicode,每个Unicode码占用16个比特位,2个字节(一个字节占8位)。
- 抽象方法说法正确的是:是没有方法体的方法
- int x=-3; int y=-10; System.out.println(y%x);的输出结果是**(-1)**
被除数决定了余数的正负 - 当编译单元中有public类时,每个编译单元(文件)都只能有一个public类,并且要求与文件名相同(包括大小写),否则无法编译;
编译单元中可以没有public类,这种情况下可以任意命名你的文件名 - 三个类型转换函数了解:
Integer.parseInt(String s) //将字符串解析为int类型数据
Integer.valueOf() //把int转换成Integer对象,返回给定参数的原生 Number 对象值,参数可以是原生数据类型, String等
Integer.intValue() //将一个Integer类型转换成原始类型int数据
- 为了使得一个包ch4在当前程序中可见,应当使用什么语句:用包语句导入需要的包 import ch4.*
- 属性可以是简单变量,也可以是一个对象
- this和super不能用在main()方法中。 main方法是静态的,静态方法中不能有this和super
- 接口之间可以有继承关系
- 对于已经被定义过可能抛出异常的语句,在编程时:必须使用try-catch语句处理异常,或用throws将其抛出
- 在面向对象的方法中,一个对象请求另一个对象为其服务的方式是发送(消息)
消息就是对象的成员函数(或者叫方法)。传递消息就是指一个对象调用另一个对象的方法的过程 - 临时性变量声明修饰符:transient;共享变量修饰符:volatile
- java.io包中定义的流类型来实习那输入和输出功能,可以从不同角度对其进行分类:
按功能分为:节点流和处理流
按方向分为:输入流和输出流
按内容分为:字节流和字符流