咖啡伴侣

呆在上海
posts - 163, comments - 156, trackbacks - 0, articles - 2

如果两个对象equal,那么它们的hashCode值一定要相同;2、如果两个对象的hashCode相同,它们并不一定equal

当Set要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。如果这个位置上没有元素,它就可以直接存储在 这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。

所以两个不equal的对象,有相同的hash,是可以存进Set的。

class HashNode {
    int id;
   
    public HashNode(int id){
        this.id = id;
    }
   
    public int hashCode() {
        return id;
    }
   
    public boolean equals(Object obj) {
        return false;
    }
}

public class HashTest {

    public static void main(String[] args) {
        HashNode n1 = new HashNode(1);
        HashNode n2 = new HashNode(1);
       
        HashMap map = new HashMap();
        map.put(n1, "111");
        map.put(n2, "222");
       
        System.out.println(n1.equals(n2));
        System.out.println(n1.hashCode() == n2.hashCode());
        System.out.println(map.keySet().size());
    }

}

posted @ 2010-03-03 16:03 oathleo 阅读(1673) | 评论 (4)编辑 收藏

很长一段时间,对MVC和MVP区别很是模糊。
一直忙碌于客户不停的需求中,忽略了产品本身上这些最重要的东西。
现在即将待业,放下自己为之工作近三年的产品,真的感觉犹如失去自己的孩子。
好的一方面是空闲的时间多了,终于可以想想这些事情了。

MVC算是个被人说烂掉的东西了,MVP也屡屡被人提及。
最大的区别在哪里呢?为什么要再演变个MVP出来呢?

就定义上来说最大的区别在于C和P,就构架上来说,是View层实现的方式不同。
MVC:View层肩负很大任务,View关联Model,View的渲染是直接通过Model层的数据来确定的。还是有很多业务逻辑在View上完成。
MVP:View层的任务大大缩减,View不再知道Model,P层完成上面提到的View层完成的业务逻辑。
总之一句话MVP里,View层绝对不能再访问Model了,

任何一种设计模式的出现绝对不是为了出现而出现的。总是为了解决现实中存在的某些老的模式无法或难以解决的问题才出现的。

为什么会出现MVP呢?
看看客户拿到一个设计精良的MVC的产品,做二次开发的时候,如果他项目足够大,肯定会发现MVC的好处。任务集中在Model层,设计好Model层数据的填充,简单的实现就完成了。MVC的架构帮他解决了很多问题,大家很Happy!
当然客户的需求总是永无止境的,当简单需求被满足的时候,他又会往高层次发展,也许他就完全需要不同的View来做同样的Model的展示(比如一个在JSP,一个在Swing或者Android上),在这个时候,稍微想下,他就发现他要做的任务开始变的很大了。Model层的数据纵使可以共享,事件控制(转发)也能,而View层无论如何是逃不了了。于是Web程序员硬着头皮也要学Swing,Swing的程序员郁闷的学JSP。
试想这个时候如果有个人,能把陷在View上的上万行code,拉到一个即能联系到Model,又能联系到View的层次上,那真的要感谢苍天大地了。

MVP我想应该就是在这个时候出现的。它处理所有View和Model之间的消息传递,数据更新,交互操作。比如从Swing的TextField里输入个字段信息,和从JSP里的Form里输入这个字段信息,处理的流程应该是可以共享这段代码的。当然这个时候,为了解决不同View上的一些特殊情况,可以使用适配器模式,来处理多个View的程序设计问题。

设计模式没有好坏之分,只有合不合适。你的产品如果只需要输入个A返回个B,没有平台建议,没有系统升级,那就忘了所有的设计模式,走那条最快实现的路吧。

posted @ 2010-02-28 15:38 oathleo 阅读(2841) | 评论 (6)编辑 收藏




posted @ 2010-02-22 18:03 oathleo 阅读(1500) | 评论 (4)编辑 收藏

Android线程安全问题:

      button2.setOnClickListener(new OnClickListener() {
           ......
     });
加了个监听,里面起Timer,定时修改数据。
发现Log一直在打,View无变化。
估计线程出了问题。类似Swing的线程安全问题。
接着Google.....


