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

专做淘宝的网站WordPress全站广告

专做淘宝的网站,WordPress全站广告,spark网站开发,广州网站优化公司Java集合 集合底层框架总结 List 代表的有序#xff0c;可重复的集合。 ArrayList -- 数组 -- 把他想象成C中的Vector就可以#xff0c;当数组空间不够的时候#xff0c;会自动扩容。 -- 线程不安全 LinkedList -- 双向链表 -- 可以将他理解成一个链表#xff0c;不支持…Java集合 集合底层框架总结 List 代表的有序可重复的集合。 ArrayList -- 数组 -- 把他想象成C中的Vector就可以当数组空间不够的时候会自动扩容。 -- 线程不安全 LinkedList -- 双向链表 -- 可以将他理解成一个链表不支持随机存取但是增加删除特别方便。 Vector -- 数组 -- 线程安全 comparable 和 Comparator 的区别 comparable 是Java中的一个接口定义在lang包下他的比较方法是comparableTo。他是一个Java 中内置的比较方法不是独立的。例如我可以根据年龄来为对象排序。这个comparableTo 是写在类之中的。 class Person implements ComparablePerson {private String name;private int age; ​public Person(String name, int age) {this.name name;this.age age;} ​// Implementing compareTo method of Comparable interfaceOverridepublic int compareTo(Person otherPerson) {return Integer.compare(this.age, otherPerson.age);} } ​ public class Main {public static void main(String[] args) {ListPerson people new ArrayList();people.add(new Person(Alice, 30));people.add(new Person(Bob, 25));people.add(new Person(Charlie, 35)); ​Collections.sort(people); ​for (Person person : people) {System.out.println(person);}} } Comparator 是一个独立的接口定义在Util 包下。他如果对对象进行排序需要重写 compare 方法然后在外部对具体如何排序进行书写也正因为写在外部所以可以有多种排序方式与之相反的Compareable 接口由于在类内部所以只有一种排序方式不可改变。 class Person implements ComparablePerson {private String name;private int age; ​public Person(String name, int age) {this.name name;this.age age;} ​// Implementing compareTo method of Comparable interfaceOverridepublic int compareTo(Person otherPerson) {return Integer.compare(this.age, otherPerson.age);} ​// Getter methods for name and agepublic String getName() {return name;} ​public int getAge() {return age;} ​// toString method for printing Person objectsOverridepublic String toString() {return name - age;} } ​ public class Main {public static void main(String[] args) {ListPerson people new ArrayList();people.add(new Person(Alice, 30));people.add(new Person(Bob, 25));people.add(new Person(Charlie, 35)); ​Collections.sort(people); ​for (Person person : people) {System.out.println(person);}} } ArrayList如何序列化 transient 修饰 存储元素的elementData目的是不让被修饰的成员属性序列化。 那为什么不可以直接序列化 ArrayList? 因为ArrayList的空间可能是100但是只有60个有元素那么就极大的浪费空间且效率低下。 如何序列化 通过的是readObject和writeObject方法实际使用的是流的方式。 ObjectOutputStream和ObjectInputStream来进行序列化和反序列化。 ArrayList的扩容机制 首先我们在创建ArrayList时我们可以指定ArrayList的初始容量但随着add()方法不断往ArrayList添加元素这个时候ArrayList的容量满了我们需要对 ArrayList 进行扩容。 流程为创建了一个当前数组容量*1.5大小的 ArrayList然后将原来的数组中的元素利用Arrays.copyOf() 方法放入 新数组中。再将准备新加入的元素加入新数组中。 图示: 堆栈过程图示 add(element) └── if (size elementData.length) // 判断是否需要扩容├── grow(minCapacity) // 扩容│   └── newCapacity oldCapacity (oldCapacity 1) // 计算新的数组容量│   └── Arrays.copyOf(elementData, newCapacity) // 创建新的数组├── elementData[size] element; // 添加新元素└── return true; // 添加成功 ​ LinkedList 为什么不能实现RandomAccess接口 RandomAccess 是一个标记接口用来表明实现该接口的类支持随机访问即可以通过索引快速访问元素。由于 LinkedList 底层数据结构是链表内存地址不连续只能通过指针来定位不支持随机快速访问所以不能实现 RandomAccess 接口。 Queue PriorityQueue -- 数组来实现二叉堆 ArrayQueue -- 数组 双指针 Set 代表的有序不可重复的集合。 HashSet(无序唯一) -- 基于 HashMap 实现底层是哈希表 LinkedHashSet(HashSet的子类有序) -- 基于LinkedHashMap实现底层是链表 哈希表 TreeSet (有序唯一)-- 红黑树 Map 以键值对方式存储。代表的是键值对的集合。 HashMap -- JDK1.8 前数组链表。JDK1.8后如果链表阈值大于默认值8会将链表转换为红黑树但转换前会先判断数组大小是否小于64如果小于的话优先数组扩容。总结数组链表或红黑树。 LinkHashMap -- 数组链表或红黑树。不同的是在HashMap基础上增加了一条双向链表可以保证顺序与插入顺序一致。 TreeMap -- 红黑树。 因为TreeMap还实现了 SortedMap 和 NavigableMap 接口所以会比 HashMap 多了搜寻和排序的功能。可以自定义排序规则。 HashMap详解 数据结构 HashMap -- JDK1.8 前数组链表。JDK1.8后如果链表阈值大于默认值8会将链表转换为红黑树但转换前会先判断数组大小是否小于64如果小于的话优先数组扩容。总结数组链表或红黑树。使用了拉链法来解决的哈希冲突。 JDK1.8 前 JDK1.8后 线程安全 非线程安全但是HashTable是线程安全的。因为HashTable中的方法基本上都经过 synchronized 修饰过的。 初始容量和扩容机制 HashMap如果未指定初始大小那么默认初始容量大小是16且每次扩容都是之前的二倍。如果给定初始容量大小 n那么容量为给定大小的2 的n次幂。 而HashTable 如果未指定初始大小那么默认初始容量大小是11且每次扩容都是之前的 2n 1 。如果指定初始容量大小那么容量直接就是给定的大小。 为什么 HashMap 的⻓度为什么是 2 的幂次方 因为 Hash 值范围非常大但是空间是不能容得下这么多哈希值的所以需要 Hash值 数组长度进行取模运算。也就是 Hash % length 但是这个这个值是与 Hash (length - 1 )是相等的。 举个例子如果 数组长度是 16hash值是 10101 hash (ength - 1) 10101 1111。这样可以看到 hash 值的后四位就可以被用来计算数组的索引。 会方便计算也可以使其分布更加均匀。因为与 hash 值有关。 并且如果数组长度是2 的幂次方就可以用 与运算。也会使效率更高。 如果初始化一个HashMap长度为17还是会变成 32 容量。 HashMap 的 put 流程 先利用 hashcode 获取哈希值然后根据哈希值和数组长度算出键值对在数组中的索引。如果当前数组的桶为空直接添加。如果不为空判断key 相同与否如果相同则覆盖不相同的话遍历链表或者遍历树。在链表中如果 key 相同则覆盖如果key 不存在添加进链表中作为尾节点并判断如果超过链表阈值则转换为红黑树。 HashMap的查询删除的时间复杂度 HashMap可以直接根据哈希码来确认数组下标所以查询和删除的时间复杂度都是 o(1) 。但是如果发生哈希冲突的话链表还未转换成红黑树时间复杂度就变成了o(n)n是链表长度如果转变成了红黑树时间复杂度变成了 o(logn). ConcurrentHashMap 从上文已知HashMap 是线程不安全的那如果我们想用线程安全的哈希表就可以用 ConcurrentHashMap。 在Jdk 1.8 之前ConcurrentHashMap 的底层数据结构是 分段数组 链表的形式。每个分段可以独立锁定当需要读取数据的时候不需要锁震整个数组只需要锁定当前数据所在的段的段就可以。可以提高并发的性能。当一个线程锁上一个数据段的时候其他的数据段仍然可以被另外的线程读取。 如果有些方法需要跨段那么就可以按顺序锁住所有的段然后再按顺序释放就可以。 Segment 数组中的每个元素包含⼀个 HashEntry 数组每个 HashEntry 数组属于链表结构。 这样就可以保证线程安全。 JDK1.8之后ConcurrentHashMap 取消了 Segment 分段数组只保留了一大个数组也就是 table 数组。取而代之保证线程安全用的是CAS 和 synchronized 锁避免不必要的锁的开销。另一个变化是像HashMap一样增加了红黑树防止链表长度过长。 JDK 1.8 最大并发数是Node数组的大小而Jdk1.7并发数是 Segment 的数量。 ConcurrentHashMap 和 HashTable 的区别 首先他们俩都是线程安全的但是数据结构不同。 HashTable 的数据结构利用了 数组加链表ConcurrentHashMap 的数据结构参考上文。 其次实现线程安全的方式也不同HashTable使⽤ synchronized 来保证线程安全,同一时段只能一个线程访问效率低下。
http://www.dnsts.com.cn/news/101580.html

