白天还是黑夜

Zufeng's Blog


  • 首页

  • 分类

  • 归档

  • 标签

  • 留言

  • 关于

  • 搜索

分析HashMap的部分源码

发表于 2020-05-14 | 分类于 Java

HashMap散列表是Java中用的最广泛的数据结构之一了,因为其查找数据的时间复杂度为常数级的,而且能够保存唯一key,所以使用起来很顺手。
首先分析下它的几个初始属性:

1
2
3
4
5
6
7
8
9
10
/*结构的核心,一个Node节点类型的数组*/
table
/*map的大小*/
size
/*阈值,数组的占用的位置大于等于这个值就开始扩容了*/
threshold
/*扩容指数*/
loadFactor
/*修改次数,按照注释看,这个值在remove,put操作后都会加1。HashMap的迭代器是fail-fast,用来保证遍历过程中不允许修改map,这个参数在迭代器为fail-fast的类中都存在。*/
modCount;

使用无参构造器初始化HashMap,就会使用默认的数组大小1>>4,扩容指数0.75,阈值就是12
先看看向HashMap中插入节点的代码:

阅读全文 »

volatile关键字

发表于 2020-03-25

介绍

volatile关键字,java给出的线程安全的轻量级实现
1、保证可见性,用volatile修饰的变量每次都是从内存中读取
2、禁止指令重排序,用volatile修饰的变量禁止指令重排优化
3、不保证原子性,要保证原子性的话需要使用synchronize关键字或者concurrent包下的原子类

阅读全文 »

Java中的容器类和Android的特有的容器类

发表于 2020-02-04

1、ArrayList,Vector,CopyOnWriteArrayList和Collections.SynchronizedList

  • ArrayList是底层是一个动态数组维护的,数组的初始大小是10,每次扩容是oldCapacity + (oldCapacity >> 1),也即是原来的1.5倍,当添加一个数据之后数组可能越界就会扩容。支持插入空数据。
  • ArrayList中最重要的属性就是elementData数组和size,elementData数组由transient修饰,可以防止自动序列化,因此它实现了readObject和writeObject自定义序列化方法
  • Vector底层也是一个动态数组维护,但是它是线程安全的容器类,它的所有方法都是使用synchronize关键字修饰的,所以它的性能非常之差,所以它是一个同步容器而不是一个并发容器。
  • CopyOnWriteArrayList写入时复制容器,写入时复制的思想:简单来说,就是平时查询的时候,都不需要加锁,随便访问,只有在写入/删除的时候,才会从原来的数据复制一个副本出来,然后修改这个副本,最后把原数据替换成当前的副本。修改操作的同时,读操作不会被阻塞,而是继续读取旧的数据。
  • CopyOnWriteArrayList的缺点就是修改中时读取的是旧数据,假如读写频繁就会读到脏数据,而且频繁的替换对象,会消耗大量内存。
  • Collections.synchronizedList()方法可以将一个ArrayList结构转换成线程安全的数据结构,它实现是利用了synchronize代码块锁住了一个Object对象,所有的操作都使用同步代码块
阅读全文 »

Android的零碎知识点

发表于 2020-01-05

1、Android 项目中 assets 目录和 res 目录有什么区别

assets下可以新建子目录,res下的子目录不能再新建子目录
assets也会随着apk一起打包,但是不会进行编译,res目录下的文件都会进行编译后使用R.的方式就能使用
assets使用是需要用AssetManager取出输入流使用的

阅读全文 »

bitmap

发表于 2019-12-03

1、优化Bitmap
做bitmap优化,选择合适的图片规格

  • ALPHA_8 每个像素占用1byte内存
  • ARGB_4444 每个像素占用2byte内存
  • ARGB_8888 每个像素占用4byte内存(默认)
  • RGB_565 每个像素占用2byte内存

降低采样率:BitmapFactory.Options参数inSampleSize的使用,先把options.inJustDecodeBounds设为true,只是去读取图片的大小,在拿到图片的大小之后和要显示的大小做比较,通过calculateInSampleSize()函数计算inSampleSize的具体值,得到值之后将options.inJustDecodeBounds设为false读图片资源。

阅读全文 »

notificationChannel

发表于 2019-08-26

