Java笔记_4
一、数组
1.1、什么是数组
- 什么是数组呢?
- 数组指的是一种容器,可以用来存储同种数据类型的多个值
数组容器在存储数据的时候,需要结合隐式转换考虑。
- 例如:int类型的数组容器( boean byte short int dove)
- 例如: double类型的数组容器(byte short int long float double )
- 建议:容器的类型,和存储的数据类型保持一致
1.2、数组的定义和静态初始化
- 数组的静态初始化
初始化:就是在内存中,为数组容器开辟空间,并将数据存入容器中的过程
完整格式:数据类型[]数组名= new数据类型[]{元素1,元素2,元素3... };
简化格式:数据类型[]数组名={元素1,元素2,元素3...};
1.3、数组的地址值和元素访问
定义一个数组,直接打印该数组拿到的是数组的地址值
- 解释一下地址值的格式含义[D@776ec8df
- [:表示当前是一个数组
- D:表示当前数组里面的元素都是double类型的
- @:表示一个间隔符号。(固定格式)
- 776ec8df:才是数组真正的地址值,(十六进制)
- 平时我们习惯性的会把这个整体叫做数组的地址值。
索引
- 索引:也叫做下标,角标。
- 索引的特点:从0开始,逐个+1增长,连续不间断
1.4、数组的遍历
数组遍历
- 数组遍历:将数组中所有的内容取出来,取出来之后可以(打印,求和,判断…)
- 注意:遍历指的是取出数据的过程,不要局限的理解为,遍历就是打印!
通过数组.length
可以打印直接得出数组的长度,利用for循环就可以遍历数组
1.5、动态初始化和常见问题
- 动态初始化:初始化时只指定数组长度,由系统为数组分配初始值。
- 格式:
数据类型[]数组名= new数据类型[数组长度];
- 范例:
int[]arr = new int[3];
数组默认初始化值的规律:
- 整数类型:默认初始化值
0
- 小数类型:默认初始化值
0.0
- 字符类型:默认初始化值
'/u0000'空格
- 布尔类型:默认初始化值
false
- 引用数据类型:默认初始化值
null
动态初始化和静态初始化的区别
动态初始化:手动指定数组长度,由系统给出默认初始化值。
- 只明确元素个数,不明确具体数值,推荐使用动态初始化
- 举例:使用数组容器来存储键盘录入的5个整数。
int[]arr = { ? ? ? ? ?};
int[]arr = new int[5];
静态初始化:手动指定数组元素,系统会根据元素个数,计算出数组的长度。
- 需求中已经明确了要操作的具体数据,直接静态初始化即可。
- 举例:将全班的学生成绩存入数组中11,22,33
int[]arr = {11,22,33};
1.6、求最值
int []arr = {11,22,33,55,88,66};
int arr[0] = max;
for(int i = 1;i<arr.length;i++){
if(arr[i]>max){
max = arr[i];
}
}
//此时max里的值就是数组的最大值
1.7、遍历数组求和
需求:生成10个1~100之间的随机数存入数组。
- 求出所有数据的和
- 求所有数据的平均数
- 统计有多少个数据比平均值小
int[] arr = new {};
Random r = new Random();
for (int i = 0; i < arr.length; i++) {
//每循环一次,就会生成一个新的随机数
int number = r.nextInt( bound: 100) +1;
//把生成的随机数添加的数组当中
//数组名[索引]=数据;
arr[i] = number;
}
// 1)求出所有数据的和//定义求和变量
int sum = 0;
for (int i = 0; i < arr.length; i++) {
//循环得到每一个元素
//并把元素累加到sum当中
sum = sum + arr[i];
}
System.out.println("数组中所有数据的和为:" + sum) ;
//2)求所有数据的平均数
int avg = sum / arr.length;
System.out.println("数组中平均数为:" + avg);
//3)统计有多少个数据比平均值小int count = 0;
for (int i = o; i < arr.length; i++) {
if(arr[i] < avg){
count++;
}
}
//当循环结束之后,就表示我已经找到了所有的比平均数小的数据
System.out.println("在数组中,一共有"+ count +"个数据,比平均数小");
//遍历数组,验证答案
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] +"");
}
1.8、交换数组中的数据
- 需求:定义一个数组,存入1,2,3,4,5。按照要求交换索引对应的元素。
- 交换前:1,2,3,4,5
- 交换后:5,2,3,4,1
int[] arr={1,2,3,4,5};
for(int i =0,j=arr.length-1;i<j;i++,j--){
int temp =arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
for (int i = 0;i<arr.length;i++){
System.out.print(arr[i]+"");
}
1.9、打乱数组中的数据
需求:定义一个数组,存入1~5。要求打乱数组中所有数据的顺序。
//1.定义数组存储1~5
int[] arr = {1,2,3,4,5};
//2.循环遍历数组,从0索引开始打乱数据的顺序
Random r = new Random();
for (int i = o; i < arr.length; i++) {
//生成一个随机索引
int randomIndex = r.nextInt(arr.length);
//拿着随机索引指向的元素跟i指向的元素进行交换
int temp = arr[i];
arr[i] = arr[randomIndex];
arr[randomIndex] = temp;
}
//当循环结束之后,那么数组中所有的数据已经打乱顺序了
for (int i = 0; i < arr.length; i++){
System.out.print(arr[i] +"");
}
1.10、数组的内存图
Java内存分配
区域 | 存储内容 |
---|---|
栈 | 方法运行时使用的内存,比如main方法运行,进入方法栈中执行 |
堆 | 存储对象或者数组,new来创建的,都存储在堆内存 |
方法区 | 存储可以运行的class文件 |
本地方法栈 | JVM在使用操作系统功能的时候使用,和我们开发无关 |
寄存器 | 给CPU使用,和我们开发无关 |
- 只要是new出来的一定是在堆里面开辟了一个小空间
- 如果new了多次,那么在堆里面有多个小空间,每个小空间中都有各自的数据
- 当两个数组指向同一个小空间时,其中一个数组对小空间中的值发生了改变,那么其他数组再次访问的时候都是修改之后的结果了。
二、方法
2.1、什么是方法
- 方法(method)是程序中最小的执行单元
- 实际开发中,什么时候用到方法?
- 重复的代码、具有独立功能的代码可以抽取到方法中。
- 实际开发中,方法有什么好处?
- 可以提高代码的复用性
- 可以提高代码的可维护性
2.2、方法的格式
最简单的方法
格式:
public static void 方法名(){
方法体(就是打包起来的代码);
}
调用
方法名();
带参数的方法
格式:
public static void method(int num1,int num2) {
int result = num1 + num2;
System.out.println(result);
}
带返回值方法的定义和调用
格式:
public static 返回值类型 方法名(参数){
方法体;
return 返回值;
}
- 什么时候用到有返回值的方法?
- 在调用处要根据方法的结果,去编写另外一段代码。
- 有返回值方法的调用格式
- 直接调用,赋值调用, 输出调用
方法的完整格式:
public static 返回值类型 方法名(参数){
方法体;
return返回值;
}
2.3、方法的重载
- 在同一个类中,定义了多个同名的方法,这些同名的方法具有同种的功能。
- 每个方法具有不同的参数类型或参数个数,这些同名的方法,就构成了重载关系
- 简单记:同一个类中,方法名相同,参数不同的方法。与返回值无关。
- 参数不同:个数不同、类型不同、顺序不同
2.4、数组遍历
需求: 设计一个方法用于数组遍历,要求遍历的结果是在一行上的。例如:[11,22,33,44,55]
public static void printArr( int[] arr){
System.out.print("[");
for (int i = e; i < arr.length; i++) {
if(i ==arr. length - 1){
System.out.print(arr[i]);
}else{
System.out.print(arr[i] + ",");
}
}
System.out.println( "]");
}
2.5、数组的最大值
需求:设计一个方法求数组的最大值,并将最大值返回
public static int getMax (int[] arr){
int max = arr[0];
for (int i = 1; i < arr.length; i++)
if( arr[i] > max){
max = arr[i];
}
}
return max;
}
2.5、判断是否存在
定义一个方法判断数组中的某一个数是否存在,将结果返回给调用处
public static boolean contains(int[] arr, int number){
//查89是否存在
for(int i = e; i < arr.length; i++) {
if( arr[i] ==number)i
return trie;
}
//什么时候才能断定89,在数字中是不存在的?
//当数组里面所有的数据全部比较完毕之后,才能断定
return false;
2.6、拷贝数组
- 需求:
- 定义一个方法copyOfRange(int[] arr,int from, int to)
- 功能:
- 将数组arr中从索引from(包含from)开始。
- 到索引to结束(不包含to)的元素复制到新数组中,将新数组返回。
//将数组arr中从索引from(包含from)开始,到索引to结束(不包含to)的元素复制到新数组中
public static int[] copyOfRange(int[] arr,int from,int to){// 3~7
//1.定义数组
int[ ] newArr = new int[to - from];
//2.把原始数组arr中的from到to上对应的元素,直接拷贝到newArr中
//伪造索引的思想
int index = 0;
for (int i = from; i < to; i++) {
//格式:数组名[索引]=数据值;
newArr[index] = arr[i];
index++;
}
//3.把新数组返回
return newArr;
}
2.7、方法的内存
-
基本数据类型:数据值是存储在自己的空间中
- 特点:赋值给其他变量,也是赋的真实的值。
-
引用数据类型:数据值是存储在其他空间中,自己空间中存储的是地址值。
- 特点:赋值给其他变量,赋的地址值。
方法的值传递
传递基本数据类型时,传递的是真实的数据,形参的改变,不影响实际参数的值