3月25日。

HashMap与ConcurrentHashMap的区别

首先,我们都知道HashMap的作用是依靠key来取和存东西,可以将你需要的对象加载在内存中和去除来,如果我们在多线程的时候就会有线程安全问题,那么这个时候在java5的时候有了一个新成员,那就是concurrent包下的ConcurrentHashMap。当然要具体知道他是怎么解决线程安全的问题,我百度了一下,原理是:通过把整个Map分为N个Segment(类似HashTable),可以提供相同的线程安全,但是效率提升N倍,默认提升16倍。具体原理,自己百度去吧。

android的强大log日志工具

你还在为打印json不规范而烦恼吗?你还在为打印没有统一规范而伤心吗?你还在为打印log日志没有一个清晰的结构而心痛吗?那么现在我来介绍一下今天的新发现:orhanobut的Logger。具体源码自己去github上面看,我就不上传了,下面我来说说这里面具体的用法,废话不多说,直接贴代码:
public class TestScriptLoggerActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //在调用之前必须要先初始化,要不然会炸掉
        ScriptLogger.init("ScriptLogger");
        /*下面有更多的配置*/
        /*
        *  Logger.init("MyApplcation")           // 默认初始化标识
                .methodCount(3)                 // 默认是2   调用方法的数目
                .hideThreadInfo()               // 默认是公开的  隐藏线程的信息
                .logLevel(LogLevel.NONE)        // 默认的输出级别是全部
                .methodOffset(2)                // 默认是 0  与其他库集成记录器,可以设置偏移量,以避免库的方法。
                .logTool(new AndroidLogTool()); // 这个你可以用别的log工具替代android原生的log日志工具
        *
        * */
        //最基本的用法,相信傻子都可看得懂
        ScriptLogger.d("哈哈哈");
        ScriptLogger.w("哈哈哈");
        ScriptLogger.v("哈哈哈");
        ScriptLogger.e("哈哈哈");
        //用assert输出
        ScriptLogger.wtf("hello");
        //输出json数据
        ScriptLogger.json("{\"flag\":true,\"msg\":\"登陆成功\",\"code\":\"1\",\"token\":\"4a9047af-3173-40e9-bad2-ebc879bc6acb\",\"agentid\":\"\",\"lv\":1,\"member_id\":107,\"mobile\":\"15280236292\",\"uname\":\"Emily\",\"email\":\"\",\"sex\":1,\"face\":\"http://192.168.0.4:8090/wwmvs/statics/attachment/face/201603230855429688.jpg\"}");
        //输出xml数据
        ScriptLogger.xml("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
                "<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
                "    xmlns:tools=\"http://schemas.android.com/tools\"\n" +
                "    android:layout_width=\"match_parent\"\n" +
                "    android:layout_height=\"match_parent\"\n" +
                "    android:paddingBottom=\"@dimen/activity_vertical_margin\"\n" +
                "    android:paddingLeft=\"@dimen/activity_horizontal_margin\"\n" +
                "    android:paddingRight=\"@dimen/activity_horizontal_margin\"\n" +
                "    android:paddingTop=\"@dimen/activity_vertical_margin\"\n" +
                "    tools:context=\"com.script.drama.myapplication.MainActivity\">\n" +
                "\n" +
                "    <TextView\n" +
                "        android:layout_width=\"wrap_content\"\n" +
                "        android:layout_height=\"wrap_content\"\n" +
                "        android:text=\"Hello World!\" />\n" +
                "</RelativeLayout>\n");

        //带标识的输出
        ScriptLogger.t("test").d("我是test");
        ScriptLogger.t("test").w("我是test");
        ScriptLogger.t("test").v("我是test");
        ScriptLogger.t("test").e("我是test");
        ScriptLogger.t("test").wtf("我是test");
        ScriptLogger.t("test").xml("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
                "<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
                "    xmlns:tools=\"http://schemas.android.com/tools\"\n" +
                "    android:layout_width=\"match_parent\"\n" +
                "    android:layout_height=\"match_parent\"\n" +
                "    android:paddingBottom=\"@dimen/activity_vertical_margin\"\n" +
                "    android:paddingLeft=\"@dimen/activity_horizontal_margin\"\n" +
                "    android:paddingRight=\"@dimen/activity_horizontal_margin\"\n" +
                "    android:paddingTop=\"@dimen/activity_vertical_margin\"\n" +
                "    tools:context=\"com.script.drama.myapplication.MainActivity\">\n" +
                "\n" +
                "    <TextView\n" +
                "        android:layout_width=\"wrap_content\"\n" +
                "        android:layout_height=\"wrap_content\"\n" +
                "        android:text=\"Hello World!\" />\n" +
                "</RelativeLayout>\n");
        ScriptLogger.t("test").json("{\"flag\":true,\"msg\":\"登陆成功\",\"code\":\"1\",\"token\":\"4a9047af-3173-40e9-bad2-ebc879bc6acb\",\"agentid\":\"\",\"lv\":1,\"member_id\":107,\"mobile\":\"15280236292\",\"uname\":\"Emily\",\"email\":\"\",\"sex\":1,\"face\":\"http://192.168.0.4:8090/wwmvs/statics/attachment/face/201603230855429688.jpg\"}");

        //你还可以将错误输出来
//        Logger.e(exception, "message");
    }

}

单列模式的最正确写法

直接贴代码了:
public class ScriptOkhttpManager {

    private volatile static ScriptOkhttpManager scriptOkhttpManager;

    public ScriptOkhttpManager() {
    }

    public static ScriptOkhttpManager getInstance(){
        if (scriptOkhttpManager==null){
            synchronized (ScriptOkhttpManager.class){
                if (scriptOkhttpManager==null){
                    scriptOkhttpManager = new ScriptOkhttpManager();
                }
            }
        }
        return scriptOkhttpManager;
    }
}

最后我发现在5.0以上,不支持隐式的启动Service,所以注意一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值