当前位置:首页 > 其他资源 >

java怎么创建数组

时间:已被314人关注

java数组怎么调用类中的方法?java怎么在方法里创建数组?java中数组的建立

码农之家

java中如何创建对象数组

24小时54分钟前回答

public static void main(String[] args) {
//创建数组的第一种方法
int[] arr=new int[6];
int intValue=arr[5];
//System.out.println(intValue);
//创建数组的第二种方法
int[] x={1,2,3,4};
//System.out.println(x[1]);

//创建数组的第三种方法。
int[] y= new int[]{1,2,3,4,5};
int m=0;
boolean length = isLength(m,y);
if(length){
System.out.println(y[m]);
}else{
System.err.println("数组标越界");
}	

}
//判断数组下标是否越界
public static boolean isLength(int m,int arr[]){
boolean flag=false;
int length = arr.length;
if(m<length)
flag=true;
return flag;
}

Java创建数组的几种方式

1、一维数组的声明方式:

type[] arrayName; 或 type arrayName[];
附:推荐使用第一种格式,因为第一种格式具有更好的可读性,表示type[]是一种引用类型(数组)而不是type类型。建议不要使用第二种方式
下面是典型的声明数组的方式:

// 声明整型数组
 int[] intArray0 ;
 int intArray1 [];
 // 声明浮点型数组
 float floatArray0 [];
 float[] floatArray1 ;
 // 声明布尔型数组
 boolean boolArray0 [];
 boolean[] boolArray1 ;
 // 声明字符型数组
  char charArray0 [];
 char[] charArray1 ;
 // 声明字符串数组
 String stringArray0[];
 String[] stringArray1;
 // 错误的声明数组的方式,声明数组的时候不能指定其大小
 // int [5] intErrorArray0;
  // int intErrorArray1[5];

注:Java语言中声明数组时不能指定其长度(数组中元素的个数),这是因为数组是一种引用类型的变量,,因此使用它定义一个变量时,仅仅表示 定义了一个引用变量(也就是定一个了一个指针),这个引用变量还未指向任何有效的内存,所以定义数组时不能指定数组的长度。而且由于定义数组仅仅只是定一 个引用变量,并未指向任何有效的内存空间,所以还没有内存空间来存储数组元素,因此这个数组也不能使用,只有在数组进行初始化后才可以使用。

40546

2、一维数组的创建

Java中使用关键字new创建数组对象,格式为:数组名 = new 数组元素的类型 [数组元素的个数]

 // 创建数组,如果在创建的同时不初始化数组则必须指定其大小
intArray0 = new int[3];
// 错误的创建数组的方式,如果创建数组时不指定大小则必须初始化
// intArray1 = new int[];
// 创建数组时,不指定数组大小则必须在创建的同时初始化数组
  intArray1 = new int[]{0,1,2};

使用new创建数组对象但是分配数组时会自动为数组分配默认值,具体如下:

System.out.println( "intArray0[0]=" + intArray0 [0]);
floatArray0 = new float[3];
System. out.println("floatArray0[0]=" + floatArray0[0]);
boolArray0 = new boolean[3];
System. out.println("boolArray0[0]=" + boolArray0[0]);
charArray0 = new char[3];
System. out.println("charArray0[0]=" + charArray0[0]);
stringArray0 = new String[3];
System. out.println("stringArray0[0]=" + stringArray0[0]);

输出如下

 intArray0[0]=0
 floatArray0[0]=0.0
 boolArray0[0]=false
 charArray0[0]=
 stringArray0[0]=null

附: 一旦使用new关键字为数组分配了内存空间,每个内存空间存储的内容就是数组元素的值,也就是数组元素就有了初始值,即使这个内存空间存储的内容是空,这 个空也是一个值null。也就是说不可能只分配内容空间而不赋初始值,即使自己在创建数组对象(分配内容空间)时没有指定初始值,系统也会自动为其分配
附:诸如基础数据类型的包装类,其默认的初始化值均为null,因为基础数据类型的包装类创建的数组属于引用数组(对象数组),对象数组默认的初始化值都是null

3、一维数组的初始化

数组的初始化分为静态初始化、动态初始化和默认初始化:
静态初始化是数组在初始化时由程序员显式指定每个数组元素的初始值而数组长度由系统决定。
动态初始化是数组在初始化时只指定数组长度,由系统为数组元素分配初始值。

     a、数组静态初始化的语法格式:
     arrayName = new type[]{element1,element2,element3...}或者使用简化的语法格式:arrayName = {element1,element2,element3...}
     b、数组动态初始化的语法格式:
     arrayName = new type[length];

附:静态初始化时不能指定元素个数,而动态初始化时则必须指定元素个数。静态初始化时数组能够知道元素的个数所以不需要指定,而动态初始化时数组元素个数未知因此必须指定。

// 静态初始化
 int intArray2 [] = new int[]{20,21,22};
  // 静态初始化简化方式
 int intArray3 [] = {30,31,32};
  // 动态初始化
 int[] intArray4 = new int[3];          
 // 错误写法:静态初始化不能指定元素个数
 // int intErrorArray5[] = new int[3]{50,51,52};
 // 错误写法:动态初始化必须指定元素个数
 // int intErrorArray6[] = new int[];

注:一维数组这一块记住两点,数组声明的时候是不能指定大小的,也就是说等号左边的中括号中不能包含数字。另外一旦使用new关键字那么肯定在内存中为数组分配了空间,则必然数组有默认值。数组是对象数据类型
注:不要静态初始化和动态初始化同时使用,也就是说不要再进行数组初始化时,既指定数组长度,也为每个数组元素分配初始值。
4、数组进行动态初始化时系统分配初始值的规则

     数组元素类型是基本类型中的整数类型(byte、short、int、long),则数组元素的值是0
     数组元素类型是基本类型中的浮点类型(float、double),则数组元素的值是0.0
     数组元素类型是基本类型中的字符类型(char),则数组元素的值是'\u0000'
     数组元素类型是基本类型中的布尔类型(boolean),则数组元素的值是false
     数组元素类型是基本类型中的引用类型(类、接口、数组),则数组元素的值是null

附:这部分源代码:

package javabase;

