Java数组
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java数组,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含7067字,纯文字阅读大概需要11分钟。
内容图文
![Java数组](/upload/InfoBanner/zyjiaocheng/620/fce3c4b9f7d04ab0be1cdaa2524c3299.jpg)
一、数组—Array
数组是存放一组相同类型数据的容器,数组中的每一个数据叫数组的元素,所有元素在内存中连续存放,并且使用相同的数组名引用
二、数组的声明
【声明格式】
数据类型[]数组名 常用
数据类型 数组名[]
(1)[]表示是该变量是数组类型,而不是单个数据
(2)声明数组时,不能指定数组的长度,即[]内不能写数字
(3)只在栈空间声明了数组型的引用变量,声明后数组还不能立刻使用
如:
public static void main(String[] args){
int[] arr;
System.out.println(arr);
//Variable 'arr' might not have been initialized
}
三、数组的定义
【定义格式1】—只分配堆内存空间,不初始化数据
数据类型[]数组名 = new 数据类型[数组长度]; 常用
数据类型 数组名[] = new 数据类型[数组长度];
(1)new关键字表示在内存的堆空间中创建数组对象
(2)数组长度必须指定,可以是整型常量,整型变量,或表达式
(3)数组创建后,每个数组元素都取默认值
整数数组—0
小数数组—0.0
boolean数组—false
char数组—’’
引用类型数组(对象数组)—null
【定义格式2】
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3,...};
数据类型[] 数组名 = {元素1,元素2,元素3,...}; //简化形式,更为常用
(1)创建数组时,每个数组元素都有指定的数据值
(2)[]中无需指定数组的长度,长度取决于给出的数据个数
【注意】数组是一个定长的数据集合,一旦创建和初始化完毕,数组的长度就固定不变了
四、数组元素的访问和遍历
(1)数组对象中每一个数据叫做数组元素,他们有相同的名称,使用下标区分每个元素,下标是从0开始的整数,最大值是数组长度-1
(2)每个数组都有一个length属性,返回数组的长度—数组名.length
(3)数组是引用数据类型,直接打印数组名时,返回的格式形如:[I@1db8759
其中左方括号表示是一个数组 大写字母I表示是整型数组 @后面的数字串表示数组在内存中的地址
(4)引用单个的数组元素—数组名[下标]
(5)遍历整个数组—利用循环语句依次访问每一个数组元素
五、使用数组时容易产生的问题
(1)元素下标越界时,抛出ArrayIndexOutOfBoundsException异常
(2)当数组变量赋值为null时,表示该变量不指向任何堆内存空间,这种情况下访问数组元素时,会抛出空指针异常NullPointerException
六、JVM的内存结构
1.JVM的五大存储区
1)栈区—stack
JVM为每个运行的线程创建一个独立的方法栈,因此栈区一定是线程安全的
栈区中存放程序执行时调用的每个方法的相关信息,这些信息统称为栈帧(Stack Frame)
栈帧的内容包括方法调用语句的位置,传到方法中的实参,方法中的临时变量等
每调用一个方法,就将该方法的栈帧压入Stack中,方法返回时,该栈帧从Stack中出栈
所有基本数据类型的局部变量的值和所有Java对象的引用(对象在堆内存中的地址)
2)堆区—Heap
Heap区存放所有的Java对象实例的具体属性数据,所有线程共享堆区的内容
该区域中的对象按照存活时间进一步划分为新生代,幸存者代,老年代三块区域,以便被不同的垃圾回收器回收
3)方法区—Method Area
方法区存放JVM加载的类的元信息(Class Meta Data),静态变量(static),常量(constant),实例方法和静态方法的代码
4)本地方法区—Native Method Area
本地方法区存放使用非Java语言编写的本地方法代码,如C/C++的动态链接库,JVM通过JNI(Java Native Interface)调用本地方法
如:Object类的clone()方法,FileInputStream的read()方法,Tread类的start()方法都是本地方法
5)程序计数器—Program Counter Register
程序计数器中存放的每个线程当前正在执行的字节码指令的地址(行号),JVM的执行引擎从PCR中获取当前要执行的语句的地址
***基本数据类型和引用数据类型的区别
(1)基本数据类型只有八种(byte short int long boolean char float double)
其余的都属于引用数据类型,又叫对象类型,如数组,字符串等
(2)占用的内存空间不同
基本数据类型的变量和对应的数据都存放在栈空间中
引用数据类型的数据存在于堆空间中,而引用型变量存在于栈在空间中,相当于一个指针指向堆空间的某个对象,存储的对象在堆空间中的首地址
(3)生命周期不同
基本数据类型的作用范围是定义它的一对{}内,一旦出了大括号的范围,基本数据类型就被销毁
引用型数据的作用范围是从创建对象开始(new),一旦数据没有被任何引用变量引用(null),则对象成为垃圾,一旦被垃圾回收器回收,引用类型数据就被销毁
七、Java中方法调用时参数的传递机制
无论何种数据类型,Java中均采用值传递的机制,没有引用传递的概念
(1)基本类型参数,传递的是变量的数据值
(2)引用类型参数,传递的是变量的引用地址值
八、改变数组的内容和改变数组的指向
public static void main(String[] args){
int[] arr = {1,2};
change(arr);
System.out.println("arr[0]="+arr[0]+"arr[1]="+arr[1]);
}
static void change(int[] arr){
arr[1]=10; //改变数组的内容
arr = new int[5]; //改变数组的指向
}
九、数组的特点
【特点1】
数组可以存储多个类型相同的数据,靠下标区分每个元素,下标从0开始
【特点2】
数组一经创建,长度就固定了,不可改变
【特点3】
数组是引用类型数据,数组中的实际数据保存在堆内存中,而且元素之间的地址连续的数组变量位于在栈内存中,仅仅保存数组数据在堆内存中的首地址
【优点】
根据下标随机访问元素速度快
由于数组元素是顺序存放的,所以只要知道数组的首地址,就可以快速计算出任意元素的存储位置 Loc(i)=Loc(0)+i*Length,时间复杂度是O(1)
【缺点1】
由于数组元素是顺序存放的,所以数组的长度不宜过大(可能连续的内存空间不足)
【缺点2】
在数组中间插入和删除元素都很麻烦,因为要进行元素的整体移动,时间复杂度是O(n)
十、数组的排序
1.排序算法的分类
(1)内部排序(使用内存)
1)插入排序(直接插入排序)(希尔排序)
2)选择排序(简单选择排序)(堆排序)
3)交换排序(冒泡排序)(快速排序)
4)归并排序
5)基数排序
(2)外部排序(内存和外存结合使用)
2.排序算法的时间复杂度
3.必须掌握的基本排序算法
(1)冒泡排序—每次比较相邻的两个元素,不符合排序规则就相互交换位置
【特点】
内循环可能做多次交换,效率低
(2)选择排序—每次选择出最大或最小的下标,和当前位置元素交换
【特点】
内循环只做一次交换,效率高
十一、数组的查找
1.顺序查找
总是从第一个元素依次查找,效率低,优点是数组可以无序
2.折半查找(二分查找)
查找范围每次减少一半,效率高,使用前提是数组必须是升序排列的
十二、数组工具类—Arrays
将常用的操作代码定义成函数,并以工具类的形式提供给开发人员使用,这是最基本的封装操作,可以提高代码的复用性
JDK提供了一个Arrays类,封装了数组的常用操作,每个方法都是静态的,直接使用类名.方法名的形式直接调用,该类在java.util包中
【常用方法】
static void sort() //数据排序
(1)基本数据类型的数组,sort()方法内部使用快速排序算法
public static void sort(int[] a){
DualPivoQuicksort.sort(a,0,a.length - 1,null,0,0);
}
(2)引用数据类型的数组,sort()方法内部使用归并排序算法
public static<T> void sort(T[]a,Comparator<?super T>c){
if(c== null){
sort(a);
}else{
if(LegacyMergeSort.userRequested)
legacyMergeSort(a,c);
else
TimSort.sort(a,0,a.length,c,null,0,0);
}
}
static int binarySearch() //二分查找
public static int binarySearch(int[] a,int key){
return binarySearch0(a,0,a.length,key);
}
private static int binarySearch0(int[] a,int fromIndex,int toIndex,int key){
int low = fromIndex;
int high = toIndex - 1;
while(low <= high){
int mid = (low + high) >>> 1;
int midVal = a[mid];
if(midVal < key)
low = mid + 1;
else if(midVal > key)
high = mid -1;
else
return mid; //key found
}
return -(low + 1); //key not found
}
static String toString() //返回数组的字符串表示形式【元素1,元素2,…,元素n】
十三、二维数组
数组的每个元素又是一个数组,二维数组可以理解为“数组中的数组”
【定义格式1】动态初始化
数据类型[][] 数组变量名 = new 数据类型[长度1][长度2];
【注意】长度1必须指定,长度2可以不指定
【定义格式2】静态初始化
数据类型[][] 变量名 = {{元素1,元素2,...},{元素1,元素2,...},...}
(1)引用二维数组的数组元素时,需要使用两个下标—数组名[下标1][下标2]
(2)二维数组中每个内部一维数组的长度可以不同,初始化每组数据的个数也可以不同
int[][] arr = {{1,2,3},{4,5},{6,7,8,9}};
(3)操作一维数组时,需要使用一重循环
操作二位数组时,需要使用二重循环
(4)二维数组的使用场合—游戏界面中的棋盘 数学中的矩阵运算
内容总结
以上是互联网集市为您收集整理的Java数组全部内容,希望文章能够帮你解决Java数组所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。