java的数组知识

本文详细介绍了Java中数组的定义、初始化方式、遍历方法及数组的深入理解等内容,并讲解了如何利用Array类进行数组操作。

1.定义数组

格式:type[ ] arrayname(type arrayname[]),建议使用第一种,符合语法习惯,type[ ]是一种类型。

数组是一种引用类型的变量,因此使用他定义的一个变量时,仅仅表示定义了一个引用变量(也就是定义了一个指针),这个引用变量还未指向任何有效的内存,因此定义的时候不能指定数组的长度,并且在没有初始化之前也是不能用的。

2.数组的初始化

(1)静态初始化:初始化时由程序员显示的指定每个数组元素的初始值,由系统决定数组的长度。

格式 arrayname = new type[ ]{element1,element2,element3...}; (前提有定义)   

or type[ ] arrayname = {element1,element2,element3...};

由于java语言很好的继承性,数组的类型和元素的类型可以使一样也可以是父子关系。例如:

int[] intArray;
intArray=new int[]{5,6,7,8};
Object[] objArr;
objArr=new String[]{"hello","fine"};//数组类型时定义的数组的子类
Object[] objArr1;
obj1Arr=new Object[]{"java"};//元素类型时数组类型的子类

(2)动态初始化,初始化时只能指定数组长度,由系统为数组元素分配初始值。

格式  arrayname = new type[length];

执行动态初始化时,程序员只需要指定数组的长度,系统自动赋予初始值,有如下的规则:

(1)数组元素的类型是基本类型中的整型类型(byte,short,  int  和 long),则元素为0。

(2)数组元素的类型是基本类型中的浮点类型(float, double),则元素为0.0。

(3)数组元素的类型是基本类型中的字符类型(char),则元素为‘\u0000’。

(4)数组元素的类型是基本类型中的布尔类型(boolean),则元素为‘false。

(3)数组元素的类型是引用类型(类,接口和数组),则元素为null

注意:不要同时使用静态初始化和动态初始化,即不要既指明长度又为每个元素赋初始值。

(3)foreach循环

一般遍历一个数组要获取他的属性length的值,但是foreach循环会自动遍历数组的每一个元素。

格式 for(type variableName:array)

         {

          //variableName自动迭代访问每个元素,不要对该变量赋值

         }

public class test{
	public static void main()(String [] args){
       		String [] book={"ab","cd","ef"};
           	for(String book:books)
               System.out.println(book);
		}
}

3.深入了解数组

(1)内存中的数组

  实际的数组对象被存储在堆(heap)内存中,如果引用该数组对象的数组引用变量是一个局部变量,那么它被存储在栈(stack)内存中。数组在内存中的存储示意图如下:


  如果堆内存中数组不再有任何引用变量指向自己,则这个数组将成为垃圾,该数组所占用的内存空间将会被系统的垃圾回收机制回收。

  只要类型相互兼容,就可以让一个数组变量指向另一个实际的数组,这会让人产生数组的长度可变的错觉。如下代码:

public class arrayTest{
	public static void main(){
	  int [] a= {5,7,20};
	  int [] b= new int[4];
	  System.out.println("b数组的长度为:"+b.length);
          for(int num:a)
             System.out.println(num);
          for(int i=0;i<b.length;i++)
             System.out.println(b[i]);
          b=a;
          System.out.println("b数组的长度"+b.length);
	}
}

执行b=a后


(2)引用类型的初始化

先定义一个Person 类

class Person{
	public int age;
	public double height;
	public void info(){
		System.out.println("我的年龄是"+age+",我的身高是:"+height);
		}
}

public class ArrayTest{
	public static void main(String[] args) {
		Person[] students;
		students=new Person[2];
		Person zhang=new Person();
		zhang.age=15;
		zhang.height=158;
		Person cheng=new Person();
		zhang.age=16;
		zhang.height=161;
		students[0]=zhang;
		students[1]=cheng;
		cheng.info();
		students[1].info();
	}
}
第一步:执行Person[ ] students,此时仅仅在栈内存中定义了一个引用变量,也是一个指针,该指针没有指向任何内存区。



第二步:动态初始化:students=new Person[2],每个元素的值为null(引用类型的默认值)。


第三步:students数组的两个数组元素都是引用,这个引用没有指向人格有效的内存,这意味着依然不能使用students数组。接下来定义两个变量zhang和cheng。


第四步:依次把zhang和cheng赋值给students数组的两个元素,他们属于同意内存区,注意内存中加引号是代表的这个person对象。


4.Array类

java提供的Array类里包含了一些static修饰的方法可以直接操作数组(可以直接通过类名调用):

(1)int binarySearch(type[ ] a,type key):二分法查找要求已经升序排列,没有找到则返回负数。

(2)int binarySearch(type[ ] a,int fromIndex,int toIndex,type key):和第一个类似规定了范围查找。

