您的位置:首页 > 其它

3月25日。

2016-03-25 16:30 337 查看

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,所以注意一下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: