第4章:流程控制与数组

4.1 循环

break:结束整个循环

continue:结束本次循环

return:结束整个方法

4.2 栈内存与堆内存

当方法执行时,每个方法都会建立自己的栈内存

4.2.1 储存原理
  1. 一个方法中定义的引用会存放到该方法独自的栈内存中,随着方法的结束,该方法的栈内存也将自动销毁。引用的为基本类型时,栈内保存该引用与该引用对应的值,引用的为引用类型时,栈内保存地址用于指向其引用的对象
package test.wsh;

public class Test {
    //main方法调用时会开辟独自的栈内存
	public static void main(String[] args) {
	    //a和它的值5都存放在栈中
		int a = 5;
		//b和其所指向的对象的地址存放在栈中
		//b所指向的对象存放于堆内存中
		String b = new String("handidiao");
	}
	
}

4.2.2 堆内存

一个方法中创建的对象或数组,会保存在堆内存中,以便反复利用,当这个对象没有任何引用去引用它时,系统的垃圾回收器(GC)会去回收它。由于对象都在堆中,所以对象中的基本类型的成员变量也是存放在堆中的

4.2.3 栈与堆的区别
  1. 堆:先进先出(一头进另一头出),栈:后进先出(从同一头进出)
  2. 堆:可以动态分配内存大小,存取速度慢,栈:存取速度快,但内存大小与生存期固定,缺乏灵活性
  3. 堆:没有任何引用来引用堆中的对象时进行回收,栈:方法结束后回收

4.3 数组

4.3.1 理解
  1. 数组是一种引用类型
  2. 数组初始化完成后,在内存中所占空间被固定,所以长度不可变,即使将某数组元素清空,空间不变,长度仍不变
  3. List的toArray()方法只能将List转为Object[],Object[]为任何数组类型的父类,父类强转成子类会报错。List的T[] toArray(T[] a)可以将List转为T类型的数组,如果a.length>list.size(),则新数组前list.size()为list中的值,第size位为0,后几位为原数组中的值,如果a.length<=list.size(),新数组完全为list中的值
//即使Object[]中的值都为Integer型,Object[]也不可以转为Integer[],因为父类的引用如果不是指向子类对象,强转为子类会报错
//Integer[] a = (Integer[])new Object[]{2,5};
//Object[]为Integer[]的父类,所以可以自动转换
Object[] a = new Integer[]{2,5};
//Object为所有类型的父类,当然也包括Object[]
Object c = new Integer[]{2,5};
//由于a是指向Integer[]的实例的,所以虽然a的类型为Object[]但是可以被转换为Integer[]
Integer[] b = (Integer[])a;
Integer[] d = (Integer[])c;
4.3.2 定义数组
//此时相当于定义一个引用变量,还未指向任何有效内存,此时不可定义其长度,也不可使用,必须先初始化
//type[5] arrayName;
type[] arrayName;
4.3.3 初始化数组:要么初始化长度要么初始化各元素具体值
//静态初始化:指定每个数组元素初始值,系统判断长度
arrayName = new type[]{element1,element2,...,element n};
arrayName = {element1,element2,...,element n};
//动态初始化:指定数组长度,由系统判断各数组元素初始值。
//表示数组长度为5,即最大的元素的下标为4
//数组类型不同,其内元素初值不同,引用类型:null,浮点:0.0,布尔:false,整型:0,字符:'\u0000'
arrayName = new type[5];
//不可以同时静态初始化和动态初始化,初始化数组时的元素类型是定义数组时元素的子类
4.3.4 使用数组
type a = arrayName[2];
int b = arrayName.length;
4.3.5 foreach循环
//相当于把arrayName中的值依次放入a中,可通过此方法获取数组或集合中的值,但不可以通过此方法修改数组或集合中的值,因为这个方法只会改变a的值,不会改变arrayName中元素的值
for(type a : arrayName){
    
};
4.3.6 深入数组
  1. 内存中的数组:
//局部变量a存放在栈中,而实际其指向的数组对象存放在堆中
int[] a = new int[5];
a= new int[6];
//数组对象的长度不可变,但引用a可以指向其他数组,所以会造成长度可变的错觉
System.out.println(a.length);
  1. 基本类型数组的初始化
  2. 引用类型数组的初始化
  3. 没有多维数组
//将int[]看成一个类型,下面代码可以看做定义一个内部元素为int[]类型的数组,长度为4
int[][] a = new int[4][];
//a[0]为int[]类型,长度为2
a[0] = new int[2];
a[0][1] = 6;
  1. Arrays类:以下均为static方法,即可以Arrays.方法名进行调用
//使用前必须使用Arrays.sort(数组)对数组进行排序binarySearch才有效
//查找值在数组中的索引
int binarySearch(数组,值)
//包含起始索引,不包含终止索引
int binarySearch(数组,起始索引,终止索引,值)
//复制出一个新数组
type[] copyOf(数组,新数组长)
//包含起始索引,不包含终止索引
type[] copyOfRange(数组,起始索引,终止索引)
//两个数组对应值一一相等时返回true
boolean equals(数组1,数组2)
//将数组起始索引到终止索引的元素赋值成参数中的值,不包括终止索引所对应的元素
void fill(数组,值)
//包含起始索引,不包含终止索引
void fill(数组,起始索引,终止索引,值)
//将数组中元素升序排列
void sort(数组)
//将数组转为字符串,以"[]"开头和结尾,多个元素以","分隔
String toString(数组)
//取字符串中第一个字符
char a = 字符串.charAt(0);
发布了32 篇原创文章 · 获赞 0 · 访问量 952

猜你喜欢

转载自blog.csdn.net/hanzong110/article/details/102409789
今日推荐