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

福州思企互联网站建设公司北京网站开发哪家好薇

福州思企互联网站建设公司,北京网站开发哪家好薇,建设一个网站需要哪些,黄岩网站制作看ArrayList源码时#xff0c;无意中看到ArrayList的初始化容量大小为10#xff0c;这就奇怪了#xff01;我们都知道ArrayList和HashMap底层都是基于数组的#xff0c;但为什么ArrayList不像用HashMap那样用16作为初始容量大小#xff0c;而是采用10呢#xff1f; 为什…看ArrayList源码时无意中看到ArrayList的初始化容量大小为10这就奇怪了我们都知道ArrayList和HashMap底层都是基于数组的但为什么ArrayList不像用HashMap那样用16作为初始容量大小而是采用10呢 为什么HashMap的初始化容量为16 在聊ArrayList的初始化容量时要先来回顾一下HashMap的初始化容量。这里以Java 8源码为例HashMap中的相关因素有两个初始化容量及装载因子 /** * The default initial capacity - MUST be a power of two. */static final int DEFAULT_INITIAL_CAPACITY 1 4; // aka 16/** * The load factor used when none specified in constructor. */static final float DEFAULT_LOAD_FACTOR 0.75f; 在HashMap当中数组的默认初始化容量为16当数据填充到默认容量的0.75时就会进行2倍扩容。当然使用者也可以在初始化时传入指定大小。但需要注意的是最好是2的n次方的数值如果未设置为2的n次方HashMap也会将其转化反而多了一步操作。 关于HashMap的实现原理的内容这里就不再赘述网络上已经有太多文章讲这个了。有一点我们需要知道的是HashMap计算Key值坐标的算法也就是通过对Key值进行Hash进而映射到数组中的坐标。 此时保证HashMap的容量是2的n次方那么在hash运算时就可以采用位运行直接对内存进行操作无需转换成十进制效率会更高。 通常可以认为HashMap之所以采用2的n次方同时默认值为16有以下方面的考量 减少hash碰撞 提高Map查询效率 分配过小防止频繁扩容 分配过大浪费资源 总之HashMap之所以采用16作为默认值是为了减少hash碰撞同时提升效率。 ArrayList的初始化容量是10吗 下面先来确认一下ArrayList的初始化容量是不是10然后在讨论为什么是这个值。 先来看看Java 8中ArrayList初始化容量的源码 /** * Shared empty array instance used for default sized empty instances. We * distinguish this from EMPTY_ELEMENTDATA to know how much to inflate when * first element is added. */ private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA {}; /** * Constructs an empty list with an initial capacity of ten. */ public ArrayList() { this.elementData DEFAULTCAPACITY_EMPTY_ELEMENTDATA; } 此处肯定有朋友说Java 8中ArrayList默认初始化大小为0不是10。而且还会发现构造方法上的注释有一些奇怪构造一个初始容量10的空列表。什么鬼明明是空的啊 保留疑问先来看一下ArrayList的add方法 public boolean add(E e) { ensureCapacityInternal(size 1); // Increments modCount!! elementData[size] e; return true; } 在add方法中调用了ensureCapacityInternal方法进入该方法一开始是一个空容器所以size0传入的minCapacity1 private void ensureCapacityInternal(int minCapacity) {         ensureExplicitCapacity(calculateCapacity(elementData, minCapacity)); } 上述方法中先通过calculateCapacity来计算容量 private static int calculateCapacity(Object[] elementData, int minCapacity) {       if (elementData DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { return Math.max(DEFAULT_CAPACITY, minCapacity); } return minCapacity; } 会发现minCapacity被重新赋值为10 DEFAULT_CAPACITY10传入ensureExplicitCapacity(minCapacity);这minCapacity10下面是方法体 private void ensureExplicitCapacity(int minCapacity) { modCount; // overflow-conscious code if (minCapacity - elementData.length 0) grow(minCapacity); } private void grow(int minCapacity) { // overflow-conscious code int oldCapacity elementData.length; int newCapacity oldCapacity (oldCapacity 1); if (newCapacity - minCapacity 0) newCapacity minCapacity; if (newCapacity - MAX_ARRAY_SIZE 0) newCapacity hugeCapacity(minCapacity); // minCapacity is usually close to size, so this is a win: elementData Arrays.copyOf(elementData, newCapacity);} 上述代码中grow方法是用来处理扩容的将容量扩容为原来的1.5倍。 了解上面的处理流程我们会发现本质上ArrayList的初始化容量还是10只不过使用懒加载而已这是Java 8为了节省内存而进行的优化而已。所以自始至终ArrayList的初始化容量都是10。 这里再多提一下懒加载的好处当有成千上万的ArrayList存在程序当中10个对象的默认大小意味着在创建时为底层数组分配10个指针40 或80字节并用空值填充它们一个空数组用空值填充占用大量内存。如果能够延迟初始化数组那么就能够节省大量的内存空间。Java 8的改动就是出于上述目的。 为什么ArrayList的初始化容量为10 最后我们来探讨一下为什么ArrayList的初始化容量为10。其实可以说没有为什么就是“感觉”10挺好的不大不小刚刚好眼缘 首先在讨论HashMap的时候我们说到HashMap之所以选择2的n次方更多的是考虑到hash算法的性能与碰撞等问题。这个问题对于ArrayList的来说并不存在。ArrayList只是一个简单的增长阵列不用考虑算法层面的优化。只要超过一定的值进行增长即可。所以理论上来讲ArrayList的容量是任何正值即可。 ArrayList的文档中并没有说明为什么选择10但很大的可能是出于性能损失与空间损失之间的最佳匹配考量。10不是很大也不是很小不会浪费太多的内存空间也不会折损太多性能。 如果非要问当初到底为什么选择10可能只有问问这段代码的作者“Josh Bloch”了吧。 如果你仔细观察还会发现一些其他有意思的初始化容量数字 ArrayList-10Vector-10HashSet-16HashMap-16HashTable-11复制代码 ArrayList与Vector初始化容量一样为10HashSet、HashMap初始化容量一样为16而HashTable独独使用11又是一个很有意思的问题。
http://www.huolong8.cn/news/174340/