public class CreateArray {
       public static void main(String args[]){
             /**************数组的声明*******************/
             // 声明整型数组
             int[] intArray0 ;
             int intArray1 [];
             // 声明浮点型数组
             float floatArray0 [];
             float[] floatArray1 ;
             // 声明布尔型数组
             boolean boolArray0 [];
             boolean[] boolArray1 ;
             // 声明字符型数组
             char charArray0 [];
             char[] charArray1 ;
             // 声明字符串数组
            String stringArray0[];
            String[] stringArray1;
             // 错误的声明数组的方式,声明数组的时候不能指定其大小
             // int [5] intErrorArray0;
             // int intErrorArray1[5];
            
             /*********************数组的创建***********************/
             // 创建数组,如果在创建的同时不初始化数组则必须指定其大小
             intArray0 = new int[3];
             // 错误的创建数组的方式,如果创建数组时不指定大小则必须初始化
             // intArray1 = new int[];
             // 创建数组时,不指定数组大小则必须在创建的同时初始化数组
             intArray1 = new int[]{0,1,2};
            System. out.println("intArray0[0]=" + intArray0[0]);
             floatArray0 = new float[3];
            System. out.println("floatArray0[0]=" + floatArray0[0]);
             boolArray0 = new boolean[3];
            System. out.println("boolArray0[0]=" + boolArray0[0]);
             charArray0 = new char[3];
            System. out.println("charArray0[0]=" + charArray0[0]);
             stringArray0 = new String[3];
            System. out.println("stringArray0[0]=" + stringArray0[0]);
            
             /**********************数组的初始化*************************/
             // 静态初始化
             int intArray2 [] = new int[]{20,21,22};
             // 静态初始化简化方式
             int intArray3 [] = {30,31,32};
             // 动态初始化
             int[] intArray4 = new int[3];
            
             // 错误写法:静态初始化不能指定元素个数
             // int intErrorArray5[] = new int[3]{50,51,52};
             // 错误写法:动态初始化必须指定元素个数
             // int intErrorArray6[] = new int[];
            
            System. out.println("intArray2[0]=" +intArray2 [0]);
            System. out.println("intArray3[0]=" +intArray3 [0]);
            System. out.println("intArray4[0]=" +intArray4 [0]);
      }
}

 

已被648人点赞
查看更多

java中数组插入与删除指定元素的方法及实例分享

4小时10分钟前回答

今天学了Java的数组,写了数组的插入和删除,本人小白,写给不会的小白看,大神请忽略,有错请大家指出来;

/**
给数组指定位置数组的插入
*/
import java.util.*;
public class ArrayInsert{
  public static void main(String []args){
    System.out.println("请用键盘输入5个数:");
    int [] array =new int[10];
    Scanner sc=new Scanner(System.in);
    //通过键盘向数组输入数
    for(int i=0;i<array.length-5;i++){
      array[i]=sc.nextInt();
    }
    //遍历数组
    System.out.print("原数组为:");
    for(int a:array){
      System.out.print(" "+a);
    }
    //向指定的位置插入数
    System.out.println("\n请输入插入位置:有效位置为0-----"+(array.length-1));
    int index=sc.nextInt();
    System.out.println("\n请输入插入的值-----");
    int num=sc.nextInt();

    //调用静态函数index
    //遍历插入后的数组
      System.out.println("插入元素之后的数组遍历:");
      Insert(index,num,array);
       for(int i=0;i<array.length;i++){
      System.out.print(" "+array[i]);
    }
  }
  //向数组指定位置插入数据方法
  public static int[] Insert(int index,int num,int a[]){
      //如果有元素,在索引之后的元素向后移一位,
      for(int  a[i]=a[i-1];
      }
      a[index]=num;
 return a;   
  }
}
//删除数组指定位置的数字。
import java.util.*;
public class ArrayDelete{
  public static void main(String args[]){
    System.out.println("请用键盘输入5个数:");
    int [] array =new int[10];
    Scanner sc=new Scanner(System.in);
    //通过键盘向数组输入数
    for(int i=0;i<array.length-5;i++){
      array[i]=sc.nextInt();
    }
    //遍历数组
    System.out.print("原数组为:");
    for(int a:array){
      System.out.print(" "+a);
    }
    //删除在指定位置的数字
    System.out.println("\n输入你要删除的位置: 范围在0---"+(array.length-1));
    int index=sc.nextInt();
    delete(index,array);//调用delete方法
    //删除之后的遍历
    System.out.println("删除之后的遍历:");
    for(int i=0;i<array.length;i++){
      System.out.print(" "+array[i]);
    }
  }
  public static int[] delete(int index,int array[]){
    //根据删除索引,把数组后面的向前移一位
    for(int i=index;i<array.length;i++){
      if(i!=array.length-1){
        array[i]=array[i+1];
      }else{//处理最后一位超出情况
      array[i]=array[i];
      }
    }
    return array;
  }
}

以上这篇JAVA中数组插入与删除指定元素的实例代码就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持码农之家。

已被883人点赞
查看更多

详解javascript 数组的sort方法

12小时15分钟前回答

在javascript中,数组对象有一个有趣的方法sort,它接收一个类型为函数的参数作为排序的依据。这意味着开发者只需要关注如何比较两个值的大小,而不用管“排序”这件事内部是如何实现的。不过了解一下sort的内部实现也不是一件坏事,何不深入了解一下呢?

算法课上,我们会接触很多种排序算法,什么冒泡排序、选择排序、快速排序、堆排序等等。那么javascript的sort方法采用哪种排序算法呢?要搞清楚这个问题,呃,直接看v8源代码好了。v8中对Array.sort的实现是采用javascript完成的,粗看下来,使用了快速排序算法,但明显比我们熟悉的快速排序要复杂。那么到底复杂在什么地方?为什么要搞这么复杂?这是我们今天要探讨的问题。

快速排序算法

快速排序算法之所以被称为快速排序算法,是因为它能达到最佳和平均时间复杂度均为O(nlogn),是一种应用非常广泛的排序算法。它的原理并不复杂,先找出一个基准元素(pivot,任意元素均可),然后让所有元素跟基准元素比较,比基准元素小的,放到一个集合中,其他的放到另一个集合中;再对这两个集合执行快速排序,最终得到完全排序好的序列。

所以快速排序的核心是不断把原数组做切割,切割成小数组后再对小数组进行相同的处理,这是一种典型的分治的算法设计思路。实现一个简单的快速排序算法并不困难。我们不妨试一下:

function QuickSort(arr, func) {
	if (!arr || !arr.length) return [];
	if (arr.length === 1) return arr;
	var pivot = arr[0];
	var smallSet = [];
	var bigSet = [];
	for (var i = 1; i < arr.length; i++) {
		if (func(arr[i], pivot) < 0) {
			smallSet.push(arr[i]);
		} else {
			bigSet.push(arr[i]);
		}
	}
	return QuickSort(smallSet, func).concat([pivot]).concat(QuickSort(bigSet, func));
}

这是一个非常基础的实现,选取数组的第一项作为基准元素。

原地(in-place)排序

我们可以注意到,上面的算法中,我们其实是创建了一个新的数组作为计算结果,从空间使用的角度看是不经济的。javascript的快速排序算法中并没有像上面的代码那样创建一个新的数组,而是在原数组的基础上,通过交换元素位置实现排序。所以,类似于push、pop、splice这几个方法,sort方法也是会修改原数组对象的!

