SCJP_104——题目分析(4)

14. which three are valid declaraction of a float? ADF
A. float foo=-1;

B. float foo=1.0;
C. float foo=42e1;
D. float foo=2.02f;
E.
float foo=3.03d;
F. float foo=0x0123;

这一题考的是 Java 的基本数据类型类型转换

在 Java 中规定,整数字面值默认为 int 类型,浮点数字面值默认为 double 类型。

A:-1 是 int 类型,可以自动转换成 float 类型。

B:1.0 是 double 类型,高位向低位转换,会丢失精度,Java 不允许这样的转换,除非进行强制转换。

C:42e1 是 double 了性,理由同上。

D:答案正确。

E:3.03d 是 double 类型。

F:0X0123 是整数291,会自动进行类型转换。

所以答案是:ADF


16.
1) public class Test{
2) public static void main(String args[]){

3) int i=0xFFFFFFF1;
4) int j=~i;
5)
6) }
7) }

which is decimal value of j at line 5? 
A. 0 B.1 C.14 D.-15 E.
compile error at line 3

这里考察的是 Java 中的进制转换位运算符

0xFFFFFFF1 是十六进制,转换成 2 进制是 1111 1111 1111 0001

同时 ~ 是取补码的运算,也就是 0 变 1,1 变 0,运算后的结果是 0000 0000 0000 1110,转换成 10 进制是 14。

所以正确答案是:C


17.
float f=4.2F;
Float g=new Float(4.2F);
Double d=new
Double(4.2);
Which are true?
A. f==g     B. g==g    
 C. d==f      D. d.equals(f)     E d.equals(g)
    F. g.equals(4.2);

这里考察了 Java 中的对象引用==equals 的知识点

f 表示 float 变量的名字,g 表示对象的引用,所以 f == g ,这样的比较是不合法的

g 是一个指向 Double 的引用,g == g,g 肯定是等于 g,所以正确。

d == f 和 f == g 类似,也是不合法的

equals,这里要注意,要和 == 区分开来,重点说明一下 == 和 equals 之间的区别

首先要说 Java 中的数据类型。在 Java 中有两种数据类型:基本数据类型和引用数据类型。

基本数据类型包括:

  byte、short、int、char、long、float、double、boolean

它们之间的比较应该用 == 进行比较,比较的是它们的值。

除了这 8 中基本数据类型以外的数据类型,都叫引用数据类型。所谓引用,就是内存中的地址。因为在 Java
中,为了安全,用一个类似指针的东西来指向存放数据的内存地址。所以对引用数据类型来说,当使用 == 进行比较的时候,比较的是内存中的地址。

所以,除非两个引用变量指向同一个内存地址,使用 == 进行比较才能得到 true,否则就是 false

Java 当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地
址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。

下面说几个例子,看看 equals 和 ==  区别

例子1:


public class TestString
{
public static void main(String[] args)
{
String s1 = "Monday";
String s2 = "Monday";

if (s1 == s2)
System.out.println("s1 == s2");
else
System.out.println("s1 != s2");
}
}

输出结果:

s1 == s2

在稍微改动下程序

例子2:


public class Test
{
public static void main(String args[])
{
String s3 = "Monday";
String s4 = new String("Monday");

if (s3 == s4)
{
System.out.println("s3 == s4");
}
else
{
System.out.println("s3 != s4");
}

if (s3.equals(s4))
System.out.println("s3 equals s4");
else
System.out.println("s3 not equals s4");
}
}

输出结果

s3 != s4
s3 equals s4

结果为什么会是这样?

这里涉及到了一个字符串缓存池的概念。

原来,程序在运行的时候,会创建一个字符串缓存池。当使用 String s2 = "Monday"
创建一个字符串的时候,程序首先会在字符串缓冲池中寻找相同值的对象。而之前已经创建了一个 s1 对象,所以在 s2 被创建的时候,程序找到了具有相同值的
s1。这样一来,s1 和 s2 就有了相同的地址。所以就有了例子 1 中的输出结果。

在例子 2 中,s4 使用了关键字 new,在内存开辟了一个空间用来存放 "Monday",s4 指向这个内存位置。所以结果就很明显了。

参考资料:http://www.cnblogs.com/jackyrong/archive/2006/08/20/481994.html

