浅谈javascript和java中的数组

javascript中的数组

  • 数组的创建

  1. 直接创建方式  var str = [‘java‘, ‘js‘];
  2. 使用new创建方式: var a = new Array(10);  //  定义长度为10的数组(可变)
  3. 另类new创建方式:var a = new Array(1, 2, 3, 4, 5);  var b = [1, 2, 3, 4, 5];
  4. 二维数组(多维)创建方式:var a = new Array([1,2,3], [4,5,6], [7,8,9]);  var b = [[1,2,3], [4,5,6], [7,8,9]];

创建数组注意事项:js中的数组长度、类型都是“动态性”的。即长度可变、类型多样。

  • 数组的判别

面试的时候经常会被问道:js中怎么判断一个变量是数组类型?

   答案有很多,这里我列举一下我所知道的一些判断方法

 1 //千万别犯这种错误
 2 console.log(typeof [])  //object
 3 // 方法一
 4 var arr = [1,2,3];
 5 console.log(arr.constructor === Array)//true
 6 //方法二
 7 console.log(arr instanceof Array) //true
 8 //方法三
 9 console.log(Object.prototype.toString.call(arr) === ‘[object Array]‘)//true
10 //方法四
11 Array.isArray(arr) //es5 新方法 
  • 数组的常用方法

  1. arr. push();// 将一个或多个新元素添加到数组结尾,并返回数组新长度
  2. arr.unshift();// 将一个或多个新元素添加到数组开始,返回数组新长度
  3. arr.splice(arg1,arg2,arg3); //增删改都可以,非常强大
  4. arr.pop(); //移除最后一个元素并返回该元素值
  5. arr.shift(); //移除最前一个元素并返回该元素值,数组中元素自动前移
  6. arr.slice(start, [end]); //以数组的形式返回数组的一部分,注意不包括 end 对应的元素
  7. arrayObj.reverse(); //反转元素(最前的排到最后、最后的排到最前)
  8. arrayObj.sort(); //对数组元素排序,返回数组地址
  9. es5 新增的数组方法,详情见下面代码

 1 //代码来自网络,大致能表达我的意思
 2 // 定义一个数组,存储不同数据类型的元素
 3 var array = [8, 2, 1, 5],
 4     array2 = [
 5         [0, 1],
 6         [1, 2],
 7         [2, 3]
 8     ],
 9     value;
10
11 /// Array.prototype.reduce = function(callback,initialValue) {};
12 // 化解数组:
13 // 调用reduce 方法提供的回调函数,
14 // 总共调用 数组的lenght - 1次 回调函数
15 // 第一次时 previousValue 为 initialValue
16 // 此后 reduce方法的返回值 作为 previousValue
17
18 // reduceRight 则从数组最右边开始,进行上述操作
19
20 // 数组中元素累加
21 value = array.reduce(function (previousValue, currentValue, index, array) {
22         return previousValue + currentValue;
23     }
24 );
25 console.log(value);  // 16
26
27 // 数组扁平化
28 value = array2.reduce(function (previousValue, currentValue, index, array) {
29         return previousValue.concat(currentValue);
30     }
31 );
32 console.log(value); // [ 0, 1, 1, 2, 2, 3 ]
33
34 /// Array.prototype.indexOf = function(searchElement,fromIndex) {};
35 // 从fromIndex索引处 向后寻找searchElement元素 找到并返回其索引,否则返回-1
36 // fromIndex 默认为 0
37 console.log(array.indexOf(1)); // 2
38 console.log(array.indexOf(3)); // -1
39
40 /// Array.prototype.lastIndexOf = function(searchElement,fromIndex) {};
41 // 从fromIndex索引处 向前寻找searchElement元素 找到并返回其索引,否则返回-1
42 console.log(array.lastIndexOf(1)); // 2
43 console.log(array.lastIndexOf(3)); // -1
44
45 /// Array.prototype.every = function(callback,thisObject) {};
46 // 测试数组的所有元素是否都通过了指定函数的测试
47 value = array.every(function (element, index, array) {
48     return element > 1;
49 });
50 console.log(value); // false
51
52
53 /// Array.prototype.filter = function(callback,thisObject) {};
54 // 数组过滤:
55 // 返回通过函数测试的 元素(当回调函数的返回true,表明元素通过测试 ),生成新的数组
56 value = array.filter(function (element, index, array) {
57     return element > 1;
58 });
59 console.log(value);// [ 8, 2, 5 ]
60
61
62 /// Array.prototype.forEach = function(callback,thisObject) {};
63 // 为每个数组元素执行一次回调函数。
64 array.forEach(function (element, index, array) {
65     console.log(element);
66 });
67
68
69 /// Array.prototype.map = function(callback,thisObject) {};
70 // 数组映射:
71 // 返回一个由原数组中的每个元素调用一个指定方法后的返回值组成的新数组。
72 value = array.map(function (element, index, array) {
73     return element * element;
74 });
75 console.log(value); // [ 64, 4, 1, 25 ]
76
77
78 /// Array.prototype.some = function(callback,thisObject) {};
79 // 测试数组中的某些元素是否通过了指定函数的测试。
80 value = array.some(function (element, index, array) {
81     return element > 1;
82 });
83 console.log(value); // true
84
85
86 /// Array.prototype.isArray = function(object) {};
87 // 判断元素是否为数组类型
88 console.log(Array.isArray(array)); // true

  这是我在谷歌浏览器查找的数组全部方法属性 截图如下

  

  • 数组的重要知识点

  1. 数组是传递引用的
