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,所以注意一下。