The best thing is to  use Handler with delayed messages.
And Timer works fine, the problem is that a Timer runs in a separate thread,   and so you are trying to modify a view owned by another thread (the main   thread that originally created it).

What I think is happening is you're falling off the UI thread. There is a single "looper" thread which handles all screen updates. If you attempt to call "invalidate()" and you're not on this thread nothing will happen.

Try using "postInvalidate()" on your view instead. It'll let you update a view when you're not in the current UI thread.


解决办法和我预计的一样:

1.在Invalidate处调用 postInvalidate,命名上可以参数肯定是把当前的timer线程排队到UI线程去。不过对于我不是很适用,毕竟UI不希望让用户自己去Invalidate

2.既然不能去排队,那就干脆把自己改造成UI线程吧。借助android.os.Handler

          final Handler handler = new Handler();
                Timer timer = new Timer();
                timer.schedule(new TimerTask() {
                    public void run() {
                        handler.post(new Runnable() {
                            public void run() {
                                 root.setName(new Date() + "Root+" );//不一定是显式的调用修改UI的语句
                            }
                        });
                    }
                },1000,3000);   


OK!


 

posted @ 2010-02-04 18:18 oathleo 阅读(272) | 评论 (0)编辑 收藏

1.AWT完全干掉了,看来又要学一遍Android的2D
2.Layout变成一个很爽的东西,类似Swing里JPanel+ Layout的混合体,多好的创意!!当然嵌套啥的是必定支持了
3.java.beans包还存在,又省事不少。
4.sdk还打了一些常用公司包
   包括apache json w3cdom xml.sax等





posted @ 2010-01-19 18:24 oathleo 阅读(186) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2010-01-18 18:17 oathleo 阅读(230) | 评论 (0)编辑 收藏

1.BitMap to 数组
        int w = bitmapSrc.getWidth();
        int h = bitmapSrc.getHeight();
       
        int[] pixels = new int[w * h];
        bitmapSrc.getPixels(pixels, 0, w, 0, 0, w, h);

2.RGB HSV互转问题
android.graphics.Color 修复了java.awt.Color 的bug
RGBToHSV HSVToColor

3.Config
       Bitmap bitmap = Bitmap.createBitmap(w, h, Config.ARGB_8888);//Config.ARGB_8888,Config.ARGB_4444透明效果


Color 成了int,一下子感觉世界变得简单了。

4.文字的显示长度
            Rect textBound = new Rect();
            paint.getTextBounds(name, 0, name.length(), textBound);

5.文字渲染 x起始点在左下角
       canvas.drawText(name, x, y, paint);


posted @ 2010-01-14 16:32 oathleo 阅读(329) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2010-01-13 18:29 oathleo 阅读(273) | 评论 (0)编辑 收藏

1.eclipse 3.5(3.2不支持)
2.模拟器插件
3.Android SDK1.5

3.源代码引入:
ADT是从SDK目录下的“sources” 目录来查找class对应的源代码,这样我们只要把源代码放到sources目录中ADT就可以自动找到对应的源代码了。

 http://www.digginmobile.com/android.asp ,这里有android1.5的源代码,下载源代码后,

在\android-sdk-windows-1.5_r2\platforms\android-1.5下新建一个sources目录,

将源文件放在sources目录下,然后在编写的android的class中就可以看到引用文件的源代码了。

4.不需要每次重启模拟器,直接再跑程序,ADT会自动用当前的模拟器启动程序。否则重启模拟器本机需要60s以上




posted @ 2010-01-12 17:49 oathleo 阅读(241) | 评论 (0)编辑 收藏

     摘要: TWaver3.3 Blink Link Flowing Demo

1.节点告警闪烁,附件的闪烁 增加了IE下 独立的闪烁周期
2.Link连线的流动效果 也增加了IE下 独立的流动周期  阅读全文

posted @ 2009-11-30 16:05 oathleo 阅读(1465) | 评论 (2)编辑 收藏

仅列出标题
共17页: First 上一页 8 9 10 11 12 13 14 15 16 下一页 Last