标签:processor dfa not incr 版本 ++ 排序 inverse ...
集合
HashMap
进行排序: HashMap
本身无序,但其子类 LinkedHashMap
使用链表结构,实现了有序。通过 HashMap#entrySet()
方法可以将 Map
转为 Set<Entry>
,再在 ArrayList
的构造函数中可以传入 Collections
,正好 Set
和 List
的父类就是 Collections
,这样就可以调用 Collections.sort(list, comparator)
进行排序了。排序好后,使用 for
遍历加入 LinkedHashMap
。引用类型
强引用
String str = "abc";
软引用
SoftReference<String> soft = new SoftReference<String>(str);
弱引用
WeakReference<String> wek = new WeakReference<String>(str);
虚引用
PhantomReference
// 注意
String str = "abc"; // 常量池中
String str = new String("abc"); // 堆内存中
对象可及性
强可及对象: 除非虚拟机 OOM
,否则永远不会被回收
软可及对象: 系统内存不足时,被回收
弱可及对象: 当系统 GC
发现发现该对象,就被回收
控制一个方法的并发数量限制
方法一,使用信号量 Semaphore
信号量,构造函数传入允许个数。 Semaphore#acquire()
取得锁, Semaphore#release()
释放锁。
方法二,使用线程池
Excutors.newFixedThreadPool(num);
手动实现线程池
new ThreadPoolExecutor(
int corePoolSize, // 核心池大小: 建议 CPU 个数+1
int maximumPoolSize, // 线程池最大容量
long keepAliveTime, // 任务执行完毕后释放延时
TimeUnit unit, // 时间的单位
BlockingQueue<Runnable> workQueue, // 工作队列
ThreadFactory threadFactory, // 将 Runnable 包装成线程的工厂
RejectedExecutionHandler handler)
BlockingQueue
是单端队列, BlockingDueue
是双端队列。对于单端队列,其子类有 Array
和 Linked
等,对于此处频繁增删的需求,使用 LinkedBlockingQueue
更佳。i++
,要使用线程安全的 AtomInteger#getAndIncrement()
方法value
作为默认变量名,如 @XXX("abc")
getFiled()
只能获取 public
修饰的字段,通常使用 getDeclaredFileld()
获取申明的字段DeclaredFiled#setAccessible(true)
暴力取得权限,再通过 DeclaredField#set(user, name)
设置Handler
通常用于子线程给主线程发送消息Looper.prepare()
,创建 Looper
,创建 MessageQueue
,通过 ThreadLocal
将 Looper
与主线程绑定new Handler()
,从 ThreadLocal
中取得 Looper
,从 Looper
中取得 MessageQueue
的引用handler#sendMeessage()
,消息中添加 msg.target=this
,然后放入 MessageQueue
Looper#loop()
,循环取消息池,调用 dispatchMessage()
Looper
需要调用 Looper#quit()
终止Fragment
切换使用 Fragment#hide()
和 Fragment#show()
效率最高手动实现回退栈
Fragment
的时候添加到 List
if(list.contains(fragment)){
list.remove(fragment);
list.add(fragment);
}else {
list.add(fragment);
}
if(list.size() > 1){
list.remove(list.size()-1);
transcation
.hide(...)
.show(list.get(list.size()-1))
.commit();
}else {
finish();
}
Serializable
是 Java SE
实现的用于对象序列化的接口, Parcelable
是 Android
推出的用于序列化的接口。 Serializable
实现更简单,但性能不如 Parcelable
transient
关键字用于保留字段不被序列化onSaveInstanceState()
是会在 onStop()
前调用,用于保存 Activity
的状态Activity
可设置属性 permission
来自定义启用该活动所需要的权限,可以任意命名 // 声明权限
<permission android:name="com.xxx.xxx.AAA" />
// 使用权限
<use-permission android:name="com.xxx.xxx.AAA" />
sendBroadcast(intent, String permission)
指定权限,但仍然需要在清单文件中申明与使用,广播的自定义权限主要用于友方相互唤醒startService()
方式启动,Service
就一直在后台运行,与其他组件的生命周期无关,bindService()
方式启动,Activity
销毁时该 Service
也同时销毁IntentService
用于执行较耗时的后台任务,执行完成后自动销毁JIT
编译器: 安装速度提升 75%
,并减少 50%
的应用程序编译代码,并在同等 CPU
性能从 30%
提高到 600%
,使用 JIT
可以让用户安装程序、运行应用更快。Vulkan API
: Open GL
的下一个版本,Android 7.0
将支持相关 API
Notifiction.builder
中 addAction()
可以设置回复StorageManager
访问目录,,,它将动态申请权限,而不需要在清单文件中申明权限ICU4J API
支持: 系统内置了该免费开源 Unicode
工具库,不需要再在应用中集成Direct Boot
: 新的系统中应用可以申请在开机未解锁的情况下直接启动,比如微信、第三方的闹钟等VR
使用: 支持 VR
应用程序编写,使用 com.google.vr.sdk.widgets.pano.VrPanoramaView
控件和 com.google.vr.sdk.widgets.pano.VrVideView
分别显示图片和视频标签:processor dfa not incr 版本 ++ 排序 inverse ...
原文地址:http://www.cnblogs.com/wxmdevelop/p/7305954.html