感谢参考资料作者的辛勤劳动

时间: 2024-10-13 11:42:26

SCJP_104——题目分析(4)的相关文章

SCJP_104——题目分析(5)

18. public class Test { public static void add3(Integer i) { int val=i.intvalue(); val+=3; i=new Integer(val); } public static void main(String args[]) { Integer i=new Integer(0); add3(i); System.out.println(i.intvalue()); } } what is the result? bA.

SCJP_104——题目分析(3)

11. what is reserved words in java?A. run B. default C. implement D. import Java 中,给标识符取名的时候,不能使用关键字和保留字. 在 Java 中常用的关键字有: 1.访问控制符: public.protected.private 2.数据类型 byte.short.int.long.float.double.char.boolean 3.与类.方法有关的 new.class.extends.implements.

SCJP_104——题目分析(2)

3. public class IfTest{ public static void main(String args[]){ int x=3; int y=1; if(x=y) System.out.println("Not equal"); else System.out.println("Equal"); } } what is the result? 这一题考察的是 if 语句.if 语句的写法如下: if (boolean expression) { st

SCJP_104——题目分析(1)

1.1) public class ReturnIt{2) returnType methodA(byte x, double y){3) return (short)x/y*2;4) }5) }what is valid returnType for methodA in line 2? 这一题考的是Java中的类型转换. 在这里,自需要看第(3)据代码就行了.分析以下这一行代码 (short)x / y * 2 这一行代码对 x 进行类型转换,将 byte 类型的 x 转换成 short 类

最长英文单词串题目分析

题目来源: 这是题目来源 序: 简述一下事情的经过 一天邹欣老师在群里向我提出了一个问题: "把这个题目分析一下,主要是从工程上考虑,假如50个学生提交了程序,你如何写一个测试的系统,判断对错,和测量学生程序的对错" 一.首先分析一下这道题的核心 "最长的能首尾相连的英语单词链,每个单词最多只能使用一次" 这里题目的描述有一点不明确,关于"最长",题目并没有给出详细定义. 因此可能有两种情况. 单词链中单词数最多 单词链中字符数最多 (看到这里我

MySQL索引题目分析

1.之前看视频呢的时候,里面提到一道索引题目:假设某个表有一个联合索引(c1,c2,c3,c4)-只能使用该联合索引的c1,c2,c3部分 a.where c1=x and c2=x and c4>x and c3=x b.where c1=x and c2=x and c4=x order by c3 c.where c1=x and c4=x group by c3,c2 d.where c1=? and c5=? order by c2,c3 e.where c1=? and c2=? a

3Sum 等类似题目分析

3Sum 题目描述:给定一个整数数组,找出其中的三个数之和为0的所有组合(排除相同的组合). 分析:利用TwoSum 中两指针的思路,我们可以先将数组排序.要找到3个数之和为0,我们可以先固定一个数num[i],将i+1和len-1分别作为头指针和尾指针,当num[i].num[i+1]与num[len-1]的和大于0时,移动尾指针:小于0时,移动头指针:等于0则找到一组数.在循环查找下一组解时,当下一个值与当前值相等会出现重复的解,此时可以跳过当前循环来去除重复.具体代码如下: 1 vecto

SCTF 2014 pwn题目分析

因为最近要去做ctf比赛的这一块所以就针对性的分析一下近些年的各大比赛的PWN题目.主防项目目前先搁置起来了,等比赛打完再去搞吧. 这次分析的是去年的SCTF的赛题,是我的学长们出的题,个人感觉还是很符合套路的:一道栈溢出.一道格式化字符串.一道堆溢出. pwn200 一个栈溢出. 题目给出了libc.保护只有nx. 拿到题后的基本思路就是leak出got表中函数的地址,然后拿libc算偏移算出system的地址.然后用这个地址去覆盖一个函数的got表. pwn300 一个明显的格式化字符串漏洞

二分查找总结及部分Lintcode题目分析 2

Search in a big sorted array,这个比之前的二分法模板多了一个很不同的特性,就是无法知道一个重要的条件end值,也是题目中强调的重点 The array is so big so that you can not get the length of the whole array directly~所以这里单独分析这个问题~ 一般涉及到sorted array,肯定可以的解决方法是for loop,然而for loop的复杂度是O(n),而且对于这个长度无法衡量的big