黑马程序员技术交流社区

标题: 两段代码遇到的问题。 [打印本页]

作者: 王德升    时间: 2012-6-24 18:56
标题: 两段代码遇到的问题。
本帖最后由 王德升 于 2012-6-30 10:19 编辑

import java.util.*;
import java.io.*;

class PropertiesDemo
{
        public static void main(String[] args)
        {
                setAndGet();
        }

        public static void setAndGet()
        {
                Properties prop = new Properties();
        
                prop.setProperty("zhangsan","33");

                prop.setProperty("wangwu","22");

                //System.out.println(prop);

                String value = prop.getProperty("wangwu");
                Object obj = prop.setProperty("wangwu","99");
        
                System.out.println(obj);//怎么这里打印出来还是22呢?
               

                //System.out.println(value);

                Set<String> names = prop.stringPropertyNames();

                for(String s : names)
                {
                        System.out.println(s+":"+prop.getProperty(s));//为什么这里打印出来时99?
                }
        }
}


第二段代码:
class A
{
        public static void main(String[] args)
        {
                toHex(9);
        }
}

public static void toHex(int num)
        {
                char[] chs = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
               
                char[] arr = new char[8];
                int pos = arr.length;

                while(num!=0)//这里为什么要定义num!=0呢?
                {
                        int temp = num & 15;
                        
                        arr[--pos] = chs[temp];//这里pos的自减。

                        num = num >>> 4;

                System.out.println("pos="+pos);

                for(int x=pos;x<arr.length; x++)//这里x的范围。
                {
                        System.out.print(arr[x]+",");
                }

        }
}

老毕说的什么反过来,听的我头晕啊。麻烦大仙把这思路给我理下。谢谢了。
作者: 陈嘉宾    时间: 2012-6-24 19:13
本帖最后由 陈嘉宾 于 2012-6-24 19:23 编辑

第一个问题object接受了 String value = prop.getProperty的get方法所以打印的是22,你要set了obj也要有get方法啊,下面打印你的obj方法覆盖了  prop.setProperty("wangwu","22");
打印出来的就是zhangsan:33
wangwu:99

while(num!=0)//这里为什么要定义num!=0呢?。代表一个判断,取有效位,num碰到0就不执行了
作者: 耿鑫    时间: 2012-6-24 19:30
首先明确set.property()方法的返回值是什么,从API上可以看出它返回的是set之前的旧值,要是以前没有值的话就返回空,所以 Object obj = prop.setProperty("wangwu","99");返回的是以前wangwu对应的value值

第二个问题 要知道底层数字在内存中的存在形式是字节码形式比如0000-0000-0000-0000-0000-0000-0000-0110表示的就是十进制的6,要转换成16进制运算你就要移位,你不停的往右移,总有时候数字会变成0,0的时候你还往右移不是浪费时间吗?所以前面要判断num!=0是为了节省时间,,不加也可以的
作者: 邱国    时间: 2012-6-24 19:58


由java的api可以看出,set.property()方法返回的是   set之前的旧值,,注意了是旧的值,所以Object obj = prop.setProperty("wangwu","99");,这个obj返回的是旧的值,而新的值99在这句代码之后,已经放进了表中了,
lz可以用一个  String value2 = prop.getProperty("wangwu");  来返回wangwu的值,这个value2值就是99了
注意看api文档,可以减少很多麻烦


作者: 陈淑飞    时间: 2012-6-24 20:28
本帖最后由 陈淑飞 于 2012-6-24 20:30 编辑

一、

你能打印出来22?虽然没验证你的代码,但我表示怀疑。obj是Object对象的引用,是一块内存地址。你打印出来22?
二、

num!=0 是 while 循环终止条件, 0000-0000-0000-0000-0000-0000-0011-1100 表示十进制60的 二进制表示法。
1. 通过循环几次移位,就可移完搞定出各个16位进制的数呢。 当然两次循环就可以搞定这个60了。为了提高效率是不是要判断下,当循环N次后,有效数字num是不要要继续循环呢。所以啊,要写num!=0啊。

2.arr[--pos] = chs[temp];//这里pos的自减。搞个指针出来 完全是为了后面方便打印,比如上面的60,可直接打印出来3c。
通过循环外面pos被初始化为 arr.length就是8啦。那么第一次进循环体是,当然必须得先自减喽,arr[7],先把最低4位的4位二进制干掉转成一位十六进制。然后num再向右移4位后赋给给num,循环条件判断移位后num是否是0了。接着搞定下面的arr[6]了。....

3.for(int x=pos;x<arr.length; x++)//这里x的范围。 x初始化的值当然必须是pos啊,不然你想从x=0开始啊,whil循环中没赋值到的arr[1]..arr[5]默认0打印出来有意义吗? 为什么是pos,你可以读下循环体嘛。当循环结束时,pos指针指向了哪,拿上面的60来说吧。是不是pos被赋到了6啊,是不是最后一个被右移的有效十六进制啊。
所以啊,这里x,是不是只打印有效的16进制位啊。
这样写不就大大提高效率了啊。


作者: 王德升    时间: 2012-6-24 20:54
陈淑飞 发表于 2012-6-24 20:28
一、

你能打印出来22?虽然没验证你的代码,但我表示怀疑。obj是Object对象的引用,是一块内存地址。你打 ...

谢谢!   知道了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2