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,所以注意一下。
相关文章推荐
- 【学习笔记】图像RGB三个分量的理解与显示
- Android Cache 解析
- leetcode-9 Palindrome Number
- 省市下拉联动插件
- python html格式的pdf转换成pdf文件
- 减少System.out.println的使用
- leetcode-8 String to Integer
- 2016年3月android面试总结(2)
- react-native开源组件react-native-wechat学习
- spring AOP 配置
- C#上机实验(二)
- java平台的常用资源
- Python爬虫:一些常用的爬虫技巧总结
- 提示框显示2秒自动消失
- osx的终端软件iterm2 之 修改外观 和 常用快捷键小结
- HID高级攻击姿势:利用PowerShell脚本进行文件窃取
- JPA & Hibernate 注解
- 关于openGL中glReadPixels接口的一点使用心得
- Android 软件盘始终无法隐藏解决办法
- leetcode-7 Reverse Integer