(3)type[ ] copyOf(type[ ] original,int length):把original数组复制到一个新的数组,length是新数组的长度,如果length小于原数组长度就截取length长度的元素,大于的话在后面补充0(数值类型),false(布尔类型)和null(引用类型)。

(4)type[ ] copyOfRange(type[ ] original,int from,int to):加范围复制。

(5)boolean equals(type[ ] a,type[ ] a2):如果长度相等且元素一致返回true。

(6)void fill(type[ ] a,type val):把数组a中的所有元素赋值val。

(7)void fill(type[ ] a,int fromIndex,int toIndex,type val ):加了范围.

(8)void sort(type[ ] a):从小到大排序。

(9)void sort(type[ ] a,int fromIndex,int toIndex).

(10)String toString(type[ ] a):将数组转换为字符串。

//在这里补充一下:

java为8中基本类型提供了对应的包装类:boolean对应Boolean,byte对应Byte,short对应Short,int对应Integer,long对应Long,char对应Character,float对应Float,double对应Double,可以通过调用函数parseXxx来把字符串类型转换成基本类型。

String a=“45”;
int val=integer.parseInt(a);//val=45





<think>好的,用户需要查找Java数组相关的知识点总结。首先,我得整理用户提供的引用内容,看看有哪些关键点需要覆盖。根据引用中的信息,数组的定义、声明创建、内存分析、初始化、遍历以及常用方法都是重点。 用户提到的引用[1]到[5]涵盖了数组的基础概念、声明方式、内存分配、静态和动态初始化以及比较方法。我需要将这些内容系统地组织起来,确保结构清晰。例如,先概括数组的基本概念,再分点讲解声明和创建、内存分析、初始化和遍历,最后提到常用方法如Arrays工具类。 同时,用户提供的示例中提到了代码块的使用,我需要确保代码示例正确,并符合Java语法。比如,数组的静态和动态初始化示例,以及使用Arrays.toString和Arrays.equals的方法。还要注意引用标识的正确添加,比如在内存分析部分引用[3]和[4]。 另外,用户要求生成相关问题,我需要根据内容提出几个相关问题,可能涉及数组的特点、默认值、遍历方式、深浅拷贝以及工具类使用等。这些问题应该能够帮助用户进一步巩固知识点。 需要检查是否有遗漏的重要知识点,比如数组的默认值、多维数组或者数组的异常处理,但根据提供的引用内容,可能不需要深入这些方面。另外,确保回答中使用中文,并且数学表达式正确应用,但在这个问题中可能涉及较少数学内容,主要关注代码和文字描述。 最后,确保回答结构符合用户的要求,分点明确,引用正确,并且语言通顺自然。避免使用Markdown格式,用段落和代码块区分内容。确认所有引用来源都正确标注,没有错误信息。</think>### Java数组知识点总结 #### 一、数组的定义与特点 数组是**相同数据类型元素的有序集合**,通过下标访问元素,索引从$0$开始。数组在内存中占用连续空间,属于引用数据类型,存储于堆内存中[^3][^4]。 #### 二、数组的声明与创建 1. **声明方式** - 首选语法:`数据类型[] 数组名` - 兼容语法:`数据类型 数组名[]`(不推荐) ```java int[] arr1; // 推荐 String arr2[]; // 不推荐 ``` 2. **动态初始化** 创建数组时指定长度,元素初始值为默认值(如`int`类型为$0$,引用类型为`null`)[^5]。 ```java int[] arr = new int[3]; // 创建长度为3的整型数组 ``` 3. **静态初始化** 直接指定元素值,长度由系统推断[^5]。 ```java int[] arr = {1, 2, 3}; // 简化写法 String[] names = new String[]{"Alice", "Bob"}; // 完整写法 ``` #### 三、内存分析 Java数组的创建涉及以下内存分配过程: 1. 声明数组变量时,栈内存分配引用空间 2. `new`操作在堆内存中开辟连续存储空间 3. 数组变量指向堆内存地址[^3]。 例如: ```java int[] arr = new int[3]; // 栈中存引用arr,堆中分配3个int空间 ``` #### 四、数组的访问与遍历 1. **通过索引访问元素** ```java arr[0] = 10; // 修改第一个元素 System.out.println(arr[1]); // 输出第二个元素 ``` 2. **遍历方式** - for循环: ```java for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } ``` - 增强for循环: ```java for (int num : arr) { System.out.println(num); } ``` #### 五、数组的常用方法 1. **数组长度** ```java int len = arr.length; // 注意是属性而非方法 ``` 2. **数组比较** 使用`Arrays.equals()`比较内容,而非`==`(比较引用地址)[^2]。 ```java int[] a = {1,2}, b = {1,2}; System.out.println(Arrays.equals(a, b)); // true ``` 3. **数组转字符串** ```java System.out.println(Arrays.toString(arr)); // 输出格式如"[1, 2, 3]" ``` #### 六、多维数组 以二维数组为例: ```java int[][] matrix = new int[2][3]; // 2行3列 int[][] arr = {{1,2}, {3,4}}; // 静态初始化 ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值