数组
1.数组类型:
保存一组其他类型的数据,元素类型(Element type)
int[] double[]
int[] intArray
和C语言兼容的方式: int intArray[]... 规则允许,规范不建议使用
2.数组的初始化(数组的长度固定)
1>静态的方式 用到已知数组所有的元素
Java: int[] array={1,2,3,4,5}; int[] array=new int[]{1,2,3,4,5};(更多用在匿名数组)
C++: int array[5]={1,2,3,4,5};
2>动态的方式
JAVA: int[] array=new int[数组的长度];
C++: int*array=new int[5]{1,2,3,4,5}; int*array=new int[5]
3>不初始化数组,制定一个null字面量
int[] array=null; null是空引用
3.数组的下标访问,用中括号[]指定具体的下标
1>下标的类型一定是int
2>下标的取值范围,数组的长度是N个,则[0,N-1]
和C语言的区别:如果越界,C语言在运行期间出错,JAVA将会抛异常
4.数组本质上其实也是对象(Object类的派生类)
1>属性
int[] array=...;
array.length 数组的长度
2>方法
数组本质上是引用类型,是对象,和基本数据类型有很大区别
理解引用背后的内存模型:
1.引用类型和基本数据类型的差别
基本类型:int a=100
引用类型:int[] array={1,2,3,4}
2.Java粗略的吧内存分为栈(stack)和堆(heap)
栈上:局部变量 形参
堆上:对象(数组的对象)
无论引用变量保存在堆上或者栈上,背后的数据(对象)一定是堆上
3.方法调用过程中 ,无论是基本数据类型还是引用数据类型
实参到形参都是值传递(形参改变不影响实参),在栈里拷贝了一份
但引用传递,如果更改的是对象内部的值,则实参可以感受到变化
4.调用栈的过程
注意:局部变量 形参 实参 生命周期 作用域
5.int a=100
=左边是空间
=右边是值
数组常用的方法:
import java.util.Arrays;//引用包
Arrays需要util.Arrays包
1.toString(数组) 打印
2.copyOf(数组,数组长度) 复制一份数组
数组长度<=数组的长度 直接拷贝
数组长度>数组的长度 后面添加0
int[] a={1,2}; int[] b=Arrays.copyOf(a) 此时a,b互不影响
int[] a={1,2}; int[] b=a; 此时a,b互相影响
System.arraycopy(原数组,开始下标,目标数组,开始下标)
目标数组需要先申请好空间
3.copyOfRage(原数组,from,to) [)
4.sort | parallelSort 排序
5.fill 填充
注意:N维数组
C,C++中:由一个个“n-1维数组”组成,并且此时长度一样长,并且内存连续
JAVA:数组保存数组的数组,并且数组中每个元素“数组”的长度可以不一样