HashMap 的实现原理

HashMap 概述

HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒定不变。

此实现假定哈希函数将元素适当地分布在各桶之间,可为基本操作(get 和 put)提供稳定的性能。迭代collection视图所需要的时间与HashMap实例的“容量”(桶的数量)及其大小(键-值映射关系数)成比例。所以迭代性能很重要,则不要将初始容量设置得太高将加载因子设置得太低。

需要注意的是: Hashmap 不是同步的, 如果多个线程同时访问一个HashMap, 而其中至少一个线程从结构上(指添加或者删除一个或多个映射关系的任何操作)修改了,则必须保持外部同步,以防止对映射进行意外的非同步访问。

HashMap的数据结构
在Java编程语言中,最基本的结构就是两种,一个是数组,另一个是指针(引用), HashMap就是通过这连个数据结构进行实现。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。

hashmap1.jpg

- 阅读剩余部分 -

svn 启动报错error: cannot set LC_ALL locale

错误日志

[root@iZ231xhr ~]# svnserve -d -r /root/djonce
svn: error: cannot set LC_ALL locale
svn: error: environment variable LANG is en_US.UTF-8
svn: error: please check that your locale name is correct

解决方案

root权限编辑文件

sudo vi /etc/profile

在最后加入一行:

export LC_ALL=C

使生效:

source /etc/profile

(完)

使用Jenkins搭建android自动构建Apps环境

整理一下搭建的主要步骤与解决构建时的一些小问题,本文记录的是Centos 6.5环境下搭建过程。

步骤:

a.安装所需的软件
b.下载linux版的android sdk
c.建立简单的android的构建项目。

在本文中,Jenkins将设置为构建Android应用程序。 Jenkins已经需要安装,所以如果它还没有安装,请按照这里的步骤先。 对于本文,我假设您的项目使用版本控制像Git或Subversion。 我将主要谈谈称为Gradle的新构建系统,但本文也可用于设置Ant构建。

- 阅读剩余部分 -

android红包抖动动画

发完红包,红包抖动效果

效果图

public static ObjectAnimator shake(View view) {
        return tada(view, 1f);
    }

    public static ObjectAnimator shake(View view, float shakeFactor) {

        PropertyValuesHolder pvhScaleX = PropertyValuesHolder.ofKeyframe(View.SCALE_X,
                Keyframe.ofFloat(0f, 1f),
                Keyframe.ofFloat(.1f, .9f),
                Keyframe.ofFloat(.2f, .9f),
                Keyframe.ofFloat(.3f, 1.1f),
                Keyframe.ofFloat(.4f, 1.1f),
                Keyframe.ofFloat(.5f, 1.1f),
                Keyframe.ofFloat(.6f, 1.1f),
                Keyframe.ofFloat(.7f, 1.1f),
                Keyframe.ofFloat(.8f, 1.1f),
                Keyframe.ofFloat(.9f, 1.1f),
                Keyframe.ofFloat(1f, 1f)
        );

        PropertyValuesHolder pvhScaleY = PropertyValuesHolder.ofKeyframe(View.SCALE_Y,
                Keyframe.ofFloat(0f, 1f),
                Keyframe.ofFloat(.1f, .9f),
                Keyframe.ofFloat(.2f, .9f),
                Keyframe.ofFloat(.3f, 1.1f),
                Keyframe.ofFloat(.4f, 1.1f),
                Keyframe.ofFloat(.5f, 1.1f),
                Keyframe.ofFloat(.6f, 1.1f),
                Keyframe.ofFloat(.7f, 1.1f),
                Keyframe.ofFloat(.8f, 1.1f),
                Keyframe.ofFloat(.9f, 1.1f),
                Keyframe.ofFloat(1f, 1f)
        );

        PropertyValuesHolder pvhRotate = PropertyValuesHolder.ofKeyframe(View.ROTATION,
                Keyframe.ofFloat(0f, 0f),
                Keyframe.ofFloat(.1f, -3f * shakeFactor),
                Keyframe.ofFloat(.2f, -3f * shakeFactor),
                Keyframe.ofFloat(.3f, 3f * shakeFactor),
                Keyframe.ofFloat(.4f, -3f * shakeFactor),
                Keyframe.ofFloat(.5f, 3f * shakeFactor),
                Keyframe.ofFloat(.6f, -3f * shakeFactor),
                Keyframe.ofFloat(.7f, 3f * shakeFactor),
                Keyframe.ofFloat(.8f, -3f * shakeFactor),
                Keyframe.ofFloat(.9f, 3f * shakeFactor),
                Keyframe.ofFloat(1f, 0)
        );

        return ObjectAnimator.ofPropertyValuesHolder(view, pvhScaleX, pvhScaleY, pvhRotate).
                setDuration(1000);
    }

使用

   /**
     * 红包抖动
     *
     * @param targetView
     */
    private void shakeRedPacket(View targetView) {

        ObjectAnimator animator = AnimatorUtils.shake(targetView);
        animator.setRepeatCount(5);
        animator.start();
    }

参考资料:
https://plus.google.com/+CyrilMottier/posts/FABaJhRMCuy