软构选择题及题解

考虑到学弟学妹们可能需要一些软构的习题,所以把我见过的一些题目放上来~

部分个人觉得比较有意义的题目加了一些解析,希望能帮助到学弟学妹~

单选题 第1题 1分
Integer a = new Integer(3);
Integer b = 3;
int c = 3;
System.out.println(a == b);
System.out.println(a == c);

控制台输出结果是?

A False; True
B False; False
C True; False
D True; False

正确答案:A
答案解析:

针对第四行,a和b是两个不同的object,在heap 中指向不同的地址,“==”判定对象等价性(将在3.5节继续讨论)。

这对第五行,a作为一个Integer对象,将会首先被auto-unboxing为一个int,然后再跟c比较。针对int类型的==,比较的是值。

单选题 第2题 1分
String a = "c";
String b = "c";
System.out.println("a and b: " + a == b);

控制台输出结果是?

A a and b: True
B a and b: False
C True
D False

正确答案:D
答案解析:

+的优先级比==要高,先计算两个字符串+,然后再跟b比较。

单选题 第3题 1分
public static void
	main(String args[]) {
		System.out.println(2.00 - 1.10);
}

 

控制台输出结果是?

A 0.9
B 0.90
C 不一定
D 以上都不是

正确答案:D
答案解析:

0.8999999999999999

自己查一下资料了解一下Java里如何处理double类型的数值

单选题 第4题 1分
List<Integer> list = new Arraylist<>();
for (int i = -3; i < 3; i++)
	list.add(i);
for (int i = 0; i < 3; i++)
	list.remove(i);
System.out.println(list);

A [-3, -2, -1]
B [-2, 0, 2]
C Throws exception
D 以上都不是

正确答案:B

单选题 第5题 1分
String s = " Hello";
s += " World";
s.trim();
System.out.println(s)

" Hello"
"Hello"
" Hello World"
"Hello World"

正确答案:C

单选题 第1题 1分

Memory dump属于软件三维度视图的____

A Build-time和code-level view
B Run-time和moment view
C Run-time和moment view
D Moment和component-level view

正确答案:C

单选题 第2题 1分

Execution stack trace和code snapshot在软件三维度视图中的共性特征是____

A 都是moment view
B 都是component-level
C 都是run-time view
D 无共性

正确答案:C

单选题 第3题 1分

Code Churn 和 AST分别是____的视图

A Code-level, Run-time
B Build-time, Period
C Component-level, Code-level
D Period, Build-time

正确答案:D

多选题 第4题 2分

Static linking和Dynamic linking的区别在于____

A 前者发生在构造阶段,后者发生在运行阶段
B 前者的软件运行时需要库文件,后者不需要
C 同样的源代码,经过前者产生的代码尺寸比后者的要小
D 二者都是试图把外部库文化和开发者的代码链接在一起形成可执行文件

正确答案:A

多选题 第6题 2分

以下说法正确的是____

A Code static analysis是发生在build-time
B Deployment是把build-time的软件转换为run-time的软件的手段之一
C Files随时间发生变化,产生各个不同版本,按时间连起来形成period view
D 对软件的profiling和tracing均发生在run-time

正确答案:ABCD

1.2 软件构造的质量指标

多选题 第1题 2分

以下___是软件构造的external quality factors?

A Correctness 正确性
B Extendibility 可扩展性
C Reusability 可复用性
D Ease of use 易用性
E Complexity 代码复杂度
F Understandability 代码可理解性

正确答案:ABCD

单选题 第2题 1分

关于软件构造的质量指标,以下说法不正确的是____

A 健壮性刻画了软件能够恰当的处理spec范围之外的各类异常情况的能力
B 各项质量指标的优先级是等价的,在软件构造过程中要对它们做出全面优化
C 代码行数LoC是内部质量指标之一,但它可能对多项外部质量指标产生影响
D 程序的可复用性与程序的开发代价/运行效率直接存在折中

正确答案:B

多选题 第3题 1分

Correctness和Robustness的区别在于___

A 前者针对“需求”的正确实现,后者针对“需求”之外的其他情况的恰当实现
B 如果某函数输入参数应该是(0,100]范围的整数,当用户输入-1时,此为前者应考虑的内容。
C 如果某函数的返回值应该是(0,100]范围的整数,当程序输出-1时,此为后者应考虑的内容。
D 一个100%正确的程序一定是100%健壮,反之亦然。

正确答案:A

单选题 第4题 1分

说法不正确的是___

