java基础总结——数组

一,数组的定义

 

  • 数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。
  • 数组的元素可以是任何数据类型,包括基本类型和引用类型。
  • C和C++中的数组都可以分配在栈上面,而JAVA中的数组是只能分配在堆上面的,因为JAVA中的数组是引用类型。

 

数组的特点:
    1. 只能存储同一种数据类型的数据。
    2. 一旦初始化,长度固定。 
    3. 数组中的元素与元素之间的内存地址是连续的。
    
注意: Object类型的数组可以存储任意类型的数据。 
 

数组定义的几种形式

(1)int[] arr = new int[5];    5为数组的长度

(2)int[] arr = new int[]{3,5,1,7};

(3)int[] arr = {3,5,1,7};后面直接跟元素。

注释:数组的定义分为两步,第一部分声明即左半部分,int[ ]  arr 

第二部分使用new,new的作用在内存堆中创建一个容器实体,即真是存在的数组,然后将这个数组的引用赋值给数组变量arr。

二,数组数据的存储

当数组元素为引用型的数据时,这时数组中的所有元素都要实例化,即需要new对象。

 

案例分析一:

 

 

 

案例分析二:

 

 

java 中各个维度的数组模型

 

三,二维数组

例:

 

疑问: 为什么a.length = 3, a[0].length = 4?

四,数组的使用

1,数组循环foreach 循环

JDK 1.5 引进了一种新的循环类型,被称为 foreach 循环或者加强型循环,它能在不使用下标的情况下遍历数组。

double[] myList = {1.9, 2.9, 3.4, 3.5}; // 打印所有数组元素

for (double element: myList) {

System.out.println(element); }

二维数组加强for循环

  1. int[][] arr = {{65,6},{12,1,45,23},{0,-45,1}};//静态创建

  2. for (int[] is : arr) {

  3. for (int i : is) {

  4. System.out.print(i + ",");

  5. }

2,数组元素的反转

 

  • 直接数组元素对换
    String[] strings = { "ramer", "jelly", "bean", "cake" };
    System.out.println("\t" + Arrays.toString(strings));
    for (int start = 0, end = strings.length - 1; start < end; start++, end--) {
        String temp = strings[end];
        strings[end] = strings[start];
        strings[start] = temp;
    }
    System.out.println("\t" + Arrays.toString(strings));
}
  • 使用Collections和Arrays工具类(利用collections中的reverse方法,只适用于引用I型shuju
    String[] strings = { "ramer", "jelly", "bean", "cake" };
    System.out.println("\t" + Arrays.toString(strings));
    // 这种方式仅针对引用类型,对于基本类型如:
    // char[] cs = {'a','b','c','g','d'};
    // 应该定义或转换成对应的引用类型: 
    // Character[] cs = {'a','b','c','g','d'};
    Collections.reverse(Arrays.asList(strings));
    System.out.println("\t" + Arrays.toString(strings));
}

总结:: 使用Collections和Arrays工具类反转数组元素更简单,但是在原数组上操作时速度更快,并且占用最少的内存.

3,空数组和数组长度为0的数组的区别。

int[ ] arr1=null;            //arr1是一个数组类型的空引用,不指向任何对象;

int[ ]  arr2=new int[0];//声明并创建一数组对象(因为new对象了),但长度是0;

例如:

两者如果在一句代码中,则要先判断是否为空,否则可能会出现空指针异常。
eg:if (array == null || 0 == array.length) {...} // 这种写法正确,因为执行到 “0 == array.length”则说明数组不为空,不会产生空指针异常。
if (0 == array.length || array == null) {...} // 这种写法可能会产生空指针异常。

所以对于一个新定义的数组或者方法返回的数组,都要先判断是否为空,再判断长度是否为0,注意顺序。

 

五,Arrays工具类

 1,数组打印toString方法,二维数组打印使用deeptoString

 

[jva] view plain copy

  1. int[] intArray = { 12345 };  
  2. String intArrayString = Arrays.toString(intArray);  // 直接打印,则会打印出引用对象的Hash值  // [I@7150bd4d  
  3. System.out.println(intArray);  
  4. System.out.println(intArrayString);// [1, 2, 3, 4, 5]  

2,equals方法 使用Arrays.equals来比较1维数组是否相等。 (二维数组判断相等使用deepEquals)

System.out.println(Arrays.equals(names1, names2));out.println(Arrays.equals(names1, names2));

3,sort排序方法(这里实现的是升序排序)

4,fill为数组赋值,将数组的所有元素都赋值为指定的值

int[] array1 = new int[8];

    Arrays.fill(array1, 1);
    //[1, 1, 1, 1, 1, 1, 1, 1]
    System.out.printl  Arrays.fill(array1, 1);
    //[1, 1, 1, 1, 1, 1, 1, 1]
    System.out.printl

5,binarySearch(二分查找数组中是否存在这个元素。)存在输出下标。不存在输出-1.

 

  1.     char[]  arr={'a','b','c','d','e'};  
  2.     int i = Arrays.binarySearch(arr, 'd');  
  3.     System.out.println(i);//结果是:3 

下面的方法是数组与集合之间的相互转化

6,alist方法,可以返回一个固定大小的List,(转成List之后。可以使用List的所有方法)

 

List<String> stringList = Arrays.asList("Welcome", "To", "Java","World!");<String> stringList = Arrays.asList("Welcome", "To", "Java","World!");

7,数组与ArrayList之间的相互转换(互转之后可以互相使用对方的方法)

 

  1. String[] stringArray = { "a""b""c""d""e" };  
  2. ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(stringArray));  //将数组转化成了Arraylist
  3. String[] stringArr = new String[arrayList.size()];  //这里没有数据,只转化成了数组,需要循环填入数据。
  4. arrayList.toArray(stringArr);  
  5. for (String s : stringArr)  
  6.    System.out.println(s);  

8,将数组转化成set(可以使用set的所有方法)

 

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

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值