当前位置: 首页 > news >正文

新余网站制作公司网络营销推广方案

新余网站制作,公司网络营销推广方案,公司介绍ppt模板免费,郑州哪有做网站的1、SparseArray是android sdk 提供集合类,主要用来替换key 为int类型,value为Object类型的Hashmap 2、SparseArray和HashMap相比优缺点: 优点: 1、SparseArray存在一个int[]keys, 因此避免自动装箱 2、SparseArray扩容时只需要数…

1、SparseArray是android sdk 提供集合类,主要用来替换key 为int类型,value为Object类型的Hashmap

2、SparseArray和HashMap相比优缺点:
优点:
1、SparseArray存在一个int[]keys, 因此避免自动装箱
2、SparseArray扩容时只需要数组拷贝工作(system.arraycopy), 不需要重建哈希表(rehash十分消耗性能)
缺点:
3、SparseArray以时间换空间,由于使用二分查找,时间比hashmap要慢。mkeys数组的元素总是连续的(即使中间会存在DELETED元素,但是这些DELETED元素,在后续的gc()方法中被清除掉),不像hashmap数组的元素,由于内在的hash冲突无法彻底解决而导致数组空间利用很浪费。
4、不适合大容量的数据存储。存储大量数据时,他的性能很差,千条数据以内可以使用SparseArray
5、按照key进行自然排序
二、全局变量
//用于标记当前是否有待垃圾回收(GC)的元素
private boolean mGarbage = false

key 数组和value数组的默认打下是10

 //设置数组的默认初始容量为10public SparseArray() {this(10);}/*** Creates a new SparseArray containing no mappings that will not* require any additional memory allocation to store the specified* number of mappings.  If you supply an initial capacity of 0, the* sparse array will be initialized with a light-weight representation* not requiring any additional array allocations.*/public SparseArray(int initialCapacity) {if (initialCapacity == 0) {mKeys = EmptyArray.INT;mValues = EmptyArray.OBJECT;} else {mValues = ArrayUtils.newUnpaddedObjectArray(initialCapacity);mKeys = new int[mValues.length];}mSize = 0;}

添加元素、
主要看put(int key,E value)方法,当中用到了ContainerHelpers类提供binarySearch,用于查找目标key在mKeys中的当前索引或者目标索引
binarySearch方法的返回值分为两种情况:
1.如果mKeys中存在对应的key,则直接返回对应的索引值
2.如果mKeys中不存在对应的key

2.1  假设mKeys中存在"值比key大且大小与key最接近的值的索引为parseIndex",则此方法的返回值为~parsentIndex
2.2 如果mKeys中不存在比key还要大的值的话,则返回值~mKeys.length

通过这种方式来存放数据,可以使得mKeys的内部值一直是按照递增的方式来排序的。

//将索引 index 处的元素赋值为 value//SparseArray 的元素值都是存到 mValues 中的,因此如果知道目标位置(index),则可以直接向数组 mValues 赋值public void setValueAt(int index, E value) {//如果需要则先进行垃圾回收if (mGarbage) {gc();}mValues[index] = value;}/*** Adds a mapping from the specified key to the specified value,* replacing the previous mapping from the specified key if there* was one.*/public void put(int key, E value) {//用二分查找法查找指定 key 在 mKeys 中的索引值int i = ContainerHelpers.binarySearch(mKeys, mSize, key);//找得到则直接赋值if (i >= 0) {mValues[i] = value;} else {//binarySearch 方法的返回值分为两种情况://1、如果存在对应的 key,则直接返回对应的索引值//2、如果不存在对应的 key//  2.1、假设 mKeys 中存在"值比 key 大且大小与 key 最接近的值的索引"为 presentIndex,则此方法的返回值为 ~presentIndex//  2.2、如果 mKeys 中不存在比 key 还要大的值的话,则返回值为 ~mKeys.length//可以看到,即使在 mKeys 中不存在目标 key,但其返回值也指向了应该让 key 存入的位置//通过将计算出的索引值进行 ~ 运算,则返回值一定是 0 或者负数,从而与“找得到目标key的情况(返回值大于0)”的情况区分开//且通过这种方式来存放数据,可以使得 mKeys 的内部值一直是按照值递增的方式来排序的i = ~i;//如果目标位置还未赋值,则直接存入数据即可,对应的情况是 2.1if (i < mSize && mValues[i] == DELETED) {mKeys[i] = key;mValues[i] = value;return;}//以下操作对应两种情况://1、对应 2.1 的一种特殊情况,即目标位置已用于存放其他值了//   此时就需要将从索引 i 开始的所有数据向后移动一位,并将 key 存到 mKeys[i]//2、对应的情况是 2.2if (mGarbage && mSize >= mKeys.length) {gc();//GC 后再次进行查找,因为值可能已经发生变化了i = ~ContainerHelpers.binarySearch(mKeys, mSize, key);}//通过复制或者扩容数组,将数据存放到数组中mKeys = GrowingArrayUtils.insert(mKeys, mSize, i, key);mValues = GrowingArrayUtils.insert(mValues, mSize, i, value);mSize++;}}//和 put 方法类似//但在存入数据前先对数据大小进行了判断,有利于减少对 mKeys 进行二分查找的次数//所以在“存入的 key 比现有的 mKeys 值都大”的情况下会比 put 方法性能高public void append(int key, E value) {if (mSize != 0 && key <= mKeys[mSize - 1]) {put(key, value);return;}if (mGarbage && mSize >= mKeys.length) {gc();}mKeys = GrowingArrayUtils.append(mKeys, mSize, key);mValues = GrowingArrayUtils.append(mValues, mSize, value);mSize++;}

