美文网首页
编程语言对比系列:二、数组的基本使用

编程语言对比系列:二、数组的基本使用

作者: oceanfive | 来源:发表于2018-03-01 11:33 被阅读85次

    文章大纲如下:

    [TOC]

    markdown[TOC] 语法在简书上好像没有效果。。。。。

    一、初始化 init array File URL Array

    OC init array File URL

    • 方法
        // 空数组
        + (instancetype)array;
        - (instancetype)init NS_DESIGNATED_INITIALIZER;
        
        // 通过一个元素构建数组
        + (instancetype)arrayWithObject:(ObjectType)anObject;
        
        // 通过多个元素构建数组
        + (instancetype)arrayWithObjects:(ObjectType)firstObj, ... NS_REQUIRES_NIL_TERMINATION;
        - (instancetype)initWithObjects:(ObjectType)firstObj, ... NS_REQUIRES_NIL_TERMINATION;
        
        // 通过其他数组
        + (instancetype)arrayWithArray:(NSArray<ObjectType> *)array;
        - (instancetype)initWithArray:(NSArray<ObjectType> *)array;
        // flag 为 YES 时进行“深拷贝”
        - (instancetype)initWithArray:(NSArray<ObjectType> *)array copyItems:(BOOL)flag;
        
        // 通过文件路径 file 或 url
        // 这两个方法带有 error 参数,11.0之后可以使用
        - (nullable NSArray<ObjectType> *)initWithContentsOfURL:(NSURL *)url error:(NSError **)error  API_AVAILABLE(macos(10.13), ios(11.0), watchos(4.0), tvos(11.0));
        + (nullable NSArray<ObjectType> *)arrayWithContentsOfURL:(NSURL *)url error:(NSError **)error API_AVAILABLE(macos(10.13), ios(11.0), watchos(4.0), tvos(11.0)) NS_SWIFT_UNAVAILABLE("Use initializer instead");
        // 下面的方法不带有 error 参数,后面会被废弃掉
        + (nullable NSMutableArray<ObjectType> *)arrayWithContentsOfFile:(NSString *)path;
        + (nullable NSMutableArray<ObjectType> *)arrayWithContentsOfURL:(NSURL *)url;
        - (nullable NSMutableArray<ObjectType> *)initWithContentsOfFile:(NSString *)path;
        - (nullable NSMutableArray<ObjectType> *)initWithContentsOfURL:(NSURL *)url;
        
        // 通过 c 语言数组
        - (instancetype)initWithObjects:(const ObjectType _Nonnull [_Nullable])objects count:(NSUInteger)cnt NS_DESIGNATED_INITIALIZER;
        + (instancetype)arrayWithObjects:(const ObjectType _Nonnull [_Nonnull])objects count:(NSUInteger)cnt;
        
        // 通用
        - (nullable instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER;
    
        // 可变数组 ----
        - (instancetype)initWithCapacity:(NSUInteger)numItems NS_DESIGNATED_INITIALIZER;
        + (instancetype)arrayWithCapacity:(NSUInteger)numItems;
    
    • 例子
        // 单个元素
        NSArray *array = [NSArray arrayWithObject:@1];
        NSLog(@"%@", array);
        // 输出:
        (
            1
        )
        
        // 多个元素
        NSArray *array = [NSArray arrayWithObjects:@1, @2, @3, @4, nil];
        NSLog(@"%@", array);
        // 输出:
        (
            1,
            2,
            3,
            4
        )
        
        // 通过其他数组
        NSArray *arr = @[@1, @2, @3, @4];
        NSArray *array = [NSArray arrayWithArray:arr];
        NSLog(@"%@", array);
        // 输出:
        (
            1,
            2,
            3,
            4
        )
        
        // 通过 文件 / url 
         NSArray *arrayFile = @[@1, @2, @3, @4];
        [arrayFile hy_writeToFileWithPath:HYAPPSandboxPathDocuments fileName:@"arrayFile.plist"];
        
        NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
        NSString *file = [filePath stringByAppendingPathComponent:@"arrayFile.plist"];
        NSArray *array = [[NSArray alloc] initWithContentsOfFile:file];
        NSLog(@"%@", array);
        
        NSError *error = nil;
        NSArray *array2 = [[NSArray alloc] initWithContentsOfURL:[NSURL fileURLWithPath:file] error:&error];
        if (!error) {
            NSLog(@"成功");
            NSLog(@"%@", array2);
        } else {
            NSLog(@"失败");
            NSLog(@"%@", error);
        }
        // 输出
        (
            1,
            2,
            3,
            4
        )
        成功
        (
            1,
            2,
            3,
            4
        )
        
        // 通过 c 语言数组
        NSString *strings[3];
        strings[0] = @"First";
        strings[1] = @"Second";
        strings[2] = @"Third";
        
        NSArray *stringsArray = [NSArray arrayWithObjects:strings count:2];
        NSLog(@"%@", stringsArray);
        // 输出:
        (
            First,
            Second
        )
    
    • 小结
      • 通过 单个元素多个元素其他数组NSArray文件fileurlc 语言数组 构建数组

    Java Array

    • 方法
        // 构造一个初始容量为 10 的空列表
        public ArrayList()
        // 构造一个具有指定初始容量(initialCapacity)的空列表
        public ArrayList(int initialCapacity)
        // 构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的。
        public ArrayList(Collection<? extends E> c)
    
    • 例子
        // 初始化
        ArrayList arrayList = new ArrayList();
        
        // 通过其他集合初始化
        ArrayList otherList = new ArrayList();
        otherList.add(1);
        otherList.add(2);
    
        ArrayList arrayList = new ArrayList(otherList);
        Log.e("数组", arrayList.toString());
        Log.e("数组", String.valueOf(arrayList.size()));
        // 输出:
        E/数组: [1, 2]
        E/数组: 2
    
    • 小结

    JS Array.from Array.of

    • 方法
        Array.from()
        Array.of(element0[, element1[, ...[, elementN]]])
    
    • 例子
        var array = Array.from('hello')
        console.log(array)
        // 输出:
        ["h", "e", "l", "l", "o"]
        
        // 我是分割线 ------
        var array = Array.of(1, 2, "9")
        console.log(array)
        // 输出:
        [1, 2, "9"]
    
    • 小结
      • Array.from() ,当传入参数为字符串时,可以作为字符串分割数据的方法

    小结

    • 相同点

    • 不同点

    二、长度 count size length

    OC count

    • 方法
        @property (readonly) NSUInteger count;
    
    • 例子
        NSArray *array;
        NSLog(@"%@ : %ld", array, array.count);
        array = [NSArray array];
        NSLog(@"%@ : %ld", array, array.count);
        array = @[@"hello"];
        NSLog(@"%@ : %ld", array, array.count);
        
        // 输出:
        (null) : 0
        (
        ) : 0
        (
            hello
        ) : 1
    
    • 小结
      • 数组为空 nil ,没有元素时,长度为0

    Java size

    • 方法
        public int size()
    
    • 例子
        ArrayList arrayList = new ArrayList();
        Log.e("数组", String.valueOf(arrayList.size()));
        arrayList.add(1);
        arrayList.add(2);
        Log.e("数组", String.valueOf(arrayList.size()));
        // 输出:
        E/数组: 0
        E/数组: 2
    
    • 小结

    JS length

    • 方法
        length
    
    • 例子
        var array = [1, 2, 3, 4, 5, 6];
        console.log(array.length)
        // 输出:
        6
    
    • 小结

    小结

    • 相同点

    • 不同点

      • occountJavasizeJSlength

    三、获取 AtIndex get array[]

    OC AtIndexfirstObject , lastObject

    • 方法
        // 快捷方式
        array[]
        
        // 获取 index 位置处的元素,index 超过数组范围会crash
        - (ObjectType)objectAtIndex:(NSUInteger)index;
        
        // 获取第一个元素
        @property (nullable, nonatomic, readonly) ObjectType firstObject API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
        
        // 获取最后一个元素
        @property (nullable, nonatomic, readonly) ObjectType lastObject;
        
        // 获取多个元素
        - (NSArray<ObjectType> *)objectsAtIndexes:(NSIndexSet *)indexes;
    
    • 例子
        NSArray *array = @[@1, @2, @3, @4];
        NSLog(@"%@", [array objectAtIndex:0]);
        NSLog(@"%@", array[0]);
        NSLog(@"%@", [array firstObject]);
        NSLog(@"%@", [array lastObject]);
        
        // 输出: (当传入参数为 -1 ,10 时 会crash)
        1
        1
        1
        4
    
    • 小结
      • 从数组 array 中获取下标为 index 的快捷方式 array[index] ,这种方式等价于 [array objectAtIndex:index]
      • 数组的下标从 0 开始,范围为 0length - 1,超过范围会crash

    Java get

    • 方法
        /**
         * 获取 index 位置处的元素, index 超过 数组范围 [0, size - 1] 会crash,即 index < 0 || index >= size()
         */
        public E get(int index)
    
    • 例子
        ArrayList arrayList = new ArrayList();
        arrayList.add(1);
        arrayList.add(2);
        Log.e("数组", String.valueOf(arrayList.get(0)));
        // 输出:
        E/数组: 1
        
        // 分割线 -------
        
        int[] numbers = new int[3];
        numbers[0] = 1;
        numbers[1] = 2;
        Log.e("数组", String.valueOf(numbers[1]));
    
    • 小结
      • 数组的下标从 0 开始,范围为 0size - 1,超过范围会crash

    JS filter find findIndex

    • 方法
        // 快捷方式
        array[]
        
        /**
         * 方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。
         * callback : 用来测试数组的每个元素的函数。调用时使用参数 (element, index, array)。返回true表示保留该元素(通过测试),false则不保留。
         * thisArg : 可选。执行 callback 时的用于 this 的值。
         * 返回值 : 一个新的通过测试的元素的集合的数组
         */
        var new_array = arr.filter(callback[, thisArg])
        
        /**
         * 方法返回数组中满足提供的测试函数的第一个元素的值。否则返回 undefined。
         * callback :在数组每一项上执行的函数。调用时使用参数 (element, index, array)。
         * thisArg :可选,指定 callback 的 this 参数。
         * 返回值 : 当某个元素通过 callback 的测试时,返回数组中的一个值,否则返回 undefined。
         */
         arr.find(callback[, thisArg])
         
        /**
         * 方法返回数组中满足提供的测试函数的第一个元素的索引。否则返回-1
         * callback :在数组每一项上执行的函数。调用时使用参数 (element, index, array)。
         * thisArg :可选,指定 callback 的 this 参数。
         * 返回值 : 当某个元素通过 callback 的测试时,返回数组中的一个值的索引 index ,否则返回 -1。
         */
         arr.findIndex(callback[, thisArg])
    
    • 例子
        var array = [1, 5, 15, 20, 30, 100, 200]
        console.log(array[1]) // 5
        console.log(array[-1]) // undefined
        console.log(array[100]) // undefined
        
        // 我是分割线 -------
        
        var array = [1, 5, 15, 20, 30, 100, 200]
        var result = array.filter(isBigEnough)
        console.log(result)
        
        function isBigEnough(element, index, array) {
            return element >= 10;
        }
        // 输出:
        [15, 20, 30, 100, 200]
        
        // 我是分割线 -------
        
        var array = [1, 5, 15, 20, 30, 100, 200]
        var result = array.find(isBigEnough)
        console.log(result)
        // 输出:
        15
        
        // 我是分割线 -------
        
        var array = [1, 5, 15, 20, 30, 100, 200]
        var result = array.findIndex(isBigEnough)
        console.log(result)
        // 输出:
        2
    
    • 小结
      • filter 是查找符合条件的 所有 元素find 是查找符合条件的 第一个 元素findIndex 是查找符合条件的 第一个 元素的 索引
      • 索引位置 index 的下标从 0 开始,范围为 0length - 1,超过范围获取到的是 undefined

    小结

    • 相同点

      • 如果数组的元素数目为 count , 则索引位置/下标范围为 [0, count - 1]
    • 不同点

      • ocjava 索引位置超过范围会 crash, js 不会报错,但是获取到的是 undefined

    四、增加 add insert addAll concat push unshift

    OC addinsert

    • 方法
        // 在 “末尾” 添加元素 ,“原来数组”不发生变化,返回一个新的数组
        - (NSArray<ObjectType> *)arrayByAddingObject:(ObjectType)anObject;
        
        // 在 “末尾” 添加其他数组
        - (NSArray<ObjectType> *)arrayByAddingObjectsFromArray:(NSArray<ObjectType> *)otherArray;
        
        // 可变数组 ---------
        // 在 末尾 添加元素
        - (void)addObject:(ObjectType)anObject;
        
        // 在 index 位置处 添加元素
        - (void)insertObject:(ObjectType)anObject atIndex:(NSUInteger)index;
        
        // 在 “末尾” 添加其他数组
        - (void)addObjectsFromArray:(NSArray<ObjectType> *)otherArray;
        
        // 把 objects 中的 集合索引 indexes 中的元素 依次取出,然后插入到 "源数组" 相应的 集合索引 indexes 中的位置处
        - (void)insertObjects:(NSArray<ObjectType> *)objects atIndexes:(NSIndexSet *)indexes;
    
    • 例子
        // 添加元素
        NSArray *array = @[@1, @2];
        NSArray *result = [array arrayByAddingObject:@4];
        NSLog(@"%@", result);
        // 输出:
        (
            1,
            2,
            4
        )
        
        // 添加其他数组
        NSArray *otherArray = @[@10, @11];
        NSArray *array = @[@1, @2];
        NSArray *result = [array arrayByAddingObjectsFromArray:otherArray];
        NSLog(@"%@", result);
        // 输出:
        (
            1,
            2,
            10,
            11
        )
        
        // 可变数组
        // 添加单个元素
        NSMutableArray *array = [NSMutableArray array];
        [array addObject:@1];
        NSLog(@"%@", array);
        // index 超过范围(-1 或 10)会 crash
        [array insertObject:@2 atIndex:0];
        NSLog(@"%@", array);
        
        // 输出:
        (
            1
        )
        (
            2,
            1
        )
        
        // 添加数组
        NSArray *otherArray = @[@10, @11];
        NSMutableArray *array = [NSMutableArray array];
        [array addObjectsFromArray:otherArray];
        NSLog(@"%@", array);
        // 输出:
        (
            10,
            11
        )
        
        // 插入到特定位置
        NSArray *otherArray = @[@10, @11];
        NSMutableIndexSet *set = [NSMutableIndexSet indexSet];
        [set addIndex:0];
        [set addIndex:3];
        NSMutableArray *array = [NSMutableArray arrayWithObjects:@1, @2, @3, @4, @5, nil];
        [array insertObjects:otherArray atIndexes:set];
        NSLog(@"%@", array);
        // 输出:
        (
            10,
            1,
            2,
            11,
            3,
            4,
            5
        )
    
    • 小结
      • NSArray “原来数组”不发生变化,返回新数组
      • NSMutableArray “原来数组”发生变化
      • 添加 nilNULL 元素 crash
      • 添加 @[][NSNull null] 元素 不会 crash
      • index 超过范围会 crash

    Java add addAll

    • 方法
        // 将元素e添加到此列表的尾部。
        public boolean add(E e)
        
        // 将元素element插入此列表中的指定位置index处。索引超过范围会crash
        public void add(int index, E element)
        
        // 将该 collection 中的所有元素添加到此列表的尾部, 如果指定的 collection 为 null 会 crash
        public boolean addAll(Collection<? extends E> c)
        
        // 将该 collection 中的所有元素添加到此列表中的指定位置index处, 如果指定的 collection 为 null 会 crash, 索引超过范围会crash
        public boolean addAll(int index, Collection<? extends E> c)
    
    • 例子
        ArrayList otherArray = new ArrayList();
        otherArray.add(1);
        otherArray.add(2);
    
        ArrayList arrayList = new ArrayList();
        arrayList.add(100);
        Log.e("数组", String.valueOf(arrayList));
        arrayList.add(0, 150);
        Log.e("数组", String.valueOf(arrayList));
        arrayList.addAll(otherArray);
        Log.e("数组", String.valueOf(arrayList));
        arrayList.addAll(1, otherArray);
        Log.e("数组", String.valueOf(arrayList));
        arrayList.add(null);
        Log.e("数组", String.valueOf(arrayList));
        // 输出:
        E/数组: [100]
        E/数组: [150, 100]
        E/数组: [150, 100, 1, 2]
        E/数组: [150, 1, 2, 100, 1, 2]
        E/数组: [150, 1, 2, 100, 1, 2, null]
    
    • 小结
      • addAll 方法,添加的集合为 nullcrash
      • add 方法,添加的元素为 null 不会 crash
      • 索引位置超过范围会 crash

    JS concat push unshift

    • 方法
        // 添加 “元素” 或 “数组”,返回新数组,源数组和添加数组的值不改变
        var new_array = old_array.concat(value1[, value2[, ...[, valueN]]])
        
        // 方法将一个或多个元素添加到数组的末尾,并返回新数组的长度。改变原数组的值
        arr.push(element1, ..., elementN)
        
        // 方法将一个或多个元素添加到数组的开头,并返回新数组的长度。改变原数组的值
        arr.unshift(element1, ..., elementN)
        
        // 在某个 索引位置 处添加的方法 使用 splice 方法
    
    • 例子
        var array = []
        var array1 = [1, 2]
        var result = array.concat(100, array1, 200)
        console.log(result)
        console.log(array)
        console.log(array1)
        // 输出:
        [100, 1, 2, 200]
        []
        [1, 2]
        
        // 分割线 ------
        
        var array = [1, 5]
        array.push(3, 10)
        console.log(array
        // 输出:
        [1, 5, 3, 10]
        
        // 分割线 ------
        
        var array = [1, 5, 15]
        array.unshift(3000)
        console.log(array)
        // 输出:
        [3000, 1, 5, 15]
            
        // 分割线 ------
        var array = [1, 2]
        array.push(null)
        array.push(undefined)
        console.log(array)
        // 输出:
        [1, 2, null, undefined]
    
    • 小结
      • 数组添加 null undefined 不会报错,并且存在于数组中

    小结

    • 相同点

      • ocjava 索引超过范围会 crashjs 不会
    • 不同点

      • oc 添加空值 nilNULL 元素 crash
      • java addAll 方法,添加的集合为 nullcrash
      • java add 方法,添加的元素为 null 不会 crash
      • js 添加空值 null undefined 不会报错,并且存在于数组中

    五、包含 contains includes

    OC contains

    • 方法
        - (BOOL)containsObject:(ObjectType)anObject;
    
    • 例子
        NSArray *array = @[@1, @2, @3, @4, @5];
        BOOL result = [array containsObject:@0];
        if (result) {
            NSLog(@"包含");
        } else {
            NSLog(@"不包含");
        }
        
        BOOL result2 = [array containsObject:@2];
        if (result2) {
            NSLog(@"包含");
        } else {
            NSLog(@"不包含");
        }
        
        // 输出:
        不包含
        包含
    
    • 小结

    Java contains

    • 方法
        // 是否包含元素 e
        public boolean contains(Object o)
        // 是否包含集合 c 中的所有元素 
        public boolean containsAll(Collection<?> c)
    
    • 例子
        ArrayList arrayList = new ArrayList();
        arrayList.add(1);
        arrayList.add(2);
        arrayList.add(3);
    
        Log.e("数组", String.valueOf(arrayList.contains(1)));
        Log.e("数组", String.valueOf(arrayList.contains(100)));
    
        ArrayList otherArray = new ArrayList();
        otherArray.add(1);
        otherArray.add(2);
        Log.e("数组", String.valueOf(arrayList.containsAll(otherArray)));
    
        otherArray.add(100);
        Log.e("数组", String.valueOf(arrayList.containsAll(otherArray)));
    
        // 输出:
        E/数组: true
        E/数组: false
        E/数组: true
        E/数组: false
    
    • 小结

    JS includes

    • 方法
        /**
         * 方法用来判断一个数组是否包含一个指定的值,如果包含则返回 true,否则返回false
         * searchElement :需要查找的元素
         * fromIndex :可选,从该索引处开始查找 searchElement。如果为负值,则按升序从 array.length + fromIndex 的索引开始搜索。默认为 0。
         * 返回值 :如果包含则返回 true,否则返回false
         * 1、如果fromIndex 大于等于数组长度 ,则返回 false 。该数组不会被搜索
         * 2、如果 fromIndex 为负值,计算出的索引(array.length + fromIndex)将作为开始搜索searchElement的位置。如果计算出的索引小于 0,则整个数组都会被搜索
         */
        arr.includes(searchElement, fromIndex)
    
    • 例子
        var array = [1, 5, 15, 20, 30, 100, 200]
        console.log(array.includes(1))
        console.log(array.includes(1, 2))
        console.log(array.includes(-200))
        console.log(array.includes(1, 20))
        console.log(array.includes(1, -100))
        // 输出:
        true
        false
        false
        false
        true
    
    • 小结
      • 如果 fromIndex 大于等于数组长度 ,则返回 false 。该数组不会被搜索
      • 如果 fromIndex 为负值,计算出的索引 (array.length + fromIndex) 将作为开始搜索 searchElement 的位置。如果计算出的索引 小于0 ,则整个数组都会被搜索

    小结

    • 相同点

    • 不同点

    六、查找 indexOf lastIndexOf

    OC indexOf

    • 方法
        // 获取 anObject 第一次出现的的索引位置,没有获取到返回 NSNotFound
        - (NSUInteger)indexOfObject:(ObjectType)anObject;
        - (NSUInteger)indexOfObject:(ObjectType)anObject inRange:(NSRange)range;
        - (NSUInteger)indexOfObjectIdenticalTo:(ObjectType)anObject;
        - (NSUInteger)indexOfObjectIdenticalTo:(ObjectType)anObject inRange:(NSRange)range;
        
        // todo
    typedef NS_OPTIONS(NSUInteger, NSBinarySearchingOptions) {
        NSBinarySearchingFirstEqual = (1UL << 8),
        NSBinarySearchingLastEqual = (1UL << 9),
        NSBinarySearchingInsertionIndex = (1UL << 10),
    };
        - (NSUInteger)indexOfObject:(ObjectType)obj inSortedRange:(NSRange)r options:(NSBinarySearchingOptions)opts usingComparator:(NSComparator NS_NOESCAPE)cmp API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0)); // binary search
    
    • 例子
        NSArray *array = @[@1, @2, @3, @4, @5, @2];
        NSLog(@"%ld", [array indexOfObject:@2]);
        NSLog(@"%ld", [array indexOfObject:@100]);
        NSLog(@"%ld", [array indexOfObject:@"2"]);
        NSLog(@"%ld", [array indexOfObject:@"100"]);
        NSLog(@"--------");
        NSLog(@"%ld", [array indexOfObjectIdenticalTo:@2]);
        NSLog(@"%ld", [array indexOfObjectIdenticalTo:@100]);
        NSLog(@"%ld", [array indexOfObjectIdenticalTo:@"2"]);
        NSLog(@"%ld", [array indexOfObjectIdenticalTo:@"100"]);
        
        // 输出:
        1
        9223372036854775807
        9223372036854775807
        9223372036854775807
        --------
        1
        9223372036854775807
        9223372036854775807
        9223372036854775807
    
    • 小结

    Java indexOf lastIndexOf

    • 方法
        // 此列表中第一次出现的指定元素的索引,如果列表不包含该元素,则返回 -1 
        public int indexOf(Object o)
        // 列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1 
        public int lastIndexOf(Object o)
    
    • 例子
        ArrayList arrayList = new ArrayList();
        arrayList.add(1);
        arrayList.add(2);
        arrayList.add(3);
        arrayList.add(2);
    
        Log.e("数组", String.valueOf(arrayList.indexOf(2)));
        Log.e("数组", String.valueOf(arrayList.indexOf(100)));
        Log.e("数组", String.valueOf(arrayList.lastIndexOf(2)));
        Log.e("数组", String.valueOf(arrayList.lastIndexOf(100)));
        
        // 输出:
        E/数组: 1
        E/数组: -1
        E/数组: 3
        E/数组: -1
    
    • 小结

    JS indexOf lastIndexOf

    • 方法
        /**
         * 方法返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1
         * searchElement : 要查找的元素
         * fromIndex :可选的参数,默认为0;开始查找的位置。
         * 1、如果 fromIndex 大于或等于数组长度,意味着不会在数组里查找,返回-1
         * 2、如果 fromIndex 为负数,则从 (array.length + fromIndex) 位置处开始查找,计算结果仍然为负数,则从 0 位置处开始查找
         * 返回值 : 首个被找到的元素在数组中的索引位置; 若没有找到则返回 -1
         */
        arr.indexOf(searchElement[, fromIndex = 0])
        
        // 从后往前查找,用法和 indexOf 相同
        arr.lastIndexOf(searchElement[, fromIndex = arr.length - 1])
    
    • 例子
        var array = [1, 5, 15, 20, 30, 100, 200]
        console.log(array.indexOf(1))
        console.log(array.indexOf(-100))
        console.log(array.indexOf(1, 3))
        console.log(array.indexOf(1, 100))
        console.log(array.indexOf(1, -1))
        console.log(array.indexOf(1, -100))
        // 输出:
        0
        -1
        -1
        -1
        -1
        0
        
        // 分割线 ----
        
        var array = [1, 5, 15, 20, 30, 100, 200]
        console.log(array.lastIndexOf(1))
        console.log(array.lastIndexOf(-100))
        console.log(array.lastIndexOf(1, 3))
        console.log(array.lastIndexOf(1, 100))
        console.log(array.lastIndexOf(1, -1))
        console.log(array.lastIndexOf(1, -100))
        // 输出:
        0
        -1
        0
        0
        0
        -1
    
    • 小结
      • indexOf从左往右 查找第一个元素的 索引位置
      • lastIndexOf从右往左 查找第一个元素的 索引位置

    小结

    • 相同点

    • 不同点

    七、截取 subarray subList slice

    OC subarray

    • 方法
        - (NSArray<ObjectType> *)subarrayWithRange:(NSRange)range;
        - (void)getObjects:(ObjectType _Nonnull __unsafe_unretained [_Nonnull])objects range:(NSRange)range NS_SWIFT_UNAVAILABLE("Use 'subarrayWithRange()' instead");
    
    • 例子
        NSArray *array = @[@1, @2, @3, @4];
        NSArray *result = [array subarrayWithRange:NSMakeRange(1, 2)];
        NSLog(@"%@", result);
        // 输出:
        (
            2,
            3
        )
    
    • 小结
      • range 超过数组范围时,会 crash

    Java subList

    • 方法
        /**
         * 截取  fromIndex(包括 )和 toIndex(不包括)之间的内容
         * 1、fromIndex < 0 会 crash
         * 2、toIndex > 0 会 crash
         * 3、fromIndex < toIndex 会 crash
         * 4、fromIndex = toIndex 返回空数组[]
         * 5、fromIndex > size - 1 返回 空数组[]
         */
        public List<E> subList(int fromIndex, int toIndex)
    
    • 例子
        ArrayList arrayList = new ArrayList();
        arrayList.add(1);
        arrayList.add(2);
        arrayList.add(3);
        arrayList.add(2);
    
        Log.e("数组", String.valueOf(arrayList.subList(0, 2))); // [1, 2]
        Log.e("数组", String.valueOf(arrayList.subList(-1, 2))); // crash
        Log.e("数组", String.valueOf(arrayList.subList(0, 5))); // crash
        Log.e("数组", String.valueOf(arrayList.subList(4, 4))); // []
        Log.e("数组", String.valueOf(arrayList.subList(4, 2))); // crash
        Log.e("数组", String.valueOf(arrayList.subList(2, 2))); // [[]
    
    • 小结

    JS slice

    • 方法
        /**
         * 方法返回一个从开始到结束(不包括结束)选择的数组的一部分浅拷贝到一个新数组对象。原始数组不会被修改。
         * begin : 可选的,默认为0;如果为负数,则从 (array.length + begin) 开始截取
         * end :可选的,默认是截取到数组结尾处;如果为负数,则截取到 (array.length + begin) 位置处
         * 1、如果 end 被省略,则slice 会一直提取到原数组末尾
         * 2、如果 end 大于数组长度,slice 也会一直提取到原数组末尾。
         * 3、如果 begin 大于 end,slice 返回空数组。
         */
        // 截取范围 [0, end] ,即“整个数组”
        arr.slice();
        // 截取范围 [begin, end] ,从 begin 位置处截取(包含该位置),一直到数组末尾
        arr.slice(begin);
        // 截取范围 [begin, end) ,包含 begin 位置元素,不包含 end 位置元素
        arr.slice(begin, end);
    
    • 例子
        var array = [1, 5, 15, 20, 30, 100, 200]
        console.log(array.slice()) // [1, 5, 15, 20, 30, 100, 200]
        console.log(array.slice(2)) // [15, 20, 30, 100, 200]
        console.log(array.slice(2, 5)) // [15, 20, 30]
        console.log(array.slice(2, 100)) // [15, 20, 30, 100, 200]
        console.log(array.slice(5, 2)) // []
        console.log(array.slice(-5)) // [15, 20, 30, 100, 200]
        console.log(array.slice(-5, -3)) // [15, 20]
    
    • 小结
      • 类似字符串的 slice 方法

    小结

    • 相同点

      • ocjava 超过范围会报错
    • 不同点

    八、替换 replace set splice fill

    OC replace

    • 方法
        // 可变数组 ----
        // 替换 index 位置处的元素 为 anObject
        - (void)replaceObjectAtIndex:(NSUInteger)index withObject:(ObjectType)anObject;
        // “源数组” range 范围的元素 用 otherArray 数组的 otherRange 范围内的元素替换
        - (void)replaceObjectsInRange:(NSRange)range withObjectsFromArray:(NSArray<ObjectType> *)otherArray range:(NSRange)otherRange;
        // “源数组” range 范围的元素 用 otherArray 数组替换
        - (void)replaceObjectsInRange:(NSRange)range withObjectsFromArray:(NSArray<ObjectType> *)otherArray;
        // “源数组” indexes 位置集合处的元素依次用 objects 数组中相应位置处的元素替换,indexes 的长度 和 objects 长度不一致的话会crash
        - (void)replaceObjectsAtIndexes:(NSIndexSet *)indexes withObjects:(NSArray<ObjectType> *)objects;
    
    • 例子
        NSMutableArray *array = [NSMutableArray arrayWithObjects:@1, @2, @3, @4, @5, @6, nil];
        [array replaceObjectAtIndex:2 withObject:@100];
        [array replaceObjectAtIndex:2 withObject:@"string"];
        NSLog(@"%@", array);
        // 输出:
        (
            1,
            2,
            string,
            4,
            5,
            6
        )
        
         NSMutableArray *array = [NSMutableArray arrayWithObjects:@1, @2, @3, @4, @5, @6, @7, @8, @9, nil];
        NSArray *otherArray = @[@20, @21, @22];
        [array replaceObjectsInRange:NSMakeRange(1, 2) withObjectsFromArray:otherArray];
        NSLog(@"%@", array);
        [array replaceObjectsInRange:NSMakeRange(7, 3) withObjectsFromArray:otherArray range:NSMakeRange(1, 2)];
        NSLog(@"%@", array);
    
        NSMutableIndexSet *set = [NSMutableIndexSet indexSet];
        [set addIndex:0];
        [set addIndex:1];
        [set addIndex:5];
        [array replaceObjectsAtIndexes:set withObjects:otherArray];
        NSLog(@"%@", array);
        
        // 输出:
        (
            1,
            20,
            21,
            22,
            4,
            5,
            6,
            7,
            8,
            9
        )
        (
            1,
            20,
            21,
            22,
            4,
            5,
            6,
            21,
            22
        )
        (
            20,
            21,
            21,
            22,
            4,
            22,
            6,
            21,
            22
        )
    
    • 小结
      • indexrange 超过范围会crash
      • replaceObjectsAtIndexes 方法如果 indexes 的长度 和 objects 长度不一致的话会crash : *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSMutableArray replaceObjectsAtIndexes:withObjects:]: count of array (3) differs from count of index set (2)'

    Java set

    • 方法
        // 用指定元素 element 替换列表中指定位置 index 的元素
        public E set(int index, E element)
    
    • 例子
        ArrayList arrayList = new ArrayList();
        arrayList.add(1);
        arrayList.add(2);
        arrayList.add(3);
        arrayList.add(2);
    
        arrayList.set(1, 100);
        Log.e("数组", String.valueOf(arrayList)); // [1, 100, 3, 2]
        arrayList.set(1, null);
        Log.e("数组", String.valueOf(arrayList)); // E/数组: [1, null, 3, 2]
        arrayList.set(-1, null); // crash
        Log.e("数组", String.valueOf(arrayList)); 
    
    • 小结
      • crash 情况:
        • UnsupportedOperationException - 如果列表不支持 set 操作
        • ClassCastException - 如果指定元素的类不允许它添加到此列表
        • NullPointerException - 如果指定的元素为 null,并且此列表不允许 null 元素
        • IllegalArgumentException - 如果指定元素的某些属性不允许它添加到此列表
        • IndexOutOfBoundsException - 如果索引超出范围( index < 0 || index >= size())

    JS fill splice

    • 方法
        /**
         * 用一个固定值填充一个数组中从起始索引到终止索引内的全部元素
         * value : 用来填充数组元素的值
         * start :可选的,起始索引,默认值为0
         * end : 可选的,终止索引,默认值为 this.length
         * 填充范围是一个左闭右开区间,[start, end),包含 start ,不包含 end 
         * 如果 start 是个负数, 则开始索引会被自动计算成为 length+start
         * 如果 end 是个负数, 则结束索引会被自动计算成为 length+end
         */
        arr.fill(value[, start[, end]])
        
        /**
         * 方法通过删除现有元素和/或添加新元素来更改一个数组的内容。
         * start :指定修改的开始位置(从0计数
         *      1、如果超出了数组的长度,则从数组末尾开始添加内容
         *      2、如果是负值,则表示从 (array.length + start) 开始,
         *      3、若只使用start参数而不使用deleteCount、item,如:    array.splice(start) ,表示删除[start,end]的元素。
         * deleteCount : 可选的,整数,表示要移除的数组元素的个数。
         * item1, item2, ... :可选的,要添加进数组的元素
         */
        array.splice(start)
        array.splice(start, deleteCount) 
        array.splice(start, deleteCount, item1, item2, ...)
    
    • 例子
        var array = [1, 2, 3, 4]
        array.fill(100) // [100, 100, 100, 100]
        array.fill(100, 1, 3) // [1, 100, 100, 4]
        array.fill(100, 1, 1) // [1, 2, 3, 4]
        array.fill(100, 1, 0) // [1, 2, 3, 4]
        array.fill(100, -2, -1) // [1, 2, 100, 4]
        
        // 分割线 ----
            var array = [1, 5, 15, 20, 30, 100, 200]
        console.log(array.splice(4)) // [1, 5, 15, 20]
        console.log(array) // [1, 5, 15, 20]
        // -------
        console.log(array.splice(-4)) // [20, 30, 100, 200]
        console.log(array) // [1, 5, 15]
        // -------
        console.log(array.splice(100)) // []
        console.log(array) // [1, 5, 15, 20, 30, 100, 200]
    
        var array = [1, 5, 15, 20, 30, 100, 200]
        console.log(array.splice(4, 2)) // [30, 100]
        console.log(array) // [1, 5, 15, 20, 200]
        // -------
        console.log(array.splice(-4, 2)) // [20, 30]
        console.log(array) // [1, 5, 15, 100, 200]
        // -------
        console.log(array.splice(100, 2)) // []
        console.log(array) // [1, 5, 15, 20, 30, 100, 200]
    
        var array = [1, 5, 15, 20, 30, 100, 200]
        console.log(array.splice(4, 2, "add")) // [30, 100]
        console.log(array) // [1, 5, 15, 20, "add", 200]
        // -------
        console.log(array.splice(-4, 2, "add")) // [20, 30]
        console.log(array) // [1, 5, 15, "add", 100, 200]
        // -------
        console.log(array.splice(100, 2, "add")) // []
        console.log(array) // [1, 5, 15, 20, 30, 100, 200, "add"]
    
    • 小结
      • fill 方法当 start > end 的时候才会进行填充
      • splice 方法根据传入的参数不同表现出不同的状态
        • array.splice(start)start 位置处开始(包含start位置),一直删除到数组末尾
        • array.splice(start, deleteCount)start 位置处开始(包含start位置),删除 deleteCount 个元素
        • array.splice(start, deleteCount, item1, item2, ...)start 位置处开始(包含start位置),删除 deleteCount 个元素,然后再在 start 位置处插入元素 item1, item2, ...

    小结

    • 相同点

    • 不同点

    九、删除 remove removeAll clear pop shift

    OC remove

    • 方法
        // 可变数组 -----
        // 删除最后一个元素
        - (void)removeLastObject;
        // 删除 index 位置处的元素
        - (void)removeObjectAtIndex:(NSUInteger)index;
        // 删除所有的元素
        - (void)removeAllObjects;
        // 删除“所有”的 anObject 元素
        - (void)removeObject:(ObjectType)anObject;
        // 删除 range 范围内的“所有”的 anObject 元素
        - (void)removeObject:(ObjectType)anObject inRange:(NSRange)range;
        - (void)removeObjectIdenticalTo:(ObjectType)anObject inRange:(NSRange)range;
        - (void)removeObjectIdenticalTo:(ObjectType)anObject;
        - (void)removeObjectsFromIndices:(NSUInteger *)indices numIndices:(NSUInteger)cnt API_DEPRECATED("Not supported", macos(10.0,10.6), ios(2.0,4.0), watchos(2.0,2.0), tvos(9.0,9.0));
        // 删除 otherArray 数组内包含的元素
        - (void)removeObjectsInArray:(NSArray<ObjectType> *)otherArray;
        // 删除 range 范围内的元素
        - (void)removeObjectsInRange:(NSRange)range;
        - (void)removeObjectsAtIndexes:(NSIndexSet *)indexes;
    
    • 例子
        NSMutableArray *array = [NSMutableArray arrayWithObjects:@1, @2, @3, @4, @5, @6, @7, @8, @9, nil];
        [array removeLastObject];
        NSLog(@"%@", array);
        NSLog(@"------");
        
        [array removeObjectAtIndex:1];
        NSLog(@"%@", array);
        NSLog(@"------");
    
        [array removeAllObjects];
        NSLog(@"%@", array);
        NSLog(@"------");
        
        // 输出:
        (
            1,
            2,
            3,
            4,
            5,
            6,
            7,
            8
        )
        ------
        (
            1,
            3,
            4,
            5,
            6,
            7,
            8
        )
        ------
        (
        )
        ------
        
        // 我是分割线 ------------
        NSMutableArray *array = [NSMutableArray arrayWithObjects:@1, @2, @3, @4, @5, @6, @7, @8, @9, @1, @2, @3, @4, @5, nil];
        [array removeObject:@2];
        NSLog(@"%@", array);
        // 输出:
        (
            1,
            3,
            4,
            5,
            6,
            7,
            8,
            9,
            1,
            3,
            4,
            5
        )
        
         NSMutableArray *array = [NSMutableArray arrayWithObjects:@1, @2, @3, @4, @5, @6, @7, @8, @9, @1, @2, @3, @4, @5, nil];
        [array removeObject:@2 inRange:NSMakeRange(0, 5)];
        NSLog(@"%@", array);
        // 输出:
        (
            1,
            3,
            4,
            5,
            6,
            7,
            8,
            9,
            1,
            2,
            3,
            4,
            5
        )
        
        NSMutableArray *array = [NSMutableArray arrayWithObjects:@1, @2, @3, @4, @5, @6, @7, @8, @9, @1, @2, @3, @4, @5, nil];
        [array removeObjectsInArray:@[@1, @5]];
        NSLog(@"%@", array);
        // 输出:
        (
            2,
            3,
            4,
            6,
            7,
            8,
            9,
            2,
            3,
            4
        )
        
         NSMutableArray *array = [NSMutableArray arrayWithObjects:@1, @2, @3, @4, @5, @6, @7, @8, @9, @1, @2, @3, @4, @5, nil];
        [array removeObjectsInRange:NSMakeRange(0, 5)];
        NSLog(@"%@", array);
        // 输出:
        (
            6,
            7,
            8,
            9,
            1,
            2,
            3,
            4,
            5
        )
        
         NSMutableArray *array = [NSMutableArray arrayWithObjects:@1, @2, @3, @4, @5, @6, @7, @8, @9, @1, @2, @3, @4, @5, nil];
        NSMutableIndexSet *set = [NSMutableIndexSet indexSet];
        [set addIndex:0];
        [set addIndex:1];
        [set addIndex:5];
        [array removeObjectsAtIndexes:set];
        NSLog(@"%@", array);
        // 输出:
        (
            3,
            4,
            5,
            7,
            8,
            9,
            1,
            2,
            3,
            4,
            5
        )
    
    • 小结

    Java remove removeAll clear

    • 方法
        // 删除 index 位置处的元素,index 超过范围会 crash 
        public E remove(int index)
        
        // 移除此列表中"首次"出现的指定元素(如果存在)。如果列表不包含此元素,则列表不做改动。
        public boolean remove(Object o)
        
        // 删除 所有在集合 c 中的元素
        public boolean removeAll(Collection<?> c)
        // 移除所有的元素
        public void clear()
    
    • 例子
        ArrayList arrayList = new ArrayList();
        arrayList.add(1);
        arrayList.add(2);
        arrayList.add(3);
        arrayList.add(2);
    
        arrayList.remove(1);
        Log.e("数组", String.valueOf(arrayList));
        // 输出:
        E/数组: [1, 3, 2]
        
        // 分割线 ------
        
        ArrayList arrayList = new ArrayList();
        arrayList.add("a");
        arrayList.add("b");
        arrayList.add("c");
        arrayList.add("b");
    
        arrayList.remove("b");
        Log.e("数组", String.valueOf(arrayList));
        // 输出:
        E/数组: [a, c, b]
        
        // 分割线 ------
        
        ArrayList arrayList = new ArrayList();
        arrayList.add("a");
        arrayList.add("b");
        arrayList.add("c");
        arrayList.add("b");
    
        arrayList.clear();
        Log.e("数组", String.valueOf(arrayList));
        // 输出:
        E/数组: []
        
        // 分割线 ------
        
        ArrayList otherList = new ArrayList();
        otherList.add("a");
        otherList.add("b");
        otherList.add("x");
    
        ArrayList arrayList = new ArrayList();
        arrayList.add("a");
        arrayList.add("b");
        arrayList.add("c");
        arrayList.add("b");
    
        arrayList.removeAll(otherList);
        Log.e("数组", String.valueOf(arrayList));
        // 输出:
        E/数组: [c]
    
    • 小结

    JS pop shift

    • 方法
        // 方法从数组中删除最后一个元素,并返回该元素的值。此方法更改数组的长度
        arr.pop()
            
        // 方法从数组中删除第一个元素,并返回该元素的值。此方法更改数组的长度。
        arr.shift()
        
        // 删除 index 位置处元素用 splice 方法
    
    • 例子
        var array = [1, 5, 15, 20, 30, 100, 200]
        array.pop()
        console.log(array)
        // 输出:
        [1, 5, 15, 20, 30, 100]
        
        // 分割线 ---------
        
        var array = [1, 5, 15, 20, 30, 100, 200]
        array.shift()
        console.log(array)
        // 输出:
        [5, 15, 20, 30, 100, 200]
    
    • 小结

    小结

    • 相同点

      • oc 方法 - (void)removeObjectsInArray:(NSArray<ObjectType> *)otherArray; 类似 java 方法 public boolean removeAll(Collection<?> c)
    • 不同点

      • oc 中移除某个元素方法 - (void)removeObject:(ObjectType)anObject; 是移除所有的 anObject 元素;
      • javapublic boolean remove(Object o) 是移除第一个出现的元素,移除所有的 使用方法 public boolean removeAll(Collection<?> c)

    十、排序 sort

    OC sort

    • 方法
        @property (readonly, copy) NSData *sortedArrayHint;
        
        // 使用函数排序
        - (NSArray<ObjectType> *)sortedArrayUsingFunction:(NSInteger (NS_NOESCAPE *)(ObjectType, ObjectType, void * _Nullable))comparator context:(nullable void *)context;
        - (NSArray<ObjectType> *)sortedArrayUsingFunction:(NSInteger (NS_NOESCAPE *)(ObjectType, ObjectType, void * _Nullable))comparator context:(nullable void *)context hint:(nullable NSData *)hint;
        
        // 使用SEL排序
        - (NSArray<ObjectType> *)sortedArrayUsingSelector:(SEL)comparator;
        - (NSArray<ObjectType> *)sortedArrayUsingComparator:(NSComparator NS_NOESCAPE)cmptr API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
        - (NSArray<ObjectType> *)sortedArrayWithOptions:(NSSortOptions)opts usingComparator:(NSComparator NS_NOESCAPE)cmptr API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
        // 可变数组 ----
        - (void)sortUsingFunction:(NSInteger (NS_NOESCAPE *)(ObjectType,  ObjectType, void * _Nullable))compare context:(nullable void *)context;
        - (void)sortUsingSelector:(SEL)comparator;
        - (void)sortUsingComparator:(NSComparator NS_NOESCAPE)cmptr API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
        - (void)sortWithOptions:(NSSortOptions)opts usingComparator:(NSComparator NS_NOESCAPE)cmptr API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
        
        // 多个条件的排序
        - (NSArray<ObjectType> *)sortedArrayUsingDescriptors:(NSArray<NSSortDescriptor *> *)sortDescriptors;    // returns a new array by sorting the objects of the receiver
    
    • 例子
        NSMutableArray *array = [NSMutableArray arrayWithObjects:@200, @20, @50, @30, @1, nil];
        [array sortUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
            return [obj1 compare:obj2];
        }];
        NSLog(@"%@", array);
        // 输出 :
         (
            1,
            20,
            30,
            50,
            200
        )
    
    • 小结

    Java sort

    • 方法
        // 集合的排序
        Collections.sort
        public void sort(Comparator<? super E> c)
    
    • 例子
        ArrayList arrayList = new ArrayList();
        arrayList.add("x");
        arrayList.add("d");
        arrayList.add("b");
        arrayList.add("c");
        arrayList.add("a");
    //        Collections.sort(arrayList, new Comparator() {
    //            @Override
    //            public int compare(Object o1, Object o2) {
    //                return o1.toString().compareTo(o2.toString());
    //            }
    //        });
    //
    //        Log.e("数组", String.valueOf(arrayList));
    
        arrayList.sort(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                return o1.toString().compareTo(o2.toString());
            }
        });
        Log.e("数组", String.valueOf(arrayList));
        
        // 输出:上面两种排序方法结果是一样的
        E/数组: [a, b, c, d, x]
    
    • 小结

    JS sort

    • 方法
        // 根据字符串Unicode码点排序
        arr.sort() 
      /**
       * 根据自定的函数 compareFunction 进行排序;
       * 1、如果 compareFunction(a, b) 小于 0 ,那么 a 会被排列到 b 之前
       * 2、如果 compareFunction(a, b) 等于 0 , a 和 b 的相对位置不变
       * 3、如果 compareFunction(a, b) 大于 0 , b 会被排列到 a 之前
       */
        arr.sort(compareFunction)
    
    • 例子
        var fruit = ['cherries', 'apples', 'bananas'];
        fruit.sort(); 
        console.log(fruit)
        // 输出:
        ["apples", "bananas", "cherries"]
        
        // 分割线 ----
        var numbers = [4, 2, 5, 1, 3];
        numbers.sort(function (a, b) {
          return a - b;
        });
        console.log(numbers)
        // 输出:
        [1, 2, 3, 4, 5]
    
    • 小结

    小结

    • 相同点

    • 不同点

    十一、比较/相等 Equal ==

    OC Equal

    • 方法
        - (BOOL)isEqualToArray:(NSArray<ObjectType> *)otherArray;
    
    • 例子
        NSArray *array = @[@1, @2, @3, @4];
        NSArray *otherArray = @[@1, @2, @3, @4];
        NSArray *otherArray2 = @[@"1", @"2", @"3", @"4"];
        NSArray *otherArray3 = @[@1, @2];
    
        if ([array isEqualToArray:otherArray]) {
            NSLog(@"相等");
        } else {
            NSLog(@"不相等");
        }
        
        if ([array isEqualToArray:otherArray2]) {
            NSLog(@"相等");
        } else {
            NSLog(@"不相等");
        }
        
        if ([array isEqualToArray:otherArray3]) {
            NSLog(@"相等");
        } else {
            NSLog(@"不相等");
        }
        
        // 输出:
        相等
        不相等
        不相等
    
    • 小结
      • 数组的长度相同,相同位置处的元素相同(类型和值),才是相等的

    Java equals

    • 方法
        // 将指定的对象与此列表进行相等性比较。当且仅当指定的对象也是一个列表,两个列表具有相同的大小,而且两个列表中所有相应的元素对都 相等 时,才返回 true。
        public boolean equals(Object o)
    
    • 例子
        ArrayList arrayList = new ArrayList();
        arrayList.add("x");
        arrayList.add("d");
        arrayList.add("b");
        arrayList.add("c");
        arrayList.add("a");
    
        ArrayList otherList = new ArrayList();
        otherList.add("a");
        otherList.add("b");
        otherList.add("x");
    
        ArrayList arrayList2 = new ArrayList();
        arrayList2.add("x");
        arrayList2.add("d");
        arrayList2.add("b");
        arrayList2.add("c");
        arrayList2.add("a");
    
        Log.e("数组", String.valueOf(arrayList.equals(otherList)));
        Log.e("数组", String.valueOf(arrayList.equals(arrayList2)));
        // 输出:
        E/数组: false
        E/数组: true
    
    • 小结

    JS ==

    • 方法
        ==
    
    • 例子
        var array = ['a', 'b', 'c']
        var other = ['z', 'x', 'y']
        console.log(array == other) // false
        console.log(array == array) // true
    
    • 小结

    小结

    • 相同点

    • 不同点

    十二、连接 join

    OC Joined

    • 方法
        // 数组中的元素 通过字符串 separator 连接
        - (NSString *)componentsJoinedByString:(NSString *)separator;
    
    • 例子
        NSArray *array = @[@1, @2, @3, @4, @5];
        NSString *result = [array componentsJoinedByString:@"+"];
        NSLog(@"%@", result);
        // 输出:
        1+2+3+4+5
    
    • 小结
      • 这是数组“连接”成字符串,对应的字符串分割成数组方法为:
        // 根据 指定的字符串 separator 进行分割
        - (NSArray<NSString *> *)componentsSeparatedByString:(NSString *)separator;
        // 根据 指定的字符集合 separator 进行分割
        - (NSArray<NSString *> *)componentsSeparatedByCharactersInSet:(NSCharacterSet *)separator API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0));
      

    Java 无直接方法

    • 方法
        没有直接的方法,需要自己处理
        一、循环语句拼接字符串
    
    • 例子
        ArrayList arrayList = new ArrayList();
        arrayList.add("x");
        arrayList.add("d");
        arrayList.add("b");
        arrayList.add("c");
        arrayList.add("a");
    
        String separator = "+";
        StringBuffer sb = new StringBuffer("");
        for (int i = 0; i < arrayList.size(); i++) {
            Object ob = arrayList.get(i);
            sb.append(ob.toString());
            if (i != arrayList.size() - 1) {
                sb.append(separator);
            }
        }
        Log.e("数组", sb.toString());
        // 输出:
        E/数组: x+d+b+c+a
    
    • 小结

    JS join

    • 方法
        // 默认为 ","
        str = arr.join()
        // 分隔符 === 空字符串 ""
        str = arr.join("")
        // 分隔符
        str = arr.join(separator)
    
    • 例子
        var array = [1, 5, 15, 20, 30, 100, 200]
        console.log(array.join())
        console.log(array.join(""))
        console.log(array.join("+"))
        // 输出:
        1,5,15,20,30,100,200
        15152030100200
        1+5+15+20+30+100+200
    
    • 小结

    小结

    • 相同点

    • 不同点

    十三、反转 reverse

    OC reverse

    • 方法
        - (NSEnumerator<ObjectType> *)reverseObjectEnumerator;
    
    • 例子
        NSArray *array = @[@1, @2, @3, @4, @5];
        NSArray *result = [[array reverseObjectEnumerator] allObjects];
        NSLog(@"%@", result);
        // 输出:
        (
            5,
            4,
            3,
            2,
            1
        )
    
    • 小结

    Java reverse

    • 方法 reverse
        // 集合的反转方法
        Collections.reverse
    
    • 例子
        ArrayList arrayList = new ArrayList();
        arrayList.add("x");
        arrayList.add("d");
        arrayList.add("b");
        arrayList.add("c");
        arrayList.add("a");
    
        Collections.reverse(arrayList);
        Log.e("数组", String.valueOf(arrayList));
        // 输出:
        E/数组: [a, c, b, d, x]
    
    • 小结

    JS reverse

    • 方法
        arr.reverse()
    
    • 例子
        var array = [1, 2, 3, 4]
        var result = array.reverse()
        console.log(result)
        // 输出:
        [4, 3, 2, 1]
    
    • 小结

    小结

    • 相同点

    • 不同点

    十四、交换 exchange

    OC exchange

    • 方法
        // 可变数组 ----
        - (void)exchangeObjectAtIndex:(NSUInteger)idx1 withObjectAtIndex:(NSUInteger)idx2;
    
    • 例子
        NSMutableArray *array = [NSMutableArray arrayWithObjects:@1, @2, @3, @4, nil];
        [array exchangeObjectAtIndex:0 withObjectAtIndex:2];
        NSLog(@"%@", array);
        // 输出:
        (
            3,
            2,
            1,
            4
        )
    
    • 小结

    Java 无直接方法

    • 方法
        // 没有直接方法,思路如下,和 js 类似
        1、取出 index 和 otherIndex 位置处的元素 indexElement ,otherIndexElement
        2、删除 index 位置处的元素,插入 otherIndexElement  (也可以进行替换操作)
        3、删除 otherIndex 位置处的元素,插入 indexElement (也可以进行替换操作)
    
    • 例子
        ArrayList arrayList = new ArrayList();
        arrayList.add("x");
        arrayList.add("d");
        arrayList.add("b");
        arrayList.add("c");
        arrayList.add("a");
    
        int index = 1;
        int otherIndex = 3;
        Object indexElement = arrayList.get(index);
        Object otherIndexElement = arrayList.get(otherIndex);
    
        arrayList.set(index, otherIndexElement);
        arrayList.set(otherIndex, indexElement);
        Log.e("数组", String.valueOf(arrayList));
        // 输出 :
        E/数组: [x, c, b, d, a]
    
    • 小结

    JS 无直接方法

    • 方法
        没有直接的方法实现,思路如下
        1、取出 index 和 otherIndex 位置处的元素 indexElement ,otherIndexElement
        2、删除 index 位置处的元素,插入 otherIndexElement
        3、删除 otherIndex 位置处的元素,插入 indexElement
    
    • 例子
      var array = [1, 2, 3, 4, 5]
      var index = 1
      var otherIndex = 3
      var indexElement = array[index]
      var otherIndexElement = array[otherIndex]
      array.splice(index, 1, otherIndexElement)
      array.splice(otherIndex, 1, indexElement)
      console.log(array)
      // 输出:
      [1, 4, 3, 2, 5]
    
    • 小结

    小结

    • 相同点

    • 不同点

    十五、写入/读取 write init

    OC write init

    • 方法
        // 写入 ,11.0 之后可以使用
        - (BOOL)writeToURL:(NSURL *)url error:(NSError **)error API_AVAILABLE(macos(10.13), ios(11.0), watchos(4.0), tvos(11.0));
        // 写入,后续会被废弃
        - (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
        - (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)atomically;
        
        // 读取,11.0 之后可以使用
        - (nullable NSArray<ObjectType> *)initWithContentsOfURL:(NSURL *)url error:(NSError **)error  API_AVAILABLE(macos(10.13), ios(11.0), watchos(4.0), tvos(11.0));
        + (nullable NSArray<ObjectType> *)arrayWithContentsOfURL:(NSURL *)url error:(NSError **)error API_AVAILABLE(macos(10.13), ios(11.0), watchos(4.0), tvos(11.0)) NS_SWIFT_UNAVAILABLE("Use initializer instead");
        // 读取,后续会被废弃掉
        + (nullable NSArray<ObjectType> *)arrayWithContentsOfFile:(NSString *)path;
        + (nullable NSArray<ObjectType> *)arrayWithContentsOfURL:(NSURL *)url;
        - (nullable NSArray<ObjectType> *)initWithContentsOfFile:(NSString *)path;
        - (nullable NSArray<ObjectType> *)initWithContentsOfURL:(NSURL *)url;
    
    • 例子
        // 写入 ----
        NSArray *array = @[@1, @2, @3, @4];
        NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
        NSString *file = [filePath stringByAppendingPathComponent:@"array.plist"];
        [array writeToFile:file atomically:YES];
        
        NSError *error;
        [array writeToURL:[NSURL fileURLWithPath:file] error:&error];
        if (!error) {
            NSLog(@"写入成功");
        } else {
            NSLog(@"写入失败");
        }
        // 输出:
        写入成功
        
        // 读取 : 参考初始化的 file 或 url 方法
    
    • 小结
      • 11.0 之后可以使用带有 error 参数的方法,不带 error 参数的方法后续会被废弃掉

    Java

    • 方法
    • 例子
    • 小结

    JS

    • 方法
    • 例子
    • 小结

    小结

    • 相同点

    • 不同点

    十六、遍历 make Perform enumerate for循环语句 forEach for...of

    OC makePerformenumerate, for循环语句

    • 方法
        // for..in 遍历
         for (<#type *object#> in <#collection#>) {
                <#statements#>
         }
        // SEL 遍历
        - (void)makeObjectsPerformSelector:(SEL)aSelector NS_SWIFT_UNAVAILABLE("Use enumerateObjectsUsingBlock: or a for loop instead");
        - (void)makeObjectsPerformSelector:(SEL)aSelector withObject:(nullable id)argument NS_SWIFT_UNAVAILABLE("Use enumerateObjectsUsingBlock: or a for loop instead");
        
        // block 遍历
        - (void)enumerateObjectsUsingBlock:(void (NS_NOESCAPE ^)(ObjectType obj, NSUInteger idx, BOOL *stop))block API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
        // block 遍历,NSEnumerationConcurrent : 并发;NSEnumerationReverse : 反向;
        - (void)enumerateObjectsWithOptions:(NSEnumerationOptions)opts usingBlock:(void (NS_NOESCAPE ^)(ObjectType obj, NSUInteger idx, BOOL *stop))block API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
        // block 遍历,s 索引集合的元素
        - (void)enumerateObjectsAtIndexes:(NSIndexSet *)s options:(NSEnumerationOptions)opts usingBlock:(void (NS_NOESCAPE ^)(ObjectType obj, NSUInteger idx, BOOL *stop))block API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
        
        - (NSUInteger)indexOfObjectPassingTest:(BOOL (NS_NOESCAPE ^)(ObjectType obj, NSUInteger idx, BOOL *stop))predicate API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
        - (NSUInteger)indexOfObjectWithOptions:(NSEnumerationOptions)opts passingTest:(BOOL (NS_NOESCAPE ^)(ObjectType obj, NSUInteger idx, BOOL *stop))predicate API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
        - (NSUInteger)indexOfObjectAtIndexes:(NSIndexSet *)s options:(NSEnumerationOptions)opts passingTest:(BOOL (NS_NOESCAPE^)(ObjectType obj, NSUInteger idx, BOOL *stop))predicate API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
    
        - (NSIndexSet *)indexesOfObjectsPassingTest:(BOOL (NS_NOESCAPE ^)(ObjectType obj, NSUInteger idx, BOOL *stop))predicate API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
        - (NSIndexSet *)indexesOfObjectsWithOptions:(NSEnumerationOptions)opts passingTest:(BOOL (NS_NOESCAPE ^)(ObjectType obj, NSUInteger idx, BOOL *stop))predicate API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
        - (NSIndexSet *)indexesOfObjectsAtIndexes:(NSIndexSet *)s options:(NSEnumerationOptions)opts passingTest:(BOOL (NS_NOESCAPE ^)(ObjectType obj, NSUInteger idx, BOOL *stop))predicate API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
    
    • 例子
         NSArray *array = @[@1, @2, @3, @4, @5];
        for (NSNumber *ob in array) {
            NSLog(@"%@", ob);
        }
        // 输出:
        1
        2
        3
        4
        5
    
        // 分割线 ---------
    
        NSArray *array = @[@1, @2, @3, @4];
        [array enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            NSLog(@"%ld : %@", idx, obj);
        }];
        NSLog(@"-----");
        [array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            NSLog(@"%ld : %@", idx, obj);
    
        }];
        NSLog(@"-----");
        [array enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            NSLog(@"%ld : %@", idx, obj);
            
        }];
        NSLog(@"-----");
        NSMutableIndexSet *set = [NSMutableIndexSet indexSet];
        [set addIndex:0];
        [set addIndex:2];
        [set addIndex:3];
        [array enumerateObjectsAtIndexes:set options:0 usingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            NSLog(@"%ld : %@", idx, obj);
    
        }];
        
        // 输出:
        2018-02-27 13:11:41.886616+0800 HYFoundation[26729:24088389] 0 : 1
    2018-02-27 13:11:41.886756+0800 HYFoundation[26729:24088389] 1 : 2
    2018-02-27 13:11:41.886857+0800 HYFoundation[26729:24088389] 2 : 3
    2018-02-27 13:11:41.886971+0800 HYFoundation[26729:24088389] 3 : 4
    2018-02-27 13:11:41.887069+0800 HYFoundation[26729:24088389] -----
    2018-02-27 13:11:41.887174+0800 HYFoundation[26729:24088389] 3 : 4
    2018-02-27 13:11:41.887275+0800 HYFoundation[26729:24088389] 2 : 3
    2018-02-27 13:11:41.887380+0800 HYFoundation[26729:24088389] 1 : 2
    2018-02-27 13:11:41.887484+0800 HYFoundation[26729:24088389] 0 : 1
    2018-02-27 13:11:41.887593+0800 HYFoundation[26729:24088389] -----
    2018-02-27 13:11:41.887728+0800 HYFoundation[26729:24088389] 0 : 1
    2018-02-27 13:11:41.887734+0800 HYFoundation[26729:24088493] 1 : 2
    2018-02-27 13:11:41.887748+0800 HYFoundation[26729:24088492] 2 : 3
    2018-02-27 13:11:41.887755+0800 HYFoundation[26729:24088514] 3 : 4
    2018-02-27 13:11:41.888169+0800 HYFoundation[26729:24088389] -----
    2018-02-27 13:11:41.888415+0800 HYFoundation[26729:24088389] 0 : 1
    2018-02-27 13:11:41.888603+0800 HYFoundation[26729:24088389] 2 : 3
    2018-02-27 13:11:41.888784+0800 HYFoundation[26729:24088389] 3 : 4
    
    • 小结
      • NSEnumerationOptions 是一个枚举类型:
          typedef NS_OPTIONS(NSUInteger, NSEnumerationOptions) {
              NSEnumerationConcurrent = (1UL << 0),
              NSEnumerationReverse = (1UL << 1),
          };
      
      NSEnumerationConcurrent : 表示并发执行, 见上面的例子:
    2018-02-27 13:11:41.887728+0800 HYFoundation[26729:24088389] 0 : 1
    2018-02-27 13:11:41.887734+0800 HYFoundation[26729:24088493] 1 : 2
    2018-02-27 13:11:41.887748+0800 HYFoundation[26729:24088492] 2 : 3
    2018-02-27 13:11:41.887755+0800 HYFoundation[26729:24088514] 3 : 4
    
    `[26729:24088493]` , `[26729:24088492]`, `[26729:24088514]` ,这些事变化的,即时并发执行
    `NSEnumerationReverse` 表示`反向`遍历,即`从后往前`遍历
    - 
    

    Java forEach for循环语句

    • 方法
        `forEach` `for循环语句`
    
    • 例子
        ArrayList arrayList = new ArrayList();
        arrayList.add("x");
        arrayList.add("d");
        arrayList.add("b");
        arrayList.add("c");
        arrayList.add("a");
    
        for (Object ob: arrayList) {
            Log.e("数组", String.valueOf(ob));
        }
        Log.e("数组", "---------");
        for (int i = 0; i < arrayList.size(); i++) {
            Object ob = arrayList.get(i);
            Log.e("数组", String.valueOf(ob));
        }
        // 输出:
        E/数组: x
        E/数组: d
        E/数组: b
        E/数组: c
        E/数组: a
        E/数组: ---------
        E/数组: x
        E/数组: d
        E/数组: b
        E/数组: c
        E/数组: a
    
    • 小结

    JS forEach for...of for循环语句

    • 方法
        /**
         * 方法对数组的每个元素执行一次提供的函数
         * callback : 在数组每一项上执行的函数。调用时使用参数 (currentValue, index, array)。
         * thisArg : 可选参数。当执行回调 函数时用作this的值(参考对象)。
         * 返回值 : 没有返回值,undefined.
         */
        array.forEach(callback(currentValue, index, array){
            //do something
        }, this)
        array.forEach(callback[, thisArg])
        
        // 具体见下面的例子
        for...of
    
    • 例子
        var array = [1, 5, 15, 20, 30, 100, 200]
        array.forEach(function (element, index, array) {
          console.log("index: " + index + " value: " + element)
        })
        // 输出:
        index: 0 value: 1
        index: 1 value: 5
        index: 2 value: 15
        index: 3 value: 20
        index: 4 value: 30
        index: 5 value: 100
        index: 6 value: 200
        
        // 分割线 ----
         var arr = ['w', 'y', 'k', 'o', 'p'];
        for (var letter of arr) {
          console.log(letter);
        }
        // 输出:
        w
        y
        k
        o
        p
    
    • 小结
      • jsfor...of 类似 oc 中的 for...in 方法,类似 javaforEach

    小结

    • 相同点

      • 都可以使用 for循环语句 进行遍历
    • 不同点

      • jsfor...of 类似 oc 中的 for...in 方法,类似 javaforEach ;都是忽略 索引 index ,直接获取元素的值

    十七、其他

    OC

    • 方法
        // 在“源”数组中每个元素 和 otherArray 中的元素比较,找出第一个相同的对象
        - (nullable ObjectType)firstObjectCommonWithArray:(NSArray<ObjectType> *)otherArray;
    
    • 例子
        NSArray *array = @[@1, @2, @3, @4, @5];
        NSArray *otherArray = @[@3, @2];
        id object = [array firstObjectCommonWithArray:otherArray];
        NSLog(@"%@", object);
        
        NSArray *otherArray2 = @[@10, @11];
        id object2 = [array firstObjectCommonWithArray:otherArray2];
        NSLog(@"%@", object2);
        
        // 输出:
        2
        (null)
    
    • 小结

    Java

    • 方法
    • 例子
    • 小结

    JS

    • 方法
        // 判断 obj 是不是数组
        Array.isArray(obj)
        
        // 方法测试数组的所有元素是否都通过了指定函数的测试。
        arr.every(callback[, thisArg])
    
    • 例子
        console.log(Array.isArray([]))
        console.log(Array.isArray([1, 2]))
        console.log(Array.isArray("123"))
        console.log(Array.isArray(987))
        // 输出:
        true
        true
        false
        false
        
        // 分割线 ------
        
        var array = [1, 5, 15]
        var result = array.every(isBigEnough)
        console.log(result)
        function isBigEnough(value, index, array) {
            return value >= 10;
        }
        // 输出:
        false
    
    • 小结

    小结

    • 相同点

    • 不同点

    最后

    相同点

    1. 通过下标获取元素 [index]
    2. 索引下标 从 0 开始,到 count - 1ocjava 超过范围会 crash

    不同点

    1. 数组的定义
        // oc / c / c++
        dataType arrayRefVar[];
        如:
        NSString *strings[3];   // c
        NSArray *arr = @[@1, @2, @3, @4]; // oc
        
        // java
        dataType[] arrayRefVar;
        int[] numbers = new int[3];
    
        // js
        var array = [1, 2, 3, 4, 5]
    
    1. 空值
    • oc 数组添加 nilNULL 元素 crash
    • java 数组添加 null 不会报错,并且存在于数组中
    • js 数组添加 null undefined 不会报错,并且存在于数组中
        // oc 添加空值 nil 会crash
        
        // java
        ArrayList arrayList = new ArrayList(20);
        arrayList.add(null);
        Log.e("数组", arrayList.toString());
        Log.e("数组", String.valueOf(arrayList.size()));
        // 输出:
        E/数组: [null]
        E/数组: 1
        
        // js 添加 `null`  `undefined` 不会报错
        var array = [1, 2]
        array.push(null)
        array.push(undefined)
        console.log(array)
        // 输出:
        [1, 2, null, undefined]
    

    oc

    1. 有序集合 : NSArrayNSMutableArray
      无序集合 :
    2. 数组的下标从 0 开始,范围为 0count - 1,超过范围会 crash
    3. oc 空数组 @[] 获取下标 0crash
    4. 数组中的元素类型是对象类型不能为基本数据类型(如数字)

    java

    1. 类有
    • ArrayList
    1. 数组中的元素类型是对象类型,也可以为基本数据类型(如数字)

    js

    1. 类有
    • Array
    1. 数组中的元素类型是对象类型,也可以为基本数据类型(如数字)

    相关文章

      网友评论

          本文标题:编程语言对比系列:二、数组的基本使用

          本文链接:https://www.haomeiwen.com/subject/wwlgxftx.html