相关文章:

  • 湖州佳成建设网站抖音关键词搜索指数
  • 网站网页打开的速度什么决定的福州网站开发一般多少钱
  • 什么是响应式开发网站推广优化方式
  • 怎么建立微信大转盘的网站服务免费服务器建立网站
  • 诸城高密网站建设ps做图游戏下载网站有哪些内容
  • 电子商务网站的全面建设宿迁华夏建设集团网站
  • 东莞天助网的网站建筑网官网大全
  • 网站app开发公司wordpress改为QQ头像
  • 东北亚科技园里有做网站的吗百度网站地图在线生成
  • 做dhl底单的网站是 什么seo性能优化
  • 怎样做p2p网站一般网站 要 加入 友情链接吗
  • 网站开发技能介绍微网站建设多少钱
  • 免费网站建设力荐 186一6159一6345绘政正规专业的家居行业网站制作
  • 优动网站400电话申请
  • 做全网影视网站的风险移动商城积分和积分区别
  • 上海做网站内容检查的公司寿光市住房和城乡建设局网站
  • 受欢迎的免费建站建设部安全事故通报网站
  • 域名转发网站网站后台地址忘记了
  • 建设银行官方网站app下载做汽车微信广告视频网站有哪些
  • 国外家装设计网站怎么查网站的备案
  • 网站文章更新频率刘连康seo培训哪家强
  • php网站建设一流程网站客户需求分析
  • 作品展示的网站怎么做便民信息网站
  • 淮安网站定制成都有什么好玩的旅游景点
  • 深圳整站企业网络配置方案
  • wordpress关闭略缩图网站怎么优化关键词快速提升排名
  • easyui网站开发实战电子书网站 建设实验小结
  • 东莞知名网站推广wordpress左边栏
  • 温州做网站优化php做网站难么
  • 网站没有域名设置吗山东省建设厅网站查