1 var x = [1, 9, 8];
2 var y = x;
3 x[0] = 2;
4 console.log(y[0]);//2 

  2. 联合数组

1 var arr=[];
2 arr[‘a‘]=1;
3 arr[‘b‘]=2;
4 console.log(a.length);//0  数组是对象类型,当然js中一切皆为对象!!!

  3.类数组。

  JavaScript和DOM中有很多类数组对象,它们只是类似数组,而不是数组,并不能使用数组的特有方法,如slice、push、pop等。

  arguments

  getElementsByName(name)

  getElementsByClassName(className)

  getElementsByTagName(tagName)

  document.forms //所有form元素

  document.images //所有img元素

  document.links //所有带href属性的a元素和area元素

  .......

  类数组转为真正的数组方法:Array.prototype.slice.call(arguments);

  4.稀疏数组。

  稀疏数字就是包含从0开始的不连续索引的数组。

  稀疏数组的length属性值大于元素的个数. 代码如下

var a=[];
a[100]=23;
console.log(a.length);//101

  5.作为数组的字符串

  个人理解是:可索引的字符串。

var s="javascript";
console.log(s[1]);//a 标准的字符串方法应该是s.charAt(1)
//数组和字符串方法可以灵活的相互利用
Array.prototype.join.call(s,"+");//j+a+v+a+s+c+r+i+p+t

  备注:push()、sort()、reverse()、splice()等数组方法会修改数组,但是在字符串上是无效的。因为字符串是不可变值!!!

java中的数组

  前言:JAVA数组与容器类主要有三方面的区别:效率、类型和保存基本类型的能力。在JAVA中,数组是一种效率最高的存储和随机访问对象引用序列的方式。数组就是一个简单的线性数列,这使得元素访问非常快速。但是为此付出的代价却是数组的大小被固定,并且在其生命周期中不可改变。

  • 数组的创建

  1. type[] 变量名 = new type[数组中元素的个数];
  2. type[] 变量名 = {"a","b"}
  3. java中数组长度不可变,类型一致
  4. 个人觉得java中直接用数组的机会不是很大,大多数都是用集合(很多方法都是基于数组)
  • 为什么需要数组

  当我们定义一个变量时可以使用一个变量名表示,但是如果出现很多的变量我们分别起变量名代替表示存储就比较麻烦了,为了解决这样的问题我们采用数组的形式表示存储,使用下标        表示每个变量。

  声明一个变量就是在内存中划出一块合适的空间;声明一个数组就是在内存中划出一串连续打的空间

  • 数组方法

   1、打印数组

int[] intArray = { 1, 2, 3, 4, 5 };
String intArrayString = Arrays.toString(intArray);

// print directly will print reference value
System.out.println(intArray);
// [[email protected]

System.out.println(intArrayString);
// [1, 2, 3, 4, 5]

  2、检查一个数组是否包含某个值

String[] stringArray = { "a", "b", "c", "d", "e" };
boolean b = Arrays.asList(stringArray).contains("a");
System.out.println(b);
// true

  3、 移除数组中的元素

int[] intArray = { 1, 2, 3, 4, 5 };
int[] removed = ArrayUtils.removeElement(intArray, 3);
System.out.println(Arrays.toString(removed));

  4、数组转为list

String[] stringArray = { "a", "b", "c", "d", "e" };
ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(stringArray));
System.out.println(arrayList);
// [a, b, c, d, e]

  5、数组转为set

Set<String> set = new HashSet<String>(Arrays.asList(stringArray));
System.out.println(set);
//[d, e, b, c, a]

  6、数组比较

Arrays提供了重载后的equals()方法,针对所有类型和Object类型都做了重载,用来比较整个数组。数组相等的条件是元素个数必须相等,并且对应位置的元素也相等。而多维数组的比较用deepEquals()方法。Array.equals()方法比较的两个数组必须是同类型的数组。

import java.util.Arrays;
public class javaArrayEquals{
    public static void main(String args[]){
        int[] arrayA = {1,2,3};
        int[] arrayB = {1,2,3,};
        int[] arrayC = new int[4]; //if int[] arrayC = new int[3],return true
        arrayC[0] = 1;
        arrayC[1] = 2;
        arrayC[2] = 3;
        System.out.println(Arrays.equals(arrayA, arrayB));
        System.out.println(Arrays.equals(arrayA, arrayC));

        String[][] arrayD = {{"a","b"},{"c","d"}};
        String[][] arrayE = {{"a","b"},{"c","d"}};
        System.out.println(Arrays.deepEquals(arrayD, arrayE));
    }
}

  7、集合更加强大。在开发中我们尽量用集合,而不是直接用数组解决问题