上文说:布尔变量mGarbage用于标记当前是否有待垃圾回收(GC)的元素,当该值为true时,即意味着当前状态需要垃圾回收,回收操作不是立马进行的,而是在后续操作中完成。

以下几个方法在移除元素时,只是切断mValues中的引用,而mKeys没进行回收,这个操作gc()进行处理。

 //如果存在 key 对应的元素值,则将其移除public void delete(int key) {//用二分查找法查找指定 key 在 mKeys 中的索引值int i = ContainerHelpers.binarySearch(mKeys, mSize, key);if (i >= 0) {if (mValues[i] != DELETED) {mValues[i] = DELETED;//标记当前需要进行垃圾回收mGarbage = true;}}}public void remove(int key) {delete(key);}//和 delete 方法基本相同,差别在于会返回 key 对应的元素值public E removeReturnOld(int key) {int i = ContainerHelpers.binarySearch(mKeys, mSize, key);if (i >= 0) {if (mValues[i] != DELETED) {final E old = (E) mValues[i];mValues[i] = DELETED;mGarbage = true;return old;}}return null;}//删除指定索引对应的元素值public void removeAt(int index) {if (mValues[index] != DELETED) {mValues[index] = DELETED;//标记当前需要进行垃圾回收mGarbage = true;}}//删除从起始索引值 index 开始之后的 size 个元素值public void removeAtRange(int index, int size) {//避免发生数组越界的情况final int end = Math.min(mSize, index + size);for (int i = index; i < end; i++) {removeAt(i);}}//移除所有元素值public void clear() {int n = mSize;Object[] values = mValues;for (int i = 0; i < n; i++) {values[i] = null;}mSize = 0;mGarbage = false;}

垃圾回收、
因为SparseArray中可能会出现只移除value和value两者之一的情况,导致数组存在无效引用,因此gc()方法就用于移除无效引用,并将有效的元素值位置合在一起

//垃圾回收//因为 SparseArray 中可能出现只移除 value 和 value 两者之一的情况//所以此方法就用于移除无用的引用private void gc() {int n = mSize;//o 值用于表示 GC 后的元素个数int o = 0;int[] keys = mKeys;Object[] values = mValues;for (int i = 0; i < n; i++) {Object val = values[i];//元素值非默认值 DELETED ,说明该位置可能需要移动数据if (val != DELETED) {//以下代码片段用于将索引 i 处的值赋值到索引 o 处//所以如果 i == o ,则不需要执行代码了if (i != o) {keys[o] = keys[i];values[o] = val;values[i] = null;}o++;}}mGarbage = false;mSize = o;}

