1.6 数组

1.6 数组

  • 数组特性:
    • 一致性:数组保存类型相同的元素
    • 有序性:数组中的元素是有序的,通过下标访问
    • 不可变性:数组一旦初始化,长度不可变

数组创建

  • 一维数组
    • type[] arrayName;
      • type[]与type是不同类型,type[]是引用类型,type可能是基本数据类型,也可能是引用类型
      • type[]方法和属性
        名称返回值
        clone()Object
        equals(Object obj)boolean
        getClass()Class<?>
        hashCode()int
        notify()void
        notify All()void
        toString()String
        wait()void
        wait(long timeout)void
        wait(long timeout,int nanos)void
    • type arrayName[];
  • 二维数组
    • type[][] arrayName;
    • type arrayName[][];
  • 声明数组时不用规定数组长度

分配空间

  • 使用new type[size]为数组分配连续的size空间
    • 如果没有指定初始化值,系统默认分配null
      • null==null是false,因为都是空值,两个空值不相等
  • 直接赋值进行初始化
    • type[] a = new type[]{value1,value2,…}
      • 注意:分配空间时不要即指定数组长度也为每个数组元素分配空间
    • type[] a = {value1,value2,…}
      • 使用这种方式,一定要同时声明和初始化数组,千万不要分开
  • 不规则数组:
    int arr[][] = new int[4][];
    arr[0]=new int[2];
    arr[1]=new int[1];
    arr[2]=new int[3];
    arr[3]=new int[4];
    /*
      arr = {
      {s,s}
      {s}
      {s,s,s}
      {s,s,s,s}
      }  
      这种时候使用foreach遍历方法显得特别方便
    */
    

获取数组元素

  • 特殊for循环
    //一维数组
    for(type item:arrayName)
      {
        ....  
      }
    //二维数组
    for(type[] item:arrarName){
      for(type value:item){
        ....
      }
    }
    

Arrays工具类

  • 均为静态方法
  • 位于java.util内,使用时需要导入

静态方法

方法说明
int binarySearch(type[] a, type key)使用二分法查询key元素是否在数组内
int binarySearch(type[] a, int fromIndex, int toIndex, type key)指定二分查找的范围
type[] copyOf(type[] original, int length)复制original,新数组长度为length;如果 length 小于 original 数组的长度,则新数组就是原数组的前面 length 个元素,如果 length 大于 original 数组的长度,则新数组的前面元索就是原数组的所有元素,后面补充 0(数值类型)、false(布尔类型)或者 null(引用类型)。
type[] copyOfRange(type[] original, int from, int to)复制指定范围的元素
boolean equals(type[] a, type[] a2)判断两个元素是否相等
void fill(type[] a, type val)将a数组的所有元素赋值为val
void fill(type[] a, int fromIndex, int toIndex, type val)将指定范围内的数组元素赋值为val
void sort(type[] a)排序,使用的排序算法取决于数组的长度,详情请见 2.1 Arrays源码分析
void sort(type[] a, int fromIndex, int toIndex)指定排序范围
String toString(type[] a)将数组转换为字符串,使用","连接
  • sort方法:
    • 如果要实现自定义排序,数组类型要是包装类型,不能是基本数据类型。
    • 排序类实现Comparator接口
    main(){
      Integer[] a = {};
      Comparator cmp = new MyComparator();
      Array.sort(a,cmp);
    }
    
    class MyComparator implements Comparator<Integer>{
      @override
      public int compare(Integer o1,Integer o2){
        return o1-o2;
        //如果结果是负数,则调转o1、o2顺序
      }
    }
    

java8新增功能

方法说明
void parallelPrefix(xxx[] array, XxxBinaryOperator op)op包括left、right两个形参,left代表数组中前一个索引处的元素,rught代表数组中当前索引处的元素,计算第一个新数组元素时,left默认是1
void parallelPrefix(xxx[] array, int fromIndex, int toIndex, XxxBinaryOperator op)与上一个方法相似,指定操作的区间
void setAll(xxx[] array, IntToXxxFunction generator)使用指定的生成器为所有数组设置值,该生成器可以控制数组元素的值的生成算法
void parallelSetAll(xxx[] array, IntToXxxFunction generator)与上一个方法相同,但可以进行并行运算,利用多CPU提高性能
void parallelSort(xxx[] a)增加并行能力
void parallelSort(xxx[] a,int fromIndex, int toIndex)指定排序范围
Spliterator.OfXxx spliterator(xxx[] array)将数组的所有元素转换成对应的Spliterator对象
Spliterator.OfXxx spliterator(xxx[] array, int startInclusive, int endExclusive)指定范围转换成Spliterator对象
XxxStream stream(xxx[] array)将数组转换成Stream
XxxStream stream(xxx[] array, int startInclusive, int endExclusive)指定转换成Stream的范围
  • 代码:
    • void parallelPrefix():计算结果保留在当前元素位置
    int[] s = {1,2,3,4,5};
        Arrays.parallelPrefix(s,new IntBinaryOperator(){
          public int applyAsInt(int left,int right){
            return left+right;
          }
        });
        System.out.println("s:"+Arrays.toString(s));
    // 输出:[1,3,6,10,15]
    

数组与字符串的转换

  • 字符串转换为数组
    • 调用String类的toCharArray()方法
    String s = "123abc";
    char[] c = s.toCharString();
    //c= 1,2,3,a,b,c
    
    • String.split(regex)方法:使用regex作为分隔符分隔字符串
      • 注意:如果使用“.”或者“|”作为分隔符,需要使用“\”
    String s = "Iandamora!student!";
    char[] c = s.split("and|or|!");
    //c=I,am,a,student
    
  • 数组转换为字符串
    • 使用StringUtils,需要下载
      • StringUtils.join(charAarray,regex):使用regex连接数组,regex默认是无
    • 使用String.copyValueOf(char array)
      char c = [1,2,3,4]
      String s = String.copyValueOf(c,'.')
      //s="1.2.3.4"
      
    • 如果是StringBuffer类,可以直接使用StringBuffer的append方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值