我们前面说过,快速排序的核心在于切割数组。那么如果只是在原数组上交换元素,怎么做到切割数组呢?很简单,我们并不需要真的把数组切割出来,只需要记住每个部分起止的索引号。举个例子,假设有一个数组[12, 4, 9, 2, 18, 25],选取第一项12为基准元素,那么按照原始的快速排序算法,会把这个数组切割成两个小数组:[4, 9, 2], 12, [18, 25]。但是我们同样可以不切割,先通过比较、交换元素,将原数组修改成[4, 9, 2, 12, 18, 25],再根据基准元素12的位置,认为0~2号元素是一组,4~5号元素是一组,为了表述方便,我这里将比基准元素小的元素组成的分区叫小数分区,另一个分区叫大数分区。这很像电脑硬盘的分区,并不是真的把硬盘分成了C盘、D盘,而是记录下一些起止位置,在逻辑上分成了若干个分区。类似的,在快速排序算法中,我们也把这个过程叫做分区(partition)。所以相应的,我也要修改一下之前的说法了,快速排序算法的核心是分区。

说了这么多,还是实现一个带分区的快速排序吧:

function swap(arr, from, to) {
	if (from == to) return;
	var temp = arr[from];
	arr[from] = arr[to];
	arr[to] = temp;
}
 
function QuickSortWithPartition(arr, func, from, to) {
	if (!arr || !arr.length) return [];
	if (arr.length === 1) return arr;
	from = from || 0;
	to = to || arr.length - 1;
	var pivot = arr[from];
	var smallIndex = from;
	var bigIndex = from + 1;
	for (; bigIndex <= to; bigIndex++) {
		if (func(arr[bigIndex], pivot) < 0) {
			smallIndex++;
			swap(arr, smallIndex, bigIndex);
		}
	}
	swap(arr, smallIndex, from);
	QuickSortWithPartition(arr, func, from, smallIndex - 1);
	QuickSortWithPartition(arr, func, smallIndex + 1, to);
	return arr;
}

看起来代码长了很多,不过并不算复杂。首先由于涉及到数组元素交换,所以先实现一个swap方法来处理元素交换。快速排序算法中,增加了两个参数,from和to,分别表示当前要处理这个数组的哪个部分,from是起始索引,to是终止索引;如果这两个参数缺失,则表示处理整个数组。

同样的,我用最简单的方式选取基准元素,即所要处理分区的第一个元素。然后我定义了smallIndex和bigIndex两个变量,分别表示的是左侧小数分区的终止索引和右侧大数分区的终止索引。什么意思?就是说从第一个元素(基准元素)到第smallIndex个元素间的所有元素都比基准元素小,从第smallIndex + 1到第bigIndex个元素都比基准元素大。一开始没有比较时,很显然这两部分分区都是空的,而比较的过程很简单,直接是bigIndex向右移,一直移到分区尾部。每当bigIndex增加1,我们会进行一次判断,看看这个位置上的元素是不是比基准元素大,如果大的话,不用做处理,它已经处于大数分区了;但如果比基准元素小,就需要进行一次交换。怎么交换呢?首先将smallIndex增加1,意味着小数分区增加了一个元素,但此时smallIndex位置的元素很明显是一个大数(这个说法其实不对,如果之前大数分区里面没有元素,此时smallIndex和bigIndex相等,但对交换没有影响),而在bigIndex位置的元素是一个小数,所以只要把这两个位置的元素交换一下就好了。

最后可别忘了一开始的起始元素,它的位置并不正确,不过只要将它和smallIndex位置的元素交换位置就可以了。同时我们得到了对应的小数分区[from...smallIndex - 1]和大数分区[smallIndex + 1...to]。再对这两个分区递归排序即可。

分区过程的优化

上面的分区过程(仅仅)还是有一定的优化空间的,因为上面的分区过程中,大数分区和小数分区都是从左向右增长,其实我们可以考虑从两侧向中间遍历,这样能有效地减少交换元素的次数。举个例子,例如我们有一个数组[2, 1, 3, 1, 3, 1, 3],采用上面的分区算法,一共碰到三次比基准元素小的情况,所以会发生三次交换;而如果我们换个思路,把从右往左找到小于基准和元素,和从左往右找到大于基准的元素交换,这个数组只需要交换一次就可以了,即把第一个3和最后一个1交换。

我们也来尝试写一下实现:

function QuickSortWithPartitionOp(arr, func, from, to) {
	if (!arr || !arr.length) return [];
	from = from || 0;
	to = to || arr.length - 1;
	if (from >= to - 1) return arr;
	var pivot = arr[from];
	var smallEnd = from + 1;
	var bigBegin = to;
	while (smallEnd < bigBegin) {
		while (func(arr[bigBegin], pivot) > 0 && smallEnd < bigBegin) {
			bigBegin--;
		}
		while (func(arr[smallEnd], pivot) < 0 && smallEnd < bigBegin) {
			smallEnd++;
		}
		if (smallEnd < bigBegin) {
			swap(arr, smallEnd, bigBegin);
		}
	}
	swap(arr, smallEnd, from);
	QuickSortWithPartitionOp(arr, func, from, smallEnd - 1);
	QuickSortWithPartitionOp(arr, func, smallEnd + 1, to);
	return arr;
}

分区与性能

前面我们说过,快速排序算法平均时间复杂度是O(nlogn),但它的最差情况下时间复杂度会衰弱到O(n2)。而性能好坏的关键就在于分区是否合理。如果每次都能平均分成相等的两个分区,那么只需要logn层迭代;而如果每次分区都不合理,总有一个分区是空的,那么需要n层迭代,这是性能最差的场景。

那么性能最差的场景会出现吗?对于一个内容随机的数组而言,不太可能出现最差情况。但我们平时在编程时,处理的数组往往并不是内容随机的,而是很可能预先有一定顺序。设想一下,如果一个数组已经排好序了,由于之前的算法中,我们都是采用第一个元素作为基准元素,那么必然会出现每次分区都会有一个分区为空。这种情况当然需要避免。

一种很容易的解决方法是不要选取固定位置的元素作为基准元素,而是随机从数组里挑出一个元素作为基准元素。这个方法很有效,极大概率地避免了最差情况。这种处理思想很简单,我就不另外写代码了。

然而极大概率地避免最差情况并不等于避免最差情况,特别是对于数组很大的时候,更要求我们在选取基准元素的时候要更谨慎些。

三数取中(median-of-three)

基准元素应当精心挑选,而挑选基准元素的一种方法为三数取中,即挑选基准元素时,先把第一个元素、最后一个元素和中间一个元素挑出来,这三个元素中大小在中间的那个元素就被认为是基准元素。

简单实现一下获取基准元素的方法:

