网站开发怎么连接sqlserver,域名的价格,小视频制作软件app,网络游戏的特点数组定义#xff1a; 在计算机科学中#xff0c;数组是由一组元素#xff08;值或变量#xff09;组成的数据结构#xff0c;每个元素有至少一个索引或键来标识。
因为数组内的元素是连续存储的#xff0c;所以数组中元素的地址#xff0c;可以通过其索引计算出来。 性…数组定义 在计算机科学中数组是由一组元素值或变量组成的数据结构每个元素有至少一个索引或键来标识。
因为数组内的元素是连续存储的所以数组中元素的地址可以通过其索引计算出来。 性能空间占用
java中所有对象的大小都是8字节的整数倍不足的要用对齐字节补足
随机访问
即根据索引查找元素时间复杂度是O(1)
动态数组 private int size; // 逻辑大小private int capacity8; // 容量private int[] arraynew int[capacity];
插入
//向最后的位置[size]添加元素public void addLast(int element){array[size]element;size;}
//向[0....size]位置添加元素public void add(int index,int element){//未考虑数组扩容问题if(size0indexsize) {//进行一个拷贝System.arraycopy(array, index, array, index 1, size - index);array[index] element;size;} else if(indexsize){//addLastarray[index]element;size;}} public void add1(int index,int element){if(size 0 index size){System.arraycopy(array,index,array,index1,size-index);}array[index]element;size;}
查询和遍历元素
//查询元素public int get(int index){//[0....size]return array[index];}//打印每个元素public void foreach(){for (int i0;isize;i){System.out.println(array[i]);}}//函数式接口//遍历方法1consumer接口 遍历执行的操作每个元素入参public void foreach1(ConsumerInteger consumer){for(int i0;isize;i){consumer.accept(array[i]);}}//Iterator 是个接口要有实现类//迭代器遍历Overridepublic IteratorInteger iterator() {//java里叫匿名内部类return new IteratorInteger() {int i0;Overridepublic boolean hasNext() {//有没有下一个严肃return isize;}Overridepublic Integer next() {//返回当前元素并移动到下一个元素return array[i];}};}public IntStream stream(){//IntStream 传的数字不仅有有效数字还有无效的 eg1,2,3,4,0,0,0,0return IntStream.of(Arrays.copyOfRange(array,0,size));} public static void main(String[] args) {System.out.println(Hello world!);DynamicArray dynamicArray new DynamicArray();dynamicArray.addLast(1);dynamicArray.addLast(2);dynamicArray.addLast(3);dynamicArray.addLast(4);dynamicArray.add(2,5);for(int i0;i5;i){System.out.println(dynamicArray.get(i));}//迭代器遍历for(Integer element:dynamicArray){//hasnext()、next()方法System.out.println(element);}}
删除 public int remove(int index){ //[0...size]int removedarray[index];if(indexsize-1) {//java数组中移动元素的方法System.arraycopy(array, index 1, array, index, size - index - 1);}size--;return removed;}
对比数据是否一致断言
assertEquals(3,removed);
assertIterable(List.of(1,2,4,5),dynamicArray); 容量不够先扩容 private void checkAndGrow() {//容量检查if(size0){arraynew int[capacity];}if(sizecapacity){//进行扩容1.5 1.618 2capacitycapacity1;int [] newArraynew int[capacity];System.arraycopy(array,0,newArray,0,size);arraynewArray;}}
插入或删除性能
头部位置时间复杂度是O(n)
中间位置时间复杂度是O(n)
尾部位置时间复杂度是O(1) 全部代码
package org.example;import java.util.Iterator;
import java.util.Arrays;
import java.util.function.Consumer;
import java.util.stream.IntStream;//动态数组
public class DynamicArray implements IterableInteger{private int size; // 逻辑大小private int capacity8; // 容量// private int[] arraynew int[capacity];private int[] array{};//向最后的位置[size]添加元素public void addLast(int element){array[size]element;size;}//向[0....size]位置添加元素public void add(int index,int element){checkAndGrow();//未考虑数组扩容问题if(size0indexsize) {//进行一个拷贝System.arraycopy(array, index, array, index 1, size - index);array[index] element;size;} else if(indexsize){//addLastarray[index]element;size;}}private void checkAndGrow() {//容量检查if(size0){arraynew int[capacity];}if(sizecapacity){//进行扩容1.5 1.618 2capacitycapacity1;int [] newArraynew int[capacity];System.arraycopy(array,0,newArray,0,size);arraynewArray;}}public void add1(int index,int element){if(size 0 index size){System.arraycopy(array,index,array,index1,size-index);}array[index]element;size;}//查询元素public int get(int index){//[0....size]return array[index];}//打印每个元素public void foreach(){for (int i0;isize;i){System.out.println(array[i]);}}//函数式接口//遍历方法1consumer接口 遍历执行的操作每个元素入参public void foreach1(ConsumerInteger consumer){for(int i0;isize;i){consumer.accept(array[i]);}}//Iterator 是个接口要有实现类//迭代器遍历Overridepublic IteratorInteger iterator() {//java里叫匿名内部类return new IteratorInteger() {int i0;Overridepublic boolean hasNext() {//有没有下一个严肃return isize;}Overridepublic Integer next() {//返回当前元素并移动到下一个元素return array[i];}};}public IntStream stream(){//IntStream 传的数字不仅有有效数字还有无效的 eg1,2,3,4,0,0,0,0return IntStream.of(Arrays.copyOfRange(array,0,size));}public int remove(int index){ //[0...size]int removedarray[index];if(indexsize-1) {//java数组中移动元素的方法System.arraycopy(array, index 1, array, index, size - index - 1);}size--;return removed;}}二维数组
从行开始遍历比从列开始遍历更快。
局部性原理空间方面 cpu读取内存速度慢数据后会将其放入高速缓存速度快中当中如果后来的计算机再用到此数据在缓存中能读到的话就不必读内存了。 缓存的最小存储单位是缓存行一般是64bytes一次读的数据少了不划算因此最少读64bytes填满一个缓存行因此读入某一个数据时也会读取其临近的数据这就是所谓的空间局部性。