Android 8.0上的通知栏简单适配

当我们升级到Android O以上,也就是将targetSdkVersion升级到26时,原来的通知方法就是提示被遗弃了,所以我们需要升级下代码了。
Android O上的通知出现了一个通知渠道的概念,也就是每条通知都需要有一个对应的渠道,8.0Google将用户的权利放到最大,用户可以自由的选择是否振铃,是否震动,是否关闭这个渠道的通知。
首先如何使用通知渠道

阅读全文 »

活动的launchMode

发表于 2019-08-25

启动模式

Android的Activity有四种启动模式都清楚,标准启动模式standard,栈顶复用singleTop,栈内复用singleTask,单实例模式singleInstance,他们都在在AndroidManifeast中使用

  • standard:每次启动startActivity都会在任务栈中创建一个新的Activity实例,重新走一遍活动的生命周期,谁去启动这个新实例,这个新的实例就会创建在谁的任务栈中。非新手都知道在service中或者使用ApplicationContext去启动活动都会出异常,导致启动失败,根本原因就是因为service上下文没有对应的任务栈,所以我们就会给它加上FLAG_ACTICITY_NEW_TASK这个flag,这样就会为它创建新的任务栈,一个singleTask启动的
  • singleTop:在这种模式下,如果需要启动的Activity位于当前的栈顶,那么这个Activity不会被重新创建,它的onNewIntent会被回调,如果Activity已经存在但是不在栈顶,依然会重新创建
  • singleTask:这是一种单实例模式,在这种模式下,同一个栈中只会存在同一种实例,同样如果它在栈中存在也会回调onNewIntent,同时singleTask有clearTop的效果,位于它之上的实例会全部出栈
  • singleInstance:这是一种加强的单实例模式,它具有singleTask所有的特性,再加上它被创建后会位于一个单独的任务栈中,这种模式的栈只有一个实例。
阅读全文 »

关于Handler

发表于 2019-07-03 | 分类于 Android

1、关于handler消息机制有哪些重要关键的类?

Handler,Message,MessageQueue,Looper
Handler是发送的处理消息的类,发送消息的方法都是final修饰的,handleMessage方法是空方法,我们必须要去重写它
Message是消息体,包括what,arg1,arg2,obj这4个发送消息必须显示赋予的,然后Message类自己有一个消息池,它的使命是减少重复new Message对象,浪费资源。
最后要提到的关键的属性就是when,target,callback这几个属性是干嘛的后面再讲

阅读全文 »

Android标签

发表于 2019-06-14 | 分类于 Android

ViewStub 懒加载

最开始接触ViewStub是从DecorView中认识的,都知道DecorView是顶级的View,它是一个线性布局,它有两个子View:ViewStub和FrameLayout,帧布局中包括一个FitWindowsLinearLayout布局,FitWindowsLinearLayout包含ViewStubCompat和ContentFrameLayout,而我们使用setContentView放进去的布局文件就是放在ContentFrameLayout这个布局之中。而我们最开始就接受到的知识是DecorView是两个部分组成的,一个是titleView,另一个就是ContentView(可以用findViewById(android.R.id.content)获取)。

阅读全文 »

Android内存管理之内存抖动、内存泄露、内存溢出

发表于 2019-06-02 | 分类于 Android

内存抖动

内存抖动的现象就是UI界面的卡顿,出现的原因就是年轻代的频繁GC。JVM的每次年轻代GC都会触发“全世界的暂停(stop-the-world)”,也就会导致卡顿。避免出现内存抖动的几点建议:
1、不要在循环体内创建对象,将创建对象放到循环体外,在循环体内重用一个对象。
2、自定义View的onDraw(),onMeasure()方法会多次调用,所以尽量不要在里面创建对象。
3、当需要使用大量的Bitmap的时候,应该将他们缓存到数组中使用。
4、同理,对于有复用的对象,可以用对象池将它缓存起来。

阅读全文 »
12
Zufeng Lu

Zufeng Lu

人生是一场徒步旅行,不走到最后,怎么知道能走多远

15 日志
4 分类
8 标签
GitHub 微博 E-Mail
© 2020 Zufeng Lu
由 Hexo 强力驱动
|
主题 — NexT.Mist v5.1.4
   |