function getPivot(arr, func, from, to) {
	var middle = (from + to) >> 1;
	var i0 = arr[from];
	var i1 = arr[to];
	var i2 = arr[middle];
	var temp;
	if (func(i0, i1) > 0) {
		temp = i0;
		i0 = i1;
		i1 = temp;
	}
	if (func(i0, i2) > 0) {
		arr[middle] = i0;
		arr[from] = i2;
		arr[to] = i1;
		return i0;
	} else {
		arr[from] = i0;
		if (func(i1, i2) > 0) {
			arr[middle] = i1;
			arr[to] = i2;
			return i1;
		} else {
			arr[middle] = i2;
			arr[to] = i1;
			return i2;
		}
	}
}

这个例子里我完全没管基准元素的位置,一是降低复杂度,另一个原因是下面讨论重复元素处理时,基准元素的位置没什么意义。不过我把最小的值赋给了第一个元素,最大的值赋给了第二个元素,后面处理重复元素时会有帮助。

当然,仅仅是三数取中获得的基准元素,也不见得是可靠的。于是有一些其他的取中值的方法出现。有几种比较典型的手段,一种是平均间隔取一个元素,多个元素取中位数(即多取几个,增加可靠性);一种是对三数取中进行递归运算,先把大数组平均分成三块,对每一块进行三数取中,会得到三个中值,再对这三个中值取中位数。

不过查阅v8的源代码,发现v8的基准元素选取更为复杂。如果数组长度不超过1000,则进行基本的三数取中;如果数组长度超过1000,那么v8的处理是除去首尾的元素,对剩下的元素每隔200左右(200~215,并不固定)挑出一个元素。对这些元素排序,找出中间的那个,并用这个元素跟原数组首尾两个元素一起进行三数取中。这段代码我就不写了。

针对重复元素的处理

到目前为止,我们在处理元素比较的时候比较随意,并没有太多地考虑元素相等的问题。但实际上我们做了这么多性能优化,对于重复元素引起的性能问题并没有涉及到。重复元素会带来什么问题呢?设想一下,一个数组里如果所有元素都相等,基准元素不管怎么选都是一样的。那么在分区的时候,必然出现除基准元素外的其他元素都被分到一起去了,进入最差性能的case。

那么对于重复元素应该怎么处理呢?从性能的角度,如果发现一个元素与基准元素相同,那么它应该被记录下来,避免后续再进行不必要的比较。所以还是得改分区的代码。

function QuickSortWithPartitionDump(arr, func, from, to) {
	if (!arr || !arr.length) return [];
	from = from || 0;
	to = to || arr.length - 1;
	if (from >= to - 1) return arr;
	var pivot = getPivot(arr, func, from, to);
	var smallEnd = from;
	var bigBegin = to;
	for (var i = smallEnd + 1; i < bigBegin; i++) {
		var order = func(arr[i], pivot);
		if (order < 0) {
			smallEnd++;
			swap(arr, i, smallEnd);
		} else if (order > 0) {
			while (bigBegin > i && order > 0) {
				bigBegin--;
				order = func(arr[bigBegin], pivot);
			}
			if (bigBegin == i) break;
			swap(arr, i, bigBegin);
			if (order < 0) {
				swap(arr, i, smallEnd);
				smallEnd++;
			}
		}
	}
	QuickSortWithPartitionDump(arr, func, from, smallEnd);
	QuickSortWithPartitionDump(arr, func, bigBegin, to);
	return arr;
}

简单解释一下这段代码,上文已经说过,在getPivot方法中,我将比基准小的元素放到第一位,把比基准大的元素放到最后一位。定义三个变量smallEnd、bigBegin、i,从from到smallEnd之间的元素都比基准元素小,从smallEnd到i之间的元素都和基准元素一样大,从i到bigBegin之间的元素都是还没有比较的,从bigBegin到to之间的元素都比基准元素大。了解这个关系就好理解这段代码了。遍历从smallEnd + 1到bigBegin之间的元素:
* 如果这个元素小于基准,那么smallEnd增加1,这时smallEnd位置的元素是等于基准元素的(或者此时smallEnd与i相等),交换smallEnd与i处的元素就可以了。
* 如果这个元素大于基准,相对比较复杂一点。此时让bigBegin减小1,检查大数分区前面一个元素是不是大于基准,如果大于基准,重复此步骤,不断让bigBegin减小1,直到找到不比基准大的元素(如果这个过程中,发现bigBegin与i相等,则中止遍历,说明分区结束)。找到这个不比基准大小元素时需要区分是不是比基准小。如果比基准小,需要做两步交换,先将i位置的大数和bigBegin位置的小数交换,这时跟第一种case同时,smallEnd增加1,并且将i位置的小数和smallEnd位置的元素交换。如果和基准相等,则只需要将i位置的大数和bigBegin位置的小数交换。
* 如果这个元素与基准相等,什么也不用做。

小数组优化

对于小数组(小于16项或10项。v8认为10项以下的是小数组。),可能使用快速排序的速度还不如平均复杂度更高的选择排序。所以对于小数组,可以使用选择排序法要提高性能,减少递归深度。

function insertionSort(a, func, from, to) {
	for (var i = from + 1; i < to; i++) {
		var element = a[i];
		for (var j = i - 1; j >= from; j--) {
			var tmp = a[j];
			if (func(tmp, element) > 0) {
				a[j + 1] = tmp;
			} else {
				break;
			}
		}
		a[j + 1] = element;
	}
}

v8引擎没有做的优化

由于快速排序的不稳定性(少数情况下性能差,前文已经详细描述过),David Musser于1997设计了内省排序法(Introsort)。这个算法在快速排序的基础上,监控递归的深度。一旦长度为n的数组经过了logn层递归(快速排序算法最佳情况下的递归层数)还没有结束的话,就认为这次快速排序的效率可能不理想,转而将剩余部分换用其他排序算法,通常使用堆排序算法(Heapsort,最差时间复杂度和最优时间复杂度均为nlogn)。

v8引擎额外做的优化

快速排序递归很深,如果递归太深的话,很可以出现“爆栈”,我们应该尽可能避免这种情况。上面提到的对小数组采用选择排序算法,以及采用内省排序算法都可以减少递归深度。不过v8引擎中,做了一些不太常见的优化,每次我们分区后,v8引擎会选择元素少的分区进行递归,而将元素多的分区直接通过循环处理,无疑这样的处理大大减小了递归深度。我大致把v8这种处理的过程写一下:

function quickSort(arr, from, to){
  while(true){
    // 排序分区过程省略
    // ...
    
    if (to - bigBegin < smallEnd - from) {
      quickSort(a, bigBegin, to);
      to = smallEnd;
    } else {
      quickSort(a, from, smallEnd);
      from = bigBegin;
    }
  }
}