接下来的一个月,我要整天rhino、ps、手绘,应该不会过多的碰代码。因为不管怎么样,我必须得要顺利毕业吧!

时间: 2024-10-14 14:47:11

浅谈javascript和java中的数组的相关文章

浅谈javascript和java中的字符串

javascript字符串操作 一.字符串的创建 创建一个字符串有几种方法. 1.最简单的是用引号将一组字符包含起来  var myStr = "Hello, String!";// 在js中单双引号没有区别 2.可使用如下语句:var myStr1 = new String("Hello, String!"); 1 2 console.log(typeof myStr);//"string" console.log(typeof myStr1)

简谈 JavaScript、Java 中链式方法调用大致实现原理

相信,在 JavaScript .C# 中都见过不少链式方法调用,那么,其中实现该类链式调用原理,大家有没有仔细思考过?其中 JavaScript 类库:jQuery 中就存在大量例子,而在 C# 中,其中 lambda 表达式的大量使用以及扩展方法的新增,使链式调用也见的不少. 首先,就谈谈 JavaScript 中链式调用,其实,也是就是运用之前提及的 this . var Person=function(name,age){ this.Name=name; this.Age=age; };

浅谈Android和java中的多线程下载

为什么要使用多线程下载呢? 究其原因就一个字:"快",使用多线程下载的速度远比单线程的下载速度要快,说到下载速度,决定下载速度的因素一般有两个: 一个是客户端实际的网速,另一个则是服务端的带宽.我们经常使用的是单线程下载,也就是下载一个文件就是开启一个线程去请求下载资源. 这里我们不考虑客户端实际网速因素,因为这个因素多变,不好控制.我们主要考虑的因素就是服务端的带宽.那么服务端是如何给每个客户端分配 它的下载带宽的呢???它分配的原理大致是这样的,服务端只会给请求它的每个线程平均分配

源码浅谈(一):java中的 toString()方法

前言: toString()方法 相信大家都用到过,一般用于以字符串的形式返回对象的相关数据. 最近项目中需要对一个ArrayList<ArrayList<Integer>> datas  形式的集合处理. 处理要求把集合数据转换成字符串形式,格式为 :子集合1数据+"#"+子集合2数据+"#"+....+子集合n数据. 举例: 集合数据 :[[1,2,3],[2,3,5]]  要求转成为 "[1,2,3]#[2,3,5]"

《浅谈JavaScript系列》系列技术文章整理收藏

<浅谈JavaScript系列>系列技术文章整理收藏 1浅谈JavaScript中面向对象技术的模拟 2浅谈javascript函数劫持[转自xfocus]第1/3页 3浅谈javascript 面向对象编程 4老鱼 浅谈javascript面向对象编程 5浅谈javascript的数据类型检测 6浅谈Javascript嵌套函数及闭包 7根据一段代码浅谈Javascript闭包 8浅谈JavaScript编程语言的编码规范 9浅谈Javascript面向对象编程 10浅谈JavaScript

浅谈JavaScript中的原型模式

在JavaScript中创建对象由很多种方式,如工厂模式.构造函数模式.原型模式等: <pre name="code" class="html">//工厂模式 function createPerson(name,age,job) { var o = new Object; o.name = name; o.age = age; o.job = job; o.sayName = function() { alert(this.name); } retur

浅谈 JavaScript 编程语言的编码规范

对于熟悉 C/C++ 或 Java 语言的工程师来说,JavaScript 显得灵活,简单易懂,对代码的格式的要求也相对松散.很容易学习,并运用到自己的代码中.也正因为这样,JavaScript 的编码规范也往往被轻视,开发过程中修修补补,最终也就演变成为后续维护人员的恶梦.软件存在的长期价值直接与编码的质量成比例.编码规范能帮助我们降低编程中不必要的麻烦.而 JavaScript 代码是直接发送给客户浏览器的,直接与客户见面,编码的质量更应该受到关注. 本文浅谈 JavaScript 编程中关

浅谈javascript继承【读javascript设计模式第四章节继承有感】

javascript继承,无任是类式继承,原型式继承还是渗元式继承都是通过不同方法去围绕着prototype转,简单分析下三种不同继承方法是如何围绕prototype转的 一:类似继承,先上关键代码 function extend(subClass,supClass){ var fn = function(){}; fn.prototype = supClass.prototype; subClass.prototype = new fn(); subClass.prototype.constr

浅谈javascript函数劫持

http://www.xfocus.net/articles/200712/963.html 浅谈javascript函数劫持 文章提交:hkluoluo (luoluonet_at_hotmail.com) by luoluo on 2007-11-30 luoluonet_at_yahoo.cn http://www.ph4nt0m.org 一.概述 javascript函数劫持,也就是老外提到的javascript hijacking技术.最早还是和剑心同学讨论问题时偶然看到的一段代码,大