java--数组的学习笔记一之基础知识

/*java–数组的学习笔记一之基础知识

A.数组
1.数组如何声明?
int[] a=new int[3];
int[]是一个新类型,与int是不同的类型,它是一个引用型类型,特点是,只要是该类型的type,type a的a的本质就是一个指针,而如int b的b不是指针
因此a一开始的值是null,必须先指向实体,而int[3]就是一个实体,我们用new操作符创造一个实体,所谓实体,是指内存空间中有确定地址和大小的一段区域

int[] a=new int[3]—这是数组的创建,而同是引用型数据类型的String(实际上就是类)是这样创建的;
String arr=”xxxx”;这是直接的初始化字符串初始化比较特殊,因为字符串是直接在内存中分配的,并且是不可分割的,它并不需要new,但arr同样是指针。
还有比如String[]类型与String类型是不同的;
String[] str=new String[3];
意思是创建一个能放下3个字符串的数组,当然,实际上该数组里每个元素都不是字符串,而是指向字符串的指针

对于引用型数据类型,大多数类对象都是该数据类型:
Scanner in=new Scanner(System.in);
如上面,类的创建,左边的in是该Scanner类的对象变量(不是对象),实际上是放在栈中的指针,而Scanner(System.in)是实体,也就是真正的对象
一旦上面表达式成立,那么in才能指向该对象,从而in变为该对象的一个表示名称,in可以指代该对象。
通用格式是:
类 对象变量=new 类();
类()代表了实体,有时括号里有东西,有时没有;

2.数组如何初始化?可以重新初始化吗?匿名数组呢?
int[] a={12,32,42};
a=new int[]{12,43,24,43};
int[] b=new int[]{12,43,24,43,43};
以上都可以正确初始化,第二种更是可以重新初始化a,这一点比C强大,C只能初始化一次数组。但是本质没有任何不同
因为C语言的数组名不是指针,而java的数组名是指针,既然是指针,重新指向一个int类型的数组便很正常。
java数组也可以有匿名数组:new int[]{12,43,24,43}便是匿名数组

3.数组的操作?
3.1直接打印数组名会如何?
出现此类值I@15db9742m,@右边是哈希值,左边[I代表整型一维数组

3.2数组主要使用Arrays方法
首先是在源代码顶部import java.util.;意思是导入java.util包中的类,表示任意类型;
Arrays方法一般有;
1)String toString(type[] a);
2)void sort(type[] a);
3)int binarySearch(type[] a,type v);二分法查找数组中有无V,若成功,返回其下标值
4)int binarySearch(type[] a,int start,int end,type v);
5)void fill(type[] a,type v);将所有元素值设置为v;
6)boolean equals(type[] a,type[] b);如果两个数组大小相同,返回true.类似c语言strcmp()函数;该方法String类中也有

4.数组的内存实现以及数组的拷贝:
以int[] a={12,32,42};为例,数组名是存放在栈中的指针,而右边的实体是存在堆中的,实体的地址赋给了a。
a实际上就是指针,因此a可以被赋其他的同类型地址,如果有 int[] b={2,3,,3,3,2};
a=b或b=a不会有任何问题,这就叫做数组的拷贝

5.二维数组
5.1如何声明?
int [][]c=new int[3][4];//实际上是一个包含了3个指针的数组,每个指针指向一维数组
int [][]c=new int[3][];
以上两种声明都可以,但有区别;第一种规定了每一个存储在二维数组中的一维数组的大小,都是4;而第二种却可以让一维数组有不同的
大小;这个与C语言不同,C语言只能有第一种数组的功能;
#二维数组c的c[0],c[1],c[2]存储的并不是一维数组,而是一维数组的地址;而第二维的数组的地址又给了c;
因此c[0],c[1],c[2]的值在没有初始化的情况下,值都是null,而指向的一维数组们每个元素的值都默认为0;这也是跟C语言不同之处
5.2如何初始化?
int [][]d=new int[][]{{12,32,54},{23,45,23,65,23,3},{1,2}};
5.3.二维数组与一维数组的长度
与C语言不同,java数组的长度指的就是元素个数,对于c[3][4],c.length指的就是二维数组第二维有几个元素,显然是3个;
而c[1].length的值就是4个;

5.4.JAVA多维数组的本质是?
JAVA实际上没有多维数组,只有一维数组!多维数组是数组的数组,高维存储的都是指向
低维的地址,故而可以有不规则数组出现

5.5.如何快速打印二维数组列表?
使用Arrays.deepTostring()方法;

6.for each语句
6.1如何用?
for each应用于数组:
int arr[] = {2, 3, 1};
for (int x : arr)
System.out.println(x);
这样便把arr数组的每个值每次赋到x中打印出来

6.2二维数组中如何用?
for(double[] row:a)//double[] 表明了row的类型,JAVA中只要不是基本类型的,必然是指针类型,double[]便是指针类型
for(double value;row)
do something

7.java使用命令行参数
void main(String[] args)表明在命令行中可以输入一个字符串数组,可以自定义功能

*/

import java.util.*;
//  import java.lang.*;String类方法是在main中预定义好的,因此可以省略
    public class ArrayLearn
    {
    public static void main(String[] args)
    {
        //数组的操作演示
            int[] a={12,32,42};
        System.out.println(a);//[I@15db9742//@右边是哈希值,左边[I代表整型一维数组
        System.out.println(Arrays.toString(a));
    a=new int[]{12,43,24,43};
    System.out.println(a);//[I@6d06d69c
    System.out.println(Arrays.toString(a));
    int[] b=new int[]{12,43,24,43,43};
    //int[] b=new int[]{12,43,24,43,43,43,34}//但第二次使用时,必须去掉左边的int[],否则编译器会判断其重复声明,无法通过
    //a={12,32,42,43};也不能第二次这样进行初始化,必须用new操作符
    //数组的操作演示

    //字符串
    String str="Hello world";
    System.out.println(str);
    System.out.println(str.length());//数组是arr.length,字符串是str.length();
    //字符串

    //二维数组
    int [][]c=new int[3][4];
    System.out.println(c);//[[I@7852e922
    System.out.println(c[0]);//[I@4e25154f//只要是实体,必定有地址
    System.out.println(c[1][2]);//结果是0

    int [][]d=new int[3][];
    System.out.println(d);//[[I@70dea4e
    System.out.println(d[0]);//null,因为无法找到一维数组
    //System.out.println(d[0][0]);//无法找到指针,因为没有一维数组 ,执行到此会报错
    //int [][]f=new int[3][]{{12,32,54},{23,45,23,65,23,3},{1,2}};
    //二维数组

    //遍历二维数组
    int [][]e=new int[][]{{12,32,54},{23,45,23,65,23,3},{1,2}};
    for(int x=0;x<e.length;x++)
        for(int y=0;y<e[x].length;y++)
            System.out.print(e[x][y]+" ");
    System.out.println();
    System.out.println(Arrays.toString(e));//[ [I@5c647e05, [I@33909752, [I@55f96302 ];
    //结果显而易见,第二维存储的是地址
    System.out.println(Arrays.deepToString(e));
    //遍历二维数组
}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值