不得不说是一个很巧妙的实现。

总结

不知不觉这篇文章写了这么长。本来想对比各种优化之间的性能差异,现在看来也没有什么必要。虽然快速排序算法是一个很容易很基础的算法,但我相信很多人并没有能够这么深入地去了解、去优化一个算法。而读过了v8引擎对于这么一个简单算法的实现后,我发现它并没有简单地为了实现一个算法而去实现,而是确确实实地尽一切可能去提高算法效率,去消除可能引起性能问题的因素。结论是你真的可以放心地使用Array.sort方法,它的性能令人放心。那么剩下问题的就是:作为开发者,我们应该如何编写。

本文基于署名-非商业性使用 3.0许可协议发布,转载、演绎必须保留本文的署名周骅,且不得用于商业目的。如您有任何疑问或者授权方面的协商,请与我联系。

已被374人点赞
查看更多

Java数组越界问题代码详解

26小时30分钟前回答

Java中数组初始化和OC其实是一样的,分为动态初始化和静态初始化,

动态初始化:指定长度,由系统给出初始化值

静态初始化:给出初始化值,由系统给出长度

在我们使用数组时最容易出现的就是数组越界问题,好了,这里有个简单的例子

     int [][] array = {{1,2,3},{1,4}};
    System.out.println(array[1][2]);

这是一个二维数组,很明显,数组越界了,控制台中会打印如下信息:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2

 at demo.Array.main(Array.java:31)

很准确的定位到31行。

下面看看一个完整的代码示例:

package home_work_4_17;
abstract class Employee{
	abstract double earnings();
}
class YearWorker extends Employee{
	double earnings(){
		System.out.println("按年领取1000");
		return 1000;
	}
}
class MonthWorker extends Employee{
	double earnings(){
		System.out.println("按月领取100");
		return 100;
	}
}
class WeekWorker extends Employee{
	double earnings(){
		System.out.println("按星期领取10");
		return 10;
	}
}
class Company{
	int n;
	//该公司的人数
	public Company(int n) {
		this.n=n;
		// TODO Auto-generated constructor stub
	}
	Employee E[]=new Employee[n];
	double cal(){
		//返回薪水综合
		double sum=0;
		for (int j=0;j<n;j++){
			sum+=E[j].earnings();
		}
		return sum;
	}
}
public class work_2 {
	public static void main(String args[]) {
		Company c=new Company(3);
		c.E[0]=new WeekWorker();
		c.E[1]=new MonthWorker();
		c.E[2]=new YearWorker();
		System.out.println("总支出:"+c.cal());
	}
}

编译器显示数组越界错误。

经检查发现划线部分语句出错

应当做如下修改:

class Company{
  int n;  //该公司的人数
   Employee E[]; 
  public Company(int n) {
    this.n=n;// TODO Auto-generated constructor stub
    E=new Employee[n];  
   }
  double cal(){    //返回薪水综合
    double sum=0;
    for(int j=0;j<n;j++){
      sum+=E[j].earnings();
    }
    return sum;
  }
}

出错原因是:当Company构造方法中并未对数组E进行初始化操作,故而E数组大小仍然为0,发生数组越界错误。

利用上述错误方式编写的测试程序如下:

package test_a;
class people{
  int n;
  Student s[]=new Student[n];
  public people(int n) {
    this.n=n;// TODO Auto-generated constructor stub
  }
}
class Student{
  int number;
}
public class Cdcs {
  public static void main(String args[]) {
    people p=new people(3);
    System.out.println(p.s.length);
  }
}

输出结果为0。即数组大小为零。

总结

以上就是本文关于Java数组越界问题实例解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:Java异常退出条件的判断示例代码、Java编程异常处理最佳实践【推荐】等。有什么问题可以随时留言,小编会及时回复大家的。

已被525人点赞
查看更多

java判断数组中的数值是否连续相邻的方法总结

16小时31分钟前回答

* 判断一个数组中的数值是否连续相邻

* 满足以下条件:

* 1.0是例外可以反复出现 0可以通配任何字符
* 2.相同的数值不会重复出现
* 3.该数组可以是乱序的
* 当数组不含有0时满足最大值-最小值=n(数组长度)-1
* 当数组数组含有0时.满足最大值-最小值<n(数组长度)-1

* 所以,当最大值最大值-最小值>n(数组长度)-1时,一定不是连续相邻数组

