数组
一.数组基本概念
1.语法(arrays):定义数组,初始化数组
2.内存模型:遇到的第一个引用类型(重点+难点)
3.数据类型:
1)基本数据类型
2)引用数据类型
(1)数组类型
(2)对象类型
(3)接口类型
4.数组类型,保存一组其他类型的数据,元素类型(Element type)
int [] / double []
变量:数据类型 变量名称;
1)int [] intArray;
2)double [] doubleArray;
注意:和c语言兼容的方式
1)int intArray [];
2)double doubleArray []; //规则允许,但规范不建议使用
5.数组的初始化(数组的长度是固定的)
数组的长度,一旦创建好,不能更改,固定大小
1)静态的方式:用到已知数组所有的元素
int [] array={1,2,3,4,5};
int [] array=new int []{1,2,3,4,5}; //给方法传参数,匿名数组
2)动态的方式
int [] array=new int [数组的长度];
3)不初始化数组 指定一个null字面量
int [] array=null;
6.数组的下标访问,用中括号[] 指定具体的下标
1)下标的类型一定是 int
2)下标的取值范围是,数组的长度是n个,则[0,n-1]
数组下标越界会产⽣"java.lang.ArrayIndexOutOfBoundsException"异常信息
数组作为引⽤数据类型,也⼀定可以发⽣引⽤传递。
引⽤传递空间:同⼀块堆内存空间可以被不同的栈内存所指向。
7.数组本质上也是对象(Object类的派生类)
1)属性 对象.属性
int [] array=……; 对象.方法()
array.length 数组中元素的个数
2)方法
8.数组本质上是引用类型,是对象,和基本数据类型有很大区别
1)int a =100;
左边的空间,究竟存在什么位置
(1)内存
java粗略的把内存分成了栈(Stack) 和 堆(Heap)
栈上:局部变量和形参(paramaters)
堆上:对象(数组的对象)
void print (itn a){ a=100; 保存在栈
System.out.println(a); 1.局部变量
}; 2.参数
void main(){
int a=10; print(a); 值传递
}
print中的a是形参(paramaters)
main中的a是参数(arguments)
值传递,改变形参,不会影响到实参,因为值传递本质上是复制了一份
9.数组类型(引用类型(reference))
void main (){
int [] array={1,2,3,4,5};
printArray(array);
}
printArray(int [] array){
……
}
void main(){
int [] array={1,2,3,4,5};
method1();
method2();
}
void method1(int [] array){
array=new int [10];
//array变成1……10
} //最后array为{1,2,3,4,5}不变的
void method2(int [] array){
array[2]=200;
} //array变为{1,2,200,4,5}
10.java的数组原生支持java.util.Arrays支持
1)Arrays.toString 打印数组
2)Arrays.copyOf 复制一份数组 System.arraycopy
3)Arrays.copyOfRange
4)Arrays.fill 填充值
5)Arrays.sort/parallelSort
6)Arrays.binarySearch 二分查找
OJ(Online Judge)
11.默认值 0的各个类型的表现
byte/short/int/long 0
float/double 0.0
char 0x0000
boolean false
reference null
变量未初始化时,默认给的值,局部变量无法享受默认值,参数没有默认值
总结:
1.模型
1).引用类型的变量:无论引用变量保存在栈上还是堆上,背后的数据(对象)一定在堆上
2)解析空间不同:基本数据类型和引用数据类型
2.方法传递
1)无论是基本类型还是引用类型,都是简单的值传递(拷贝传递),形参改变不影响实参
2)引用传递时,如果通过形参引用,修改了真实对象(存在堆)的值(array[0]),实参可以感受到变化
3.调用栈的过程
框中的主要用处就是保存局部变量和形参
作用域(scope)和生命周期(lifecycle)
int a=100; =左边是空间,=右边是值
注意点:
System.out.println(String message); 自带换行
System.out.print(String message); 不换行
无论message是是什么类型,java都会想办法变成String
System.out.printf(String format,变长的参数);
System.out.format(String format,变长的参数);
前面指定格式,后边跟参数 %d%f %s
%n是换行,不要直接用\n