相关文章:

  • 床上用品网站源码做外贸英文网站哪家好
  • 青海省住房城乡建设厅网站首页你认为什么对网络营销至关重要
  • 东莞邦邻网站建设仿冒网站制作
  • 免费做产品画册的网站杭州房地产网站建设
  • 注册网站的费用wordpress网站底部版权代码
  • 建网站pc版如何找推广平台
  • 蓝韵网络专业网站建设怎么样教育技术专业网站开发课程
  • 黑龙江企业网站设计团队佛山新网站建设方案
  • 镇江公司做网站电子政务网站建设ppt
  • 欧美网站源码重庆百度快速优化
  • 基于网站的网络营销方法有哪些接私活 做网站
  • 南充做网站的公司个人网站模板素材下载
  • 哪个商城网站建设好甘肃业聚质网络科技有限公司
  • 查看网站有没有备案兰州做网站公司哪家好
  • 服装怎么做网站推广网页设计实验报告实验1
  • 比较好的营销网站织梦网站名称修改
  • 网站备案中是什么意思wordpress上传的图片不显示
  • 自适应网站建设案例企业网站备案好不好
  • 网站开发 认证中建八局第一建设有限公司中标
  • wordpress网站如何app大数据培训机构可信吗
  • 专门做自助游的网站淘客网站免费开源源码
  • 如何给别人做网站挣钱甘肃省城乡建设局网站
  • 苏州 网站建设太原网站域名开发
  • 现代简约风格设计方案ppt襄阳网站seo方法
  • 多语言外贸网站源码公司网站改版
  • 大庆市建设中专网站成都科技网站建设电话多少
  • 友情链接中有个网站域名过期了会影响南上海网站建设
  • 无锡网站设计开发男女做恩爱视频网站
  • html5 公司网站模板河南seo
  • 网站开发技术难点百度排行榜风云