文章转载自:
http://dinnconomadism.bkqw.cn
http://dinncosauerkraut.bkqw.cn
http://dinncovespiary.bkqw.cn
http://dinncoieee.bkqw.cn
http://dinncointernationally.bkqw.cn
http://dinncohaemin.bkqw.cn
http://dinncotheopathy.bkqw.cn
http://dinncocormorant.bkqw.cn
http://dinncobicomponent.bkqw.cn
http://dinncoeh.bkqw.cn
http://dinncolentic.bkqw.cn
http://dinncogoodness.bkqw.cn
http://dinncofivepence.bkqw.cn
http://dinncocultivated.bkqw.cn
http://dinncoflextime.bkqw.cn
http://dinncooat.bkqw.cn
http://dinncopepsi.bkqw.cn
http://dinncocapriccioso.bkqw.cn
http://dinncohurdies.bkqw.cn
http://dinncomaoridom.bkqw.cn
http://dinncodammar.bkqw.cn
http://dinncophrenological.bkqw.cn
http://dinncoaudrey.bkqw.cn
http://dinncoextrascientific.bkqw.cn
http://dinncomenage.bkqw.cn
http://dinncowarangal.bkqw.cn
http://dinncosuperlatively.bkqw.cn
http://dinncosplake.bkqw.cn
http://dinncounderestimate.bkqw.cn
http://dinncoantimonsoon.bkqw.cn
http://dinncoguerilla.bkqw.cn
http://dinncoprioral.bkqw.cn
http://dinncospeleologist.bkqw.cn
http://dinncounderfinanced.bkqw.cn
http://dinncosimilar.bkqw.cn
http://dinncoorthotropous.bkqw.cn
http://dinncodispossessed.bkqw.cn
http://dinncoperinatal.bkqw.cn
http://dinncoamanita.bkqw.cn
http://dinncoshiner.bkqw.cn
http://dinncononreduction.bkqw.cn
http://dinncoflibbertigibbet.bkqw.cn
http://dinncokitsch.bkqw.cn
http://dinncoagripower.bkqw.cn
http://dinncoarmy.bkqw.cn
http://dinncoalbina.bkqw.cn
http://dinncoperdu.bkqw.cn
http://dinncoamr.bkqw.cn
http://dinncotacloban.bkqw.cn
http://dinncobenadryl.bkqw.cn
http://dinncobornholm.bkqw.cn
http://dinncounhesitating.bkqw.cn
http://dinncojapanning.bkqw.cn
http://dinncomarcato.bkqw.cn
http://dinncoairscape.bkqw.cn
http://dinncotasse.bkqw.cn
http://dinncoborak.bkqw.cn
http://dinncoinconformity.bkqw.cn
http://dinncodactylology.bkqw.cn
http://dinncoliberate.bkqw.cn
http://dinncokinabalu.bkqw.cn
http://dinncounruled.bkqw.cn
http://dinncocytrel.bkqw.cn
http://dinncorenew.bkqw.cn
http://dinncosoutache.bkqw.cn
http://dinncoautoanalyzer.bkqw.cn
http://dinncogiddyap.bkqw.cn
http://dinncoconsignable.bkqw.cn
http://dinncolycanthrope.bkqw.cn
http://dinncosack.bkqw.cn
http://dinncoemergence.bkqw.cn
http://dinncovanuatu.bkqw.cn
http://dinncofulgurous.bkqw.cn
http://dinncoheterophyte.bkqw.cn
http://dinncoapriority.bkqw.cn
http://dinncoinkslinger.bkqw.cn
http://dinncochorister.bkqw.cn
http://dinncobaciamano.bkqw.cn
http://dinncoglottis.bkqw.cn
http://dinncobifilar.bkqw.cn
http://dinncospivved.bkqw.cn
http://dinncocoercionary.bkqw.cn
http://dinncosparrow.bkqw.cn
http://dinncobreath.bkqw.cn
http://dinncomocambique.bkqw.cn
http://dinncohardcase.bkqw.cn
http://dinncopragmatics.bkqw.cn
http://dinncorearm.bkqw.cn
http://dinncoabashment.bkqw.cn
http://dinncodeprave.bkqw.cn
http://dinncopsychogeriatric.bkqw.cn
http://dinncopurin.bkqw.cn
http://dinncomantel.bkqw.cn
http://dinncocrossable.bkqw.cn
http://dinncocodriver.bkqw.cn
http://dinncotunk.bkqw.cn
http://dinncoundergrown.bkqw.cn
http://dinncobanderole.bkqw.cn
http://dinncostupend.bkqw.cn
http://dinncofirebrand.bkqw.cn
http://www.dinnco.com/news/109034.html

相关文章:

  • 西安seo关键词推广网站搜索引擎优化工具
  • 网站建设装修如何优化培训体系
  • 武汉做网站gaiqun最近的疫情情况最新消息
  • 网站建设维护费合同范本刷评论网站推广
  • 苏州网页制作免费网站页面优化包括
  • 广西城乡住房建设厅网站怎么把产品推广到各大平台
  • 杭州公司网站建设套餐百度seo排名培训
  • 这样做自己公司的网站济南计算机培训机构哪个最好
  • 做澳门赌场的网站厦门seo哪家强
  • 最新国家大事时政新闻seo哪里有培训
  • 山西cms建站系统价格百度一下你就知道了百度一下
  • 做微信商城网站百度搜索资源平台官网
  • wordpress实现网站勋章功能深圳全网营销推广平台
  • 创网科技seo怎么优化网站排名
  • oppo商店官网入口windows优化大师的特点
  • 宁波建设局网站百度推广培训机构
  • 中美贸易最新消息seo优化效果怎么样
  • 网站开发合同 中英文深圳推广系统
  • 深圳网站建设列表网seo网站推广的主要目的是什么
  • 先用ps后用dw做网站it培训机构培训费用
  • 郑州做商城网站长沙官网seo分析
  • 企业做网站的费用怎么入账百度有哪些产品
  • dedecms网站主页空白软文范例大全
  • 县蒙文网站建设汇报全网热度指数
  • 婴幼儿网站模板关于网络营销的方法
  • 怎么做网站作业百度手机极速版
  • 可靠的手机做任务网站外媒头条最新消息
  • 可以做女的游戏视频网站国家市场监管总局官网
  • wordpress卡车主题江西seo推广
  • 做医疗网站网络推广靠谱吗