A LoC和code complexity很高,并不代表一定有很差的reusability和extendibility
B 对代码的时间/空间复杂度进行优化,可能带来其他external quality factors的降低
C 每向软件里增加一点功能,都要确保其他质量属性不受到损失
D 健壮性是唯一不能与其他质量指标进行tradeoff的质量指标

正确答案:D

多选题 第5题 2分

HIT CS32207 关注的软件构造质量指标包括___

A Ready to change
B Safe from bugs
C Easy to understand
D Efficient to run
E Cheap for develop
F Easy to extend

正确答案:ABCDEF

填空题 第1题 4分

WordList有四个方法,根据其方法定义来确定其类型

1. public WordList(List<String> words)
2. public void unique()
3. public WordList getCapitalized()
4. public Map<String, Integer> getFrequencies()
  • 1
  • 2
  • 3
  • 4

使用C、M、P、O分别表示Creator, Mutator, Producer, Observer

1 [填空1] 2 [填空2]
3 [填空3] 4 [填空4]

正确答案:
C;M;P;O

单选题 第2题 1分

以下关于ADT的RI和AF的说法,不正确的是___

A ADT的Abstract空间(A)中的某个值,在其Rep空间®中可能有多个值与其对应
B 若ADT的某个方法返回一个mutable的对象,并不一定表明该ADT产生了表示泄露
C 若ADT的任意costructor所构造出的object都满足RI、每个mutator方法执行结束后都保持RI为真,那么该ADT的RI就始终为真
D 一个immutable的ADT,其rep可以是mutable的

正确答案:C
答案解析:

针对B选项:通过defensive copy返回mutable对象,其实并未产生表示泄露

针对C选项:如果存在表示泄露,外部client就可以修改内部rep的值,就可能导致RI违反。

针对D选项:of course,只要没有rep exposure就没有问题。

多选题 第3题 2分

关于invariants、AF和RI,说法不正确的是__

A 如果一个immutable的ADT存在rep exposure,那么就违反了该ADT的invariants
B 如果在一个mutator方法内没有checkRep(),那么RI就可能被违反了
C 两个ADT有相同的rep和相同的AF,那么其RI一定相同
D 两个ADT有相同的rep和相同的RI,但可能AF不同

正确答案:C
答案解析:

针对A选项:immutability也是invariants的一部分,产生表示泄露就可能导致内部rep被修改,于是就不能保证immutable了,invariants就被违反了。

多选题 第4题 2分

用于检查ADT的Rep Invariants是否保持为真的checkRep()最好应该以下__类型的方法结束前调用。

A Mutator
B Creator
C Producer
D Observer

正确答案:ABCD
答案解析:

针对D选项:虽然observer方法不改变rep,但还是强烈建议return之前要checkRep()

多选题 第5题 2分
class C {
	private String s;
	private String t;
	...
}

 

它的可能的Rep Invariants会是__

A s contains only letters
B s.length() == t.length()
C s is the reverse of t
D s represents a set of characters

正确答案:ABC

多选题 第6题 2分

ADT的某个方法的spec需要以注释的形式放在代码中,在撰写这部分spec的时候,不能用到的信息包括__

A Parameters of operation
B Data type of return values of the operation
C Exceptions thrown by the operation
D Mathematical values in the Rep space ®
E Mathematical values in the Abstract space (A)

正确答案:D
答案解析:

Spec要给client看,那么所有内部的东西都不能用。R是rep的值空间,只能开发者自己了解。

多选题 第7题 2分

在对ADT的方法进行JUnit测试时,以下说法正确的是____

A 如果某方法的返回值为void,则无法为其撰写测试用例,因为无法assertEquals()
B 对constructor方法,测试用例中需要在构造新对象之后调用observer方法确认构造结果是否正确
C 对mutator方法,测试用例中需要在该方法执行之后调用producer方法确认是否做了正确的mutate
D 对observer方法,测试用例中需要使用其他三类方法构造一个对象,再执行该方法并判断结果是否正确

正确答案:BD

多选题 第8题 2分

以下说法不正确的是__

A 只要有public的field,就一定有表示泄露
B 只要有 非final的field,就一定产生表示泄露
C 除了初始化,Immutable的类中一定不能存在其他任何改变rep的方法
checkRep()方法可能消耗大量计算,在程序投入实际运行的时候要注释掉

正确答案:BC
答案解析:

针对A选项:sure,所以迫不得已千万不要用public

针对B选项:final是来支持immutable的,与是否存在表示泄露无直接关系