package datastruct.usearray;
public class JudgeAdjacent {
	  private static boolean judege(int a[]) {
		  int min=Integer.MAX_VALUE;
		  int max=Integer.MIN_VALUE;
		 
		  for (int i = 0; i < a.length; i++) {
			 if (a[i]!=0) {
				 if (min>a[i]) {
					min=a[i];
				}
				 if (max<a target="_blank">a.length-1) {
			return false;
		}else {
			return true;
			
		}
		  
	}
    public static void main(String[] args) {
     int a[]={8,5,0,10,6,7,0,0};
			if (judege(a)) {
				System.out.println("该数组是相邻的!");
			}else {
				System.out.println("该数组不是相邻的!");
			}
		}
}
</a>

以上这篇java 判断一个数组中的数值是否连续相邻的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持码农之家。

已被278人点赞
查看更多

分享JavaScript中数组及对象合并方法示例代码

16小时44分钟前回答

1 数组合并

1.1 concat 方法

var a=[1,2,3],b=[4,5,6];
var c=a.concat(b);
console.log(c);// 1,2,3,4,5,6
console.log(a);// 1,2,3 不改变本身 

1.2 循环遍历

var arr1=['a','b'];
var arr2=['c','d','e'];
for(var i=0;i<arr2.length;i++){
   arr1.push(arr2[i]) 
}
console.log(arr1);//['a','b','c','d','e']

1.3 apply

合并数组arr1和数组arr2,使用Array.prototype.push.apply(arr1,arr2)  or arr1.push.apply(arr1,arr2);

var arr1=['a','b'];
var arr2=['c','d','e'];
Array.prototype.push.apply(arr1,arr2);
//或者
arr1.push.apply(arr1,arr2);<br>console.log(arr1) //['a','b','c','d','e']

2 对象合并

2.1 $.extend()

var obj1= {'a': 1};
var obj2= {'b': 1};
var c = $.extend(obj1, obj2); 
console.log(obj1); // {a: 1, b: 1} obj1已被修改 
//或者 <br>var obj3 = $.extend({}, obj1, obj2) <br>console.log(obj3); //{a: 1, b: 1} 不会改变obj1,obj2

2.2 遍历赋值

var obj1={'a':1};
var obj2={'b':2,'c':3};
for(var key in obj2){
   if(obj2.hasOwnProperty(key)===true){  <br>   //此处hasOwnProperty是判断自有属性,
使用 for in 循环遍历对象的属性时,原型链上的所有属性都将被访问会避免原型对象扩展带来的干扰
      obj1[key]=obj2[key];
} 
}
console.log(obj1);//{'a':1,'b':2,'c':3};

2.3 Obj.assign()

  可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。

Object.assign(target, ...sources)
//a. 复制一个对象<br>var obj = { a: 1 ,b:2};
var copyObj = Object.assign({}, obj);
console.log(copyObj); // { a: 1,b:2 }<br><br>//b.合并多个对象 
var o1 = { a: 1 };
var o2 = { b: 2 };
var o3 = { c: 3 };
var obj = Object.assign(o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }
console.log(o1); // { a: 1, b: 2, c: 3 }, 且目标对象自身也会改变。 

2.4 对象的深拷贝和浅拷贝

2.4.1 浅拷贝

var obj1={'a':1};
var obj2={'b':{'b1':22,'b2':33}};
$.extend(obj1, obj2);  //obj1拷贝了obj2的属性
console.log(obj1) // {'a':1,'b'{'b1':22,'b2':33}}
console.log(obj1.b.b1) // 22
obj2.b.b1=44;  //obj2重新赋值
console.log(obj1.b.b1) // 44 obj1.b仅拷贝了对象的指引,所以受原obj2的影响

2.4.2 深拷贝

var obj1={'a':1};
var obj2={'b':{'b1':22,'b2':33}};
$.extend(true,obj1, obj2);  //第一个参数设为true表示深复制
console.log(obj1) // {'a':1,'b'{'b1':22,'b2':33}}
console.log(obj1.b.b1) // 22
obj2.b.b1=44;  //obj2重新赋值
console.log(obj1.b.b1) // 22 obj1拷贝了obj2的所有属性以及值,并不受obj2的影响

总结

以上所述是小编给大家介绍的JavaScript中的数组合并方法和对象合并方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对码农之家网站的支持!

已被863人点赞
查看更多

javascript中数组用法整理

20小时27分钟前回答

前言

从事前端到现在也有快两年了,平时也会收集整理一些笔记放在印象笔记,不过收集过之后就在没有看过,经大佬指点,真正掌握一个知识点,最好的方式就是用自己的话把内容讲明白,就开始将以前零散的东西整合一下,和各位道友一起提高。

操作数组

印象中数组有很多方法,系统的整理一下,放在自己家里方便回头查~

Array.map()

此方法是将数组中的每个元素调用一个提供的函数,结果作为一个新的数组返回,并没有改变原来的数组

let arr = [1, 2, 3, 4, 5]
  let newArr = arr.map(x => x*2)
  //arr= [1, 2, 3, 4, 5]  原数组保持不变
  //newArr = [2, 4, 6, 8, 10] 返回新数组

Array.forEach()

此方法是将数组中的每个元素执行传进提供的函数,没有返回值,直接改变原数组,注意和map方法区分

let arr = [1, 2, 3, 4, 5]
  num.forEach(x => x*2)
  // arr = [2, 4, 6, 8, 10] 数组改变,注意和map区分

Array.filter()

此方法是将所有元素进行判断,将满足条件的元素作为一个新的数组返回

let arr = [1, 2, 3, 4, 5]
  const isBigEnough => value => value >= 3
  let newArr = arr.filter(isBigEnough )
  //newNum = [3, 4, 5] 满足条件的元素返回为一个新的数组

Array.every()

此方法是将所有元素进行判断返回一个布尔值,如果所有元素都满足判断条件,则返回true,否则为false:

let arr = [1, 2, 3, 4, 5]
  const isLessThan4 => value => value < 4
  const isLessThan6 => value => value < 6
  arr.every(isLessThan4 ) //false
  arr.every(isLessThan6 ) //true

Array.some()

此方法是将所有元素进行判断返回一个布尔值,如果存在元素都满足判断条件,则返回true,若所有元素都不满足判断条件,则返回false:

let arr= [1, 2, 3, 4, 5]
  const isLessThan4 => value => value < 4
  const isLessThan6 => value => value > 6
  arr.some(isLessThan4 ) //true
  arr.some(isLessThan6 ) //false

Array.reduce()

 此方法是所有元素调用返回函数,返回值为最后结果,传入的值必须是函数类型:

let arr = [1, 2, 3, 4, 5]
  const add = (a, b) => a + b
  let sum = arr.reduce(add)
  //sum = 15 相当于累加的效果
  与之相对应的还有一个 Array.reduceRight() 方法,区别是这个是从右向左操作的

Array.push()

此方法是在数组的后面添加新加元素,此方法改变了数组的长度:

Array.pop()

此方法在数组后面删除最后一个元素,并返回数组,此方法改变了数组的长度:

let arr = [1, 2, 3, 4, 5]
  arr.pop()
  console.log(arr) //[1, 2, 3, 4]
  console.log(arr.length) //4

Array.shift()

 此方法在数组后面删除第一个元素,并返回数组,此方法改变了数组的长度:

let arr = [1, 2, 3, 4, 5]
  arr.shift()
  console.log(arr) //[2, 3, 4, 5]
  console.log(arr.length) //4 

Array.unshift()

此方法是将一个或多个元素添加到数组的开头,并返回新数组的长度:

let arr = [1, 2, 3, 4, 5]
  arr.unshift(6, 7)
  console.log(arr) //[6, 7, 2, 3, 4, 5]
  console.log(arr.length) //7 

Array.isArray()

判断一个对象是不是数组,返回的是布尔值

Array.concat()

此方法是一个可以将多个数组拼接成一个数组:

let arr1 = [1, 2, 3]
   arr2 = [4, 5]
 let arr = arr1.concat(arr2)
 console.log(arr)//[1, 2, 3, 4, 5]

Array.toString()

此方法将数组转化为字符串:

let arr = [1, 2, 3, 4, 5];
  let str = arr.toString()
  console.log(str)// 1,2,3,4,5

Array.join()

此方法也是将数组转化为字符串:

let arr = [1, 2, 3, 4, 5];
  let str1 = arr.toString()
  let str2 = arr.toString(',')
  let str3 = arr.toString('##')
  console.log(str1)// 12345
  console.log(str2)// 1,2,3,4,5
  console.log(str3)// 1##2##3##4##5

通过例子可以看出和toString的区别,可以设置元素之间的间隔~

Array.splice(开始位置, 删除的个数,元素)

万能方法,可以实现增删改:

let arr = [1, 2, 3, 4, 5];
   let arr1 = arr.splice(2, 0 'haha')
   let arr2 = arr.splice(2, 3)
   let arr1 = arr.splice(2, 1 'haha')
   console.log(arr1) //[1, 2, 'haha', 3, 4, 5]新增一个元素
   console.log(arr2) //[1, 2] 删除三个元素
   console.log(arr3) //[1, 2, 'haha', 4, 5] 替换一个元素

结尾

第一次写,都是很简单的数组用法,千里之行始于足下,重新把基础夯实一下,如果存在错误或者表达不当,还望及时告知,thx

以上所述是小编给大家介绍的js中数组常用方法总结详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对码农之家网站的支持!

已被459人点赞
查看更多

java中字符串数组、字符串、整形之间的转换详解

39小时28分钟前回答

字符串数组转字符串(只能通过for循环):

String[] str = {"abc", "bcd", "def"};
StringBuffer sB = new StringBuffer();
for (int i = 0; i < str.length;i++)
{
	  sB.append(str[i]);
}
String s = sB.toString();

字符数组转字符串可以通过下面的方式:

char[] data = {"abc","bcd","def"};
String s = new String(data);

字符串到字符数组:

String str = "123abc";
char[] ar = str.toCharArray();
  //char数组
for (int i =0;i<ar.length;i++)
{
	  System.out.println(ar[i]);
	  //1 2 3 a b c
}
String[] arr = str.split("");
for (int i =0;i<arr.length;i++)  //String数组,不过arr[0]为空
{
	System.out.println(arr[i]);
	  //空 1 2 3 a b c
}

整形到字符串:

String str = Integer.toString(i);

字符串到整形:

int i = Integer.valueOf(str).intValue();

总结

以上就是本文关于浅谈java中字符串数组、字符串、整形之间的转换的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:Java编程将汉字转Unicode码代码示例、Java语言实现反转链表代码示例、Java编程实现时间和时间戳相互转换实例、Javabean和map相互转化方法代码示例等,有什么问题可以随时留言,小编会及时回复大家的。感谢朋友们对本站的支持!

已被192人点赞
查看更多

Java中数组与集合的相互转换知识点分享

6小时21分钟前回答

这篇文章主要介绍了Java中数组与集合的相互转换实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

  • List转数组:采用集合的toArray()方法
  • 数组转List:采用Arrays的asList()方法

数组转换为集合

注意:在数组转集合的过程中,要注意是否使用了视图的方式直接返回数组中的数据。以Arrays.asList()为例,它把数组转换成集合时,不能使用其修改集合相关的方法,它的add/remove/clear方法会抛出 UnsupportedOperationException异常。

这是因为Arrays.asList体现的是适配器模式,后台的数据仍是原有数组。asList的返回对象是一个Arrays的内部类,它并没有实现集合个数的相关修改操作,这也是抛出异常的原因。

集合转数组

集合转数组相对简单,一般在适配别人接口的时候常常用到

代码例子

public class Main {
  public static void main(String[] args) {

    //1.数组转换为集合
    String[] strs = new String[3];
    strs[0] = "a";
    strs[1] = "b";
    strs[2] = "c";
    List<String> stringList = Arrays.asList(strs);
    System.out.println(stringList);
    //1.1注意:直接使用add、remove、clear方法会报错
//    stringList.add("abc");
    //1.2如果想要正常的使用add等修改方法,需要重新new一个ArrayList
    List<String> trueStringList = new ArrayList<>(Arrays.asList(strs));
    trueStringList.add("abc");
    System.out.println(trueStringList);

    //2.集合转数组
    List<Integer> integerList = new ArrayList<>();
    integerList.add(1);
    integerList.add(2);
    integerList.add(3);

    //新生成的数组大小一定要大于原List的大小
    Integer[] integers = new Integer[3];
    integerList.toArray(integers);
    System.out.println(Arrays.asList(integers));
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持码农之家。

已被496人点赞
查看更多

JavaScript原生数组Array的用法总结

20小时58分钟前回答

栈方法

push方法和pop方法, 可以使数组的行为类似于栈, 先进后出, 并且推入和弹出操作只发生在一端.

push方法

push方法可以接收一个或多个参数, 把它们追加到数组末尾, 并返回修改后数组的长度.

var arr = ['a', 'b', 'c', 'd', 'e'];
var temp = arr.push('f');
console.info('temp: ' + temp); // temp: 6
console.info(arr); // ["a", "b", "c", "d", "e", "f"]

temp = arr.push('g', 'h');
console.info('temp: ' + temp); // temp: 8
console.info(arr); // ["a", "b", "c", "d", "e", "f", "g", "h"]

合并两个数组

我们可以通过Array.prototype.push.apply()来合并两个数组, 示例如下:

var arr1 = ['a', 'b', 'c'],
  arr2 = ['x', 'y', 'z'];
var temp = Array.prototype.push.apply(arr1, arr2);
console.info(arr1); // ["a", "b", "c", "x", "y", "z"]
console.info(arr2); // ["x", "y", "z"]
console.info(temp); // 6

pop方法

pop方法是将数组的最后一项移除, 将数组长度减1, 并返回移除的项.

var arr = ['a', 'b', 'c', 'd', 'e'];
var temp = arr.pop();
console.info('temp: ' + temp); // temp: e
console.info('length: ' + arr.length); // length: 4

如果在一个空数组上使用pop方法, 则返回undefined

队列方法

队列的访问规则是先进先出, 并且队尾添加项, 队头移除项. push方法和shift方法结合使用, 就可以像操作队列一样操作数组.

shift方法

shift方法将移除数组的第一项, 将数组长度减1, 并返回移除的项.

var arr = ['a', 'b', 'c', 'd', 'e'];
var temp = arr.shift();
console.info('temp: ' + temp); // temp: a
console.info('length: ' + arr.length); // length: 4

unshift方法

相反地, 还有一个unshift方法, 它的用途与shift方法相反
unshift也可以在接收一个或多个参数, 把它们依次添加到数组的前端, 并返回修改后数组的长度.

var arr = ['a', 'b', 'c', 'd', 'e'];
var temp = arr.unshift('x', 'y', 'z');
console.info('temp: ' + temp); // temp: 8
console.info(arr); // ["x", "y", "z", "a", "b", "c", "d", "e"]

重排序方法

sort方法和reverse方法

sort方法和reverse方法是可以直接用来重排序的两个方法.
其中, reverse方法是用来反转数组的.

var arr = [1, 3, 2, 5, 4];
arr.reverse();
console.info(arr); // [4, 5, 2, 3, 1]

关于sort方法, 默认情况下, 它是对数组的每一项进行升序排列, 即最小的值在前面. 但sort方法会调用toString方法将每一项转成字符串进行比较(字符串通过Unicode位点进行排序), 那么这种比较方案在多数情况下并不是最佳方案. 例如:

var arr = [1, 3, 2, 5, 4];
arr.sort();
console.info(arr); // [1, 2, 3, 4, 5]

arr = [1, 5, 10, 20, 25, 30];
arr.sort();
console.info(arr); // [1, 10, 20, 25, 30, 5]

因此, sort方法可以接收一个比较函数作为参数, 由我们来决定排序的规则. 比较函数接收两个参数, 如果第一个参数小于第二个参数(即第一个参数应在第二个参数之前)则返回一个负数, 如果两个参数相等则返回0, 如果第一个参数大于第二个参数则返回一个正数, 例如:

var arr = [1, 5, 10, 20, 25, 30];
arr.sort(function(value1, value2){
  if(value1 < value2) {
    return -1;
  } else if(value1 > value2) {
    return 1;
  } else {
    return 0;
  }
});
console.info(arr); // [1, 5, 10, 20, 25, 30]

操作方法

concat方法

concat方法可以将多个数组合并成一个新的数组. concat可以接收的参数可以是数组, 也可以是非数组值.

var arr1 = ['a', 'b', 'c'],
  arr2 = ['x', 'y', 'z'],
  val = 'hello';
var temp = arr1.concat(val, arr2);
console.info('arr1: ' + arr1); // arr1: a,b,c
console.info('arr2: ' + arr2); // arr2: x,y,z
console.info('val: ' + val); // val: hello
console.info('temp: ' + temp); // temp: a,b,c,hello,x,y,z

concat方法并不操作原数组, 而是新创建一个数组, 然后将调用它的对象中的每一项以及参数中的每一项或非数组参数依次放入新数组中, 并且返回这个新数组.

concat方法并不操作调用它的数组本身, 也不操作各参数数组, 而是将它们的每个元素拷贝一份放到新创建的数组中. 而拷贝的过程, 对于对象类型来说, 是将对象引用复制一份放到新数组中, 而对于基本类型来说, 是将其值放到新数组中.

slice方法

slice方法可以基于源数组中的部分元素, 对其进行浅拷贝, 返回包括从开始到结束(不包括结束位置)位置的元素的新数组.

var arr = ['a', 'b', 'c', 'd', 'e'];
var temp1 = arr.slice(),
  temp2 = arr.slice(1),
  temp3 = arr.slice(1, 2);
console.info(arr); // ["a", "b", "c", "d", "e"]
console.info(temp1); // ["a", "b", "c", "d", "e"]
console.info(temp2); // ["b", "c", "d", "e"]
console.info(temp3); // ["b"]

从示例中可以看出:

  1. slice方法并没有操作原数组, 而是创建了一个新的数组.
  2. 当没有传参数给slice方法时, 则返回从索引0开始拷贝的新数组.
  3. 传入一个参数, 如: arr.slice(1), 表示从索引1位置开始拷贝, 一直到原数组的最后一个元素.
  4. 传入两个参数, 如: arr.slice(1, 2), 表示从索引1位置开始拷贝, 一直拷贝到位置2但不包括位置2上的元素.

参数如果为负数, 表示从数组最后面的元素可以算起.

slice方法同样不操作调用它的数组本身, 而是将原数组的每个元素拷贝一份放到新创建的数组中. 而拷贝的过程, 也于concat方法相同.

splice方法

splice方法可以用途删除或修改数组元素. 它有如下几种用法:

删除:
当给splice方法中传入一个或两个参数时, 就可以从数组中删除任意元素.
传入一个参数: 要删除的的第一个元素的位置, 此时将会删除从要删除的第一个元素的位置起, 后面的所有元素.
传入两个参数: 要删除的第一个元素的位置和要删除的项数,
返回值均为删除的元素组成的数组, 例如:

var arr = ['a', 'b', 'c', 'd', 'e'];
var temp = arr.splice(2);
console.info(arr); // ["a", "b"]
console.info(temp); // ["c", "d", "e"]

arr = ['a', 'b', 'c', 'd', 'e'];
temp = arr.splice(2, 2);
console.info(arr); // ["a", "b", "e"]
console.info(temp); // ["c", "d"]

插入:
使用splice方法可以向数组的指定位置插入任务数量的元素, 此时需要提供三个参数: 起始位置(要插入的位置), 0(表示要删除的项数, 0为不删除), 要插入的元素, 如果要插入多个元素可以添加更多的参数, 例如:

var arr = ['a', 'b', 'c', 'd', 'e'];
var temp = arr.splice(2, 0, 'x', 'y', 'z');
console.info(arr); // ["a", "b", "x", "y", "z", "c", "d", "e"]
console.info(temp); // [], 并没有删除元素

替换:
当splice接收三个参数, 且第二个参数不为0时, 可达到在数组中替换元素的效果. 例如:

var arr = ['a', 'b', 'c', 'd', 'e'];
var temp = arr.splice(2, 2, 'x', 'y', 'z');
console.info(arr); // ["a", "b", "x", "y", "z", "e"]
console.info(temp); // ["c", "d"]

此示例表示, 从arr数组的位置为2的元素起, 删除2个元素, 并在位置2添加三个元素.
如果移除的元素个数不等于添加的元素个数, 那么数组的长度将发生变化.

另外,
从ECMAScript5开始, 还提供了数组的迭代方法, 归并方法等, 这些方法将在后面做出补充.

已被929人点赞
查看更多
参考资料
2019校招面java试题库(含答案解析)
2019校招面java试题库(含答案解析) 高清版

本题库均来自海量真实校招面试题目大数据进行的整理,内含解析和答案,需要严肃说明的是:面试题库作为帮助同学准备面试的辅助资料,但是绝对不能作为备考唯 一途径,因为面试是一个考察真实水平的,不是背会了答案就可以的,需要你透彻理解的,否则追问问题答不出来反而减分,毕竟技术面试中面试官最痛恨的就是背答案这个事情了。 学完这个题库,把此题库都理解透彻应对各家企业面试完全没有问题。(当然,要加上好的 项目以及透彻掌

立即下载
HTML5+CSS3+JavaScript从入门到精通
HTML5+CSS3+JavaScript从入门到精通 原书影印版

本书以基础知识、示例、实战案例相结合的方式详尽讲述了HTML,CSS,JavaScript及目前最新的前端技术

立即下载
大话JAVA性能优化
大话JAVA性能优化 高清版

《大话Java性能优化》 主要提供Java性能调优方面的参考建议及经验交流。作者力求做到知识的综合传播,而不是仅仅只针对Java虚拟机调优进行讲解,另外力求每一章节都有实际的案例支撑。具

立即下载
Java攻略 Java常见问题的简单解法
Java攻略 Java常见问题的简单解法 原书完整版

这书以案例方式撰写,包含Java8和Java9的新特点,并得出了70多个能够 用以具体开发设计的实例,致力于让用户把握怎样运用这种新特点来处理开发设计中碰到的各种各样难题。这书致力于让用

立即下载
实战Java高并发程序设计
实战Java高并发程序设计 立即下载

Copyright 2018-2021 www.xz577.com 码农之家

版权投诉 / 书籍推广:520161757@qq.com