您的位置: 首页 - 站长

iis添加网站建设中绵阳观察怎么登录不上

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

iis添加网站建设中,绵阳观察怎么登录不上,网站官网设计规范,建网站内容目录 基本介绍 有什么不同?? ArrayList的扩容机制 ArrayLIst的基本使用 ArrayList和Vector 基本介绍 还记得我们的java集合框架吗, 我们来复习一下, 如图: 可以看出来 ArrayList和LinkedList 都是具体类, 他们都是接口List的实现类. 但是他们底层的逻辑是不同的, 相信…目录 基本介绍 有什么不同?? ArrayList的扩容机制 ArrayLIst的基本使用 ArrayList和Vector 基本介绍 还记得我们的java集合框架吗, 我们来复习一下, 如图: 可以看出来 ArrayList和LinkedList 都是具体类, 他们都是接口List的实现类. 但是他们底层的逻辑是不同的, 相信学过这个的应该大概有个映像吧, 如下图: 可以看出来, ArrayList是向内存申请一块连续的数组空间进行存储, 在数组的存储形式的基础上进行链表的增删改查, 而LinkedList则是每次添加元素的时候就向系统申请一块内存, 不用就直接释放, 他们虽然在内存上不是连续的, 但是在逻辑上他们是连在一起的. 有什么不同?? 底层实现不同, ArrayList是基于动态数组的数据结构, 而LInkedLIst是基于链表的数据结构随机访问的性能不同, Arraylist的随机访问性能是由于LinkedList的, 因为ArrayList可以根据下标来直接访问, 类似于数组, 时间复杂度为O(1), 但是LinkedList的随机访问时间复杂度为O(n), 因为他需要遍历整个链表才能找到指定的元素插入和删除不同, 对于插入和删除, LInkedList要明显由于ArrayList, 因为LInkedList的掺入和删除操作时间复杂度为O(1), 例如插入, 我们可以直接在链表的头部进行插入或者是通过一个元素来记录最后一个结点的位置, 然后直接在最后一个结点进行尾插, 删除是相同的操作, 因此时间复杂度为O(1), 但是对于ArrayList就不同了, ArrayList的插入和删除需要移动插入位置的元素的后面的所有元素, 最坏的情况需要移动ArrayList的所有元素, 因此时间复杂度为O(n) 小结: ArrayList 和 LinkedList 都是 List 接口的实现类但它们的底层实现结构不同、随机访问的性能和添加/删除的效率不同。如果是随机访问比较多的业务场景可以选择使用 ArrayList如果添加和删除比较多的业务场景可以选择使用 LinkedList。 ArrayList的扩容机制 我们首先创建一个ArrayList如图: import java.util.ArrayList; import java.util.LinkedList; import java.util.List;public class Test {public static void main(String[] args) {ListInteger arrayList new ArrayList(); // 第0步:创建基于链表的ListarrayList.add(1); // 1 添加元素arrayList.add(2); // 2 添加元素arrayList.add(3); // 3 添加元素arrayList.add(4); // 4 添加元素arrayList.add(5); // 5 添加元素arrayList.add(6); // 6 添加元素arrayList.add(7); // 7 添加元素arrayList.add(8); // 8 添加元素arrayList.add(9); // 9 添加元素System.out.println(hello); // 打印} } 第0步, 初始化: ArrayList的构造方法如下: /*** Constructs an empty list with the specified initial capacity.** param initialCapacity the initial capacity of the list* throws IllegalArgumentException if the specified initial capacity* is negative/public ArrayList(int initialCapacity) {if (initialCapacity 0) {this.elementData new Object[initialCapacity];} else if (initialCapacity 0) {this.elementData EMPTY_ELEMENTDATA;} else {throw new IllegalArgumentException(Illegal Capacity: initialCapacity);}}/** Constructs an empty list with an initial capacity of ten./public ArrayList() {this.elementData DEFAULTCAPACITY_EMPTY_ELEMENTDATA;}/** Constructs a list containing the elements of the specified* collection, in the order they are returned by the collections* iterator.** param c the collection whose elements are to be placed into this list* throws NullPointerException if the specified collection is null*/public ArrayList(Collection? extends E c) {elementData c.toArray();if ((size elementData.length) ! 0) {// c.toArray might (incorrectly) not return Objectif (elementData.getClass() ! Object[].class)elementData Arrays.copyOf(elementData, size, Object[].class);} else {// replace with empty array.this.elementData EMPTY_ELEMENTDATA;}} 里面有三个重载的构造方法, 简单来说就是: 无参构造: Obeject数组elementData DEFAULTCAPACITY_EMPTY_ELEMENTDATA;给定初始容量:  ①当 传入的初始容量initialCapacity 0为真时创建一个大小为initialCapacity的空数组并将引用赋给elementData ②当 传入的初始容量initialCapacity 0为真时将空数组EMPTY_ELEMENTDATA赋给elementData ③当 传入的初始容量initialCapacity 0为真时直接抛出IllegalArgumentException异常。
此处我们传入的initialCapacity为空, 也就是无参构造方法, 如下: transient Object[] elementData;private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA {};public ArrayList() {this.elementData DEFAULTCAPACITY_EMPTY_ELEMENTDATA; }在构造方法中它将DEFAULTCAPACITY_EMPTY_ELEMENTDATA赋值给elementData这个DEFAULTCAPACITY_EMPTY_ELEMENTDATA是一个空的Object数组而elementData就是ArrayList实际存储数据的容器。 第1步, 添加元素1: 触发: public boolean add(E e) {ensureCapacityInternal(size 1); // Increments modCount!!elementData[size] e;return true;} ensureCapacityInternal为确认初始化容量: 进入ensureCapacityInternal: 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为 size 1, 翻译过来也就是最低所需的容量, 研究发现, 如果是空数组(刚开始使用无参构造方法的时候)就返回DEFAULT_CAPACITY, 值为10. 当elementData ! DEFAULTCAPACITY_EMPTY_ELEMENTDATA 的时候, 直接返回minCapacity. 随后进入ensureExplicitCapacity(int minCapacity)方法: private void ensureExplicitCapacity(int minCapacity) {modCount;// overflow-conscious codeif (minCapacity - elementData.length 0)grow(minCapacity);} modCount这是用来记录数组被修改次数的变量我们先不管它. minCapacity为计算出来的最小所需容量, elementData.length为当前容量,如果最小所需容量大于当前容量, 就需要扩容, 然后进入grow方法: private void grow(int minCapacity) {// overflow-conscious codeint 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);} 老的容量为当前容量,新的容量为老的容量的1.5倍,如果新的容量–最小所需容量О那么新的容量就等于最小所需容量,如果新的容量-当前数组最大的容量限制0,那么就进入hugeCapacity方法,然后使用copyOf方法进行数据迁移.将老的数据迁移到新的容量的数组中 总结一下: 我们使用无参构造方法的时候, 就会创建一个底层为空的数组的链表, 此时size 为0, 然后向里面添加元素的时候, 此时的minCapacity为 size 1 1, 在calculateCapacity方法中返回了DEFAULT_CAPACITY(10), 然后进入ensureExplicitCapacity(10), 此时的minCapacity 10 当前容量 0, 所以进行初始扩容(elementData Arrays.copyOf(elementData, newCapacity)), 将容量扩充到10, 也就是elementData/length 10, 随后的插入, 只要没有超过10, 那就可以直接插入, 如果容量满了, 那么就进行1.5倍扩容. ArrayLIst的基本使用 import java.util.ArrayList; import java.util.LinkedList; import java.util.List;public class Test {public static void main(String[] args) {ArrayListInteger arrayList new ArrayList(); // 第0步:创建基于链表的List// add(int x) 直接向元素末尾位置添加xarrayList.add(1);// get(int index) 方法, 返回下标为index的元素int a arrayList.get(0);System.out.println(a);// add(int index, int element); 向指定位置插入元素arrayList.add(1,3);// size(); 获取当前元素的个数int size arrayList.size();// remove(int index); 删除下标为index 的元素arrayList.remove(0);// 判断arrList是否为空, 如果为空就返回true, 否则返回false;arrayList.isEmpty();// set(int index, int element); 将index 下标的元素设置为 elementarrayList.set(0,5);} } LInkedList与之类似 ArrayList和Vector ArrayList和Vector都实现了List接口. 代码演示如图: import java.util.ArrayList; import java.util.Vector;public class Main {public static void main(String[] args) {ArrayListString arrayList new ArrayList();VectorString vector new Vector();// 添加元素arrayList.add(Java);arrayList.add(Python);arrayList.add©;vector.add(Java);vector.add(Python);vector.add©;// 获取元素System.out.println(arrayList.get(0));System.out.println(vector.get(0));// 删除元素arrayList.remove(0);vector.remove(0);// 获取元素个数System.out.println(arrayList.size());System.out.println(vector.size());} }但它们有以下区别 线程安全性Vector 是线程安全的而 ArrayList 不是。所以在多线程环境下应该使用 Vector。性能由于 Vector 是线程安全的所以它的性能通常比 ArrayList 差。在单线程环境下ArrayList 比 Vector 快。初始容量增长方式当容量不足时ArrayList 默认会增加 50% 的容量而 Vector 会将容量翻倍。这意味着在添加元素时ArrayList 需要更频繁地进行扩容操作而 Vector 则更适合于存储大量数据。 Vector的grow方法 综上所述如果不需要考虑线程安全问题并且需要高效的存取操作则 ArrayList 是更好的选择如果需要考虑线程安全以及更好的数据存储能力则应该选择 Vector。