针对C选项:可以有beneficent mutation

针对D选项:assert语句在投入真正运行的程序中是没有意义的,需要注释掉。当然,前提是开发者利用checkRep()已经发现了所有违反RI的bug并修复了。

多选题 第9题 3分

针对你设计的一个ADT,不应该提供给client看的内容包括__
A AF
B RI
C Rep exposure safety argument
D Spec
E Testing strategy
F Rep
G Implementation
H Test cases

正确答案:ABCEFGH

多选题 第1题 2分

关于staticfinal的说法,正确的是____

A 一个变量被声明为final,意味着它在被首次赋值之后,其内容就不能再变化
B static类型的方法,调用时无需创建类的实例对象,可直接通过类名使用
C 被声明为final类型的类,无法从中派生出子类
D 被声明为final类型的方法,无法在子类中被override
E 类A的static方法中不能直接调用A的instance方法(而是要new一个A的对象再调用);A的instance方法中可以直接调用A的static方法

正确答案:BCDE

多选题 第2题 2分

关于Java interface的说法,正确的是__

A 不能有static方法
B 不能有constructor(构造器)
C 不能有final方法
D 不能有private方法
E 不能有fields(属性)

正确答案:BCD
答案解析:

E选项:可以有属性的,都是public static final的。

多选题 第3题 2分

关于class和interface的说法,不正确的是____

A 一个接口可以extends一个或多个其他接口
B 一个类只能implements一个接口
C 一个类不能同时extends另一个类和implements一个接口
D 一个类implements了一个接口,意味着它必须要实现该接口中的所有方法
E 一个类除了实现其implements的接口中的方法,还可以增加新的方法

正确答案:BC

单选题 第4题 1分

某方法的定义是public int getLength (List<String> list, boolean bFliter),以下___不是对该方法的合法重载

private int getLength(List<String> list, String regex)
public Integer getLength(List<String> list)
public int getLength(List<String> list) throws IOException
public void getLength(List<Object> list, boolean bFliter)

正确答案:D

多选题 第5题 2分

关于Java OOPoverrideoverload的异同,以下说法不正确的是_____

A 前者的参数列表不能改变,后者的参数列表必须发生变化
B 前者的返回值类型不可变化,后者的返回值类型可以变化
C 前者抛出的异常可以变化,后者抛出的异常不能变化
D 前者的类型检查发生在run-time,后者的类型检查发生在compile-time
E 在子类里override父类方法时,方法前面必须使用@override;overload父类方法时,无需使用annotation

正确答案:CE
答案解析:

E选项:@override不是必需的,但是强烈建议使用,可以帮助开发者理解方法的“源头”

多选题 第6题 2分
class Car {
	public String refuel()
	{ return "R"; }
}
class Tesla extends Car {
	public String refuel() {return "C";}
	public String refuel(double price)
	{ return "P"; }
}

无法通过static type checking的是__

A

Car c = new Car();
c.refuel(10);

 

B

Car c = new Tesla();
c.refuel();

 

C

Car c = new Tesla();
c.refuel(10);

D

Tesla t = Tesla();
t.refuel(10);

正确答案:AC
答案解析:

Overload由static type checking负责

多选题 第7题 2分
class Car {
	public String refuel()
	{ return "R"; }
}
class Tesla extends Car {
	public String refuel() {return "C";}
	public String refuel(double price)
	{ return "P"; }
}

能获取内容为“C”的字符串是__

A

Car c = new Car();
c.refuel();
  • 1
  • 2

B

Car c = new Tesla();
c.refuel();

C

Car c = new Car();
((Tesla) c).refuel();

D

Tesla t = Tesla();
t.refuel();

正确答案:BD
答案解析:

Override在run-time做dynamic checking

单选题 第8题 1分

类A和B,B extends A,二者分别有一个apply(A a)方法,具有不同的返回值类型。
假如

A a = new A();
B b = new B();

那么以下正确的是__

b.apply(a)((B) b).apply(a)不等价
b.apply(a)((A) b).apply(a)不等价
b.apply(a)((B) b).apply((B) a)不等价
b.apply(a)((B) b).apply((A) a)不等价

正确答案:C
答案解析:

选项A:将b强转为(B)b,等于没转,b的类型本来就是B
选项D:也是类似的,两个强转都是没转

选项B:B是A的子类,所以b必然是A的实例,所以将b转成A(b),本质上还是等价的。

选项C:将a转(B) a,这个乡下强转做不到,该强转将会在运行时抛出异常ClassCastException。

