今日重点:堆,栈,字符串常量池,数组
一.数据类型分类:
1.分为基本数据类型和引用数据类型
2.八大基本数据类型:byte,short,int,long,float,double,boolean,char,注意基本数据类型所对应的封装类类型也是引用数据类型.
3.引用数据类型,除了基本数据类型之外都是引用数据类型
4.这种分类依据是这两种数据类型在内存中的存储原理不同
5.基本数据类型使用==比较值,引用数据类型使用==比较地址
6.基本数据类型使用=赋值,引用类型使用=赋地址
二.JVM内存区域初步了解
在计算机中任何运行的程序都是在内存中的,jvm也运行在内存中,为了提高效率所以对整个空间做了不同区域的划分.
1.堆和栈是内存中的一块内存空间
三.栈空间
1.栈:存储基本数据类型的值(必须是局部变量),引用数据类型的地址
2.栈中数据的特点:存储时间固定
栈中会随着方法(代码块)的执行完成进行回收,回收之后的空间可
以立即被其他人使用,整个回收过程中不需要程序员进行参与.
3.java中基本数据类型使用==比较,比较的是值
4.java中基本数据类型使用=进行赋值,传递的是值
四.堆空间
1.堆:里面存储所有引用数据类型实际的值
所有引用数据类型的实际值都存在堆里面,在栈中存储引用数据类型的值在堆中的地址.
2.堆与栈存储原理不同,在堆中的数据是有Java GC来进行回收
3.绝大多数引用数据类型需要使用是都需要通过new关键字,
每一次执行new时都会在堆中重新申请一块空间,重新申请空间后,
将地址存储在栈空间中, 所以两个值的地址就不一样了。
4.java中引用数据类型使用==比较,比较的是内存地址
5.java中引用数据类型使用=进行赋值,传递的是地址
6.对于基本数据类型和封装类进行比较时. 编译器都按照两侧是基
本数据类型进行看待。(自动拆箱)
五.扩展
关于整型(byte,short,integer,long)的一些小知识
在Integer里面有个缓冲区,缓冲区中存储的是byte数组,范围是-128-127,如果数值在这个范围内的话,可以直接从缓冲区获取到这个数值的地址.
五.字符串常量池
1.创建字符串对象及注意事项
1.使用String创建对象有两种方式
String name2="学";
String name1=new String("加油");
第一种方式:
将字符串放入常量池中, 字符串常量池中的地址存储在栈空间中。
第二种方式:
使用new关键字, 会在堆空间中开辟空间, 将堆中开辟空间的地址存储在栈空间中, 字符串的值会存储在字符串常量池中, 字符串常量池中的地址存储在堆空间中。
注意事项
1.字符串常量池是堆空间里面一块专门存放字符串值的空间。
2.如果字符串的值已经在常量池中则直接返回存在的地址不会再新添加。
3.如果字符串值没有在字符串常量池中,会新开辟一块空间存放字符串值。
2.总结
引用类型进行比较时:
1. == : 比较的是地址
2. equals(): 比较的是实际存储的值
六.数组
1.数组注意事项
1.定义:数组是数据类型相同并且内存空间连续的集合
2.长度是确定的。数组一旦被创建,它的大小就是不可以改变的。
3.在内存中分配连续的空间,每个元素占用的空间大小是相同的
4.同一个数组其元素的类型必须是相同类型,不允许出现混合类型
5.数组类型可以是任何数据类型,包括基本类型和引用类型
6.数组变量属于引用数据类型
2.数组语法
1.声明数组,还没向内存申请空间
类型[]对象名 类型 对象名[]
2.声明并赋值
数据类型[] 对象名 = {值1, 值2, 值3, ...};
数据类型[] 对象名 = new 数据类型[]{值1, 值2, 值3, ...};
数据类型[] 对象名 = new 数据类型[长度];
例如:
int[] arr = {1, 2, 3};
int[] arr1 = new int[]{1, 2, 3};
int[] arr2 = new int[3];
3.数组中元素的默认值
4.数组常见问题
1.索引越界
索引值最大为数组长度-1
5.数组常用属性
length:使用length获取数组的长度,length没有括号.是属性不是方法.
int[]arr={1,2,3,4,5};
int len=arr.length;//数组对象.length
6.遍历数组
1.普通for
for(int i=0;i<arr.length;i++){
System.out.println(arr[i);}
2.增强for
语法:
for(int:迭代变量){}
int[]arr={1,2,3,4,5};
for(int i:arr){
System.out.println(i)
7.普通for和增强for的区别
package Week3.Day06;
//增强for直接遍历到的是这个数的值,不是索引
public class Test05 {
public static void main(String[] args) {
int[]arr={1,4,6,2,4};
for(int i:arr){
System.out.println(i);
}
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
}
}
8.数组内存结构
数组是一块连续的空间,虽然元素的地址是连续的,但是因为有多个元素,那就有多个地址,但是栈空间中只能存放一个地址引用。
所以数组对象中存放的是数组空间中第一个元素的地址。
七.小节实战案例
package Week3.Day06;
public class Test01 {
public static void main(String[] args) {
int[]arr=new int[]{8,2,1,0,3};//存储的是电话号码中的数字值
int[]index=new int[]{2,0,3,2,4,0,1,3,2,3,3};//数字所对应的索引
for(int i=0;i<index.length;i++){
//index作为arr的索引
//System.out.println(arr[index[i]]);//index[i]是index里边的数(作为arr的索引下标),arr[index[i]]就是索引下标下所对的数
}
for(int a:index){//a是遍历到的值
System.out.println(arr[a]);
}
}
}
package Week3.Day06;
import java.util.Arrays;
import java.util.Scanner;
public class Test02 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int[]arr=new int[5];
int sum1 = 0;
for(int i=0;i<5;i++){
System.out.println("请输入第"+(i+1)+"个数字");
int a=sc.nextInt();
arr[i]=a;
sum1 += a;
}
System.out.println("输入的数字为: " + Arrays.toString(arr));
System.out.println("平均值为: " + sum1 / arr.length);
}
}
package Week3.Day06;
import java.util.Scanner;
public class Test04 {
public static void main(String[] args) {
int n = 0;
Scanner sc = new Scanner(System.in);
String[] name = new String[200];//存储商品名称
int[] price = new int[200];
int store = 0;//商品的库存
System.out.println("欢迎使用建议超市管理系统");
o:do {
System.out.println("请选择要完成的事");
System.out.println("1.录入商品");
System.out.println("2.查看商品");
System.out.println("3.退出系统");
n = sc.nextInt();
switch (n) {
case 1:
do {
System.out.println("是否要录入产品");
String ys = sc.next();
if (ys.equals("Y")) {
System.out.println("请输入商品名称");
name[store] = sc.next();
System.out.println("请输入商品价格");
price[store] = sc.nextInt();
store++;
} else {
break;
}
} while (true);
case 2:
System.out.println("名称\t价格");
for (int i = 0; i < store; i++) {
System.out.println(name[i] + "\t" + "price[i]");
}
break;
case 3:
System.exit(0);
break o;
}
} while (n >= 0);
System.out.println("程序结束");
}
}