单选题 第9题 1分

关于OOP polymorphism(多态)的各选项中,___不是同义词

A Ad hoc polymorphism 和 function overloading
B Parametric polymorphism 和 generics(泛型)
C Subtype polymorphism 和 inclusion polymorphism
D Generics和overriding

正确答案:D

3.5 Equality

填空题 第1题 3分

ADT的equals()需满足的三个性质是 [填空1] 性、[填空2] 性、 [填空3] 性

请填写中文

正确答案:
自反;对称;传递

多选题 第2题 2分

以下针对ADT等价性的说法,不正确的是____

A 如果对象a和b的R值被AF映射到相同的A值,则a和b等价
B 对对象a和b调用任何相同的方法,都会得到相同的返回值,则它们是等价的
C 对象a和b不等价,那么该ADT中不应存在任何方法op使得a.op()=b.op()
D 对象a和b是等价的,那么a和b的rep中每个field的值也一定是相等的

正确答案:CD
答案解析:

A选项是从AF的角度判断等价性。

B选项是从外部观察者的角度来判断等价性。

C选项:是可以存在这样的操作的。
即使这个操作返回相同的结果,该ADT还应有其他操作会让a和b执行后的结果不同。

填空题 第3题 2分

Java中有两种不同的操作来验证对象的等价性,分别为==和equals(),它们的“学名”是 [填空1] 等价性和 [填空2] 等价性。

请填写中文

正确答案:
引用;对象

单选题 第4题 1分

某个ADT的Rep是:

private int no;
private String name;

它的AF是:
AF(no) == ID of a student
那么以下equals()正确的是__

A return this.no == that.no
B return this.no == that.no && this.name == that.name
C return this.no == that.no && this.name.equals(that.name)
D return this.name.equals(that.name)

正确答案:A

填空题 第5题 2分

针对mutable的Java类,有两种等价性,分别为 [填空1] 等价性和 [填空2] 等价性。

请填写中文

正确答案:
观察;行为

单选题 第6题 1分

以下关于的等价性的说法,不正确的是____

object类缺省的equals()是判断两个对象内存地址是否相等
B 若a和b满足a.equals(b)为真,那么a.hashCode() == b.hashCode()也应为真
C 若a.equals(b)为假,那么a.hashCode() == b.hashCode()可以为真
D 针对mutable的类,由于其rep在变化,直接使用==判断是否相等即可,无需override equals()

正确答案:D
答案解析:

D选项:这要取决于实际需求。例如Java中List和Date等mutable的类,都override了equals()方法,实现观察等价性。

多选题 第7题 2分

关于hashCode()的说法,不正确的是__

B 具有相同hashCode()返回值的两个对象ab,必须做到a.equals(b)为真
C 若hashCode()始终返回同一个值,则违反了ObjecthashCode()的要求
D 如果不override hashCode()方法,Object类缺省实现也可以满足要求
E 一个对象实例的hashCode()返回值,在其生命周期内可以发生变化

正确答案:BCD
答案解析:

针对C选项:还是要看需求是什么,不能一概而论

针对D选项:mutable对象的hashCode在其mutator方法执行后,就会发生变化,因此在hash table中的位置也可能随之发生变化。

单选题 第8题 1分
Date d = new Date(2019,4,1);
Set<Date> hs = new HashSet<>();
Set<Date> ts = new TreeSet<>();
hs.add(d);
ts.add(d);

d.setYear(2020);

println(hs.contains(d));
println(ts.contains(d));

该代码执行之后会打印出____

A True; True
B True; False
C False; True
D False; False

正确答案:C
答案解析:

haahCode,顾名思义…

mutable对象的hashCode变化之后,只会影响受hashSet,不会影响TreeSet

单选题 第9题 1分
Date d = new Date(2019,4,1);
Date f = new Date(2019,4,1);

List<Date> al=new ArrayList<>();
List<Date> ll=new LinkedList<>();

al.add(d);
ll.add(f);

println(d.equals(f));
println(al.equals(ll));

 

该代码执行之后输出的是____

A True; True
B True; False
C False; True
D False; False

正确答案:A
答案解析:

Date是mutable的,它实现的是观察等价性,所以d和f两个值等价。

List也是mutable的,实现的也是观察等价性,所以判断其中每个元素的等价性,而d与f是等价的,故al和ll也是等价的。这个跟具体的类型(ArrayList和LinkedList)无关。

posted @   926535L  阅读(65)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示