在开始学习数据结构以前,先对java的变量的特性作一个了解java
名称 | 特征 | 做用 | 配置参数 | 异常 |
---|---|---|---|---|
程序计数器 | 占用内存小,线程私有,生命周期与线程相同 | 大体为字节码行号指示器 | 无 | 无 |
虚拟机栈 | 线程私有,生命周期与线程相同,使用连续的内存空间 | Java 方法执行的内存模型,存储局部变量表、操做栈、动态连接、方法出口等信息 | -Xss | StackOverflowErrorOutOfMemoryError |
java堆 | 线程共享,生命周期与虚拟机相同,能够不使用连续的内存地址 | 保存对象实例,全部对象实例(包括数组)都要在堆上分配 | -Xms-Xsx-Xmn | OutOfMemoryError |
方法区 | 线程共享,生命周期与虚拟机相同,能够不使用连续的内存地址 | 存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据 | -XX:PermSize:16M-XX:MaxPermSize64M | OutOfMemoryError |
运行时常量池 | 方法区的一部分,具备动态性 | 存放字面量及符号引用 |
这是java最多见内存管理模型,在这篇文章中重点讨论的是虚拟机栈和java堆,具体的特征和做用在表中可见。数组
java的基本数据类型共有8种,即int,short,long,byte,float,double,boolean,char。经过常见的变量声明方式,好比a=2;来定义。数据结构
当java编译器运行时,遇到a=2;这一行,它会首先在栈中建立一个变量为a的引用,而后查找有没有字面值为2的地址,有的话则让a指向2,没有则开辟一个内存地址存储2,而后让a指向这个地址。函数
以上全部操做涉及到底内存区域都是在栈中完成的学习
当java编译器运行时,遇到声明对象的时候,好比 Object a=new Object();,它会在栈区为a分配内存空间。此时的a是一个引用变量。而后会在堆区分配内存,里面保存对象的相关数据。最后让a指向堆区的地址spa
public class test {
public static void main(String[] args) {
int a = 1;
test(a);
System.out.println("a的值是:"+a);
Integer c=2;
test(c);
System.out.println("c的值是:"+c);
}
public static void test(int b) {
b = 3;
}
}
复制代码
这里使用基本数据类型和包装类,能够看到值并无被更改线程
public class Test {
public static void main(String[] args) {
Test1 test1 = new Test1();
test1.number = 0;
test(test1);
System.out.println("test1的number:" + test1.number);
}
public static void test(Test1 test1) {
test1.number = 100;
}
}
class Test1 {
int number;
}
复制代码
这里使用的是对象,能够看到属性被修改了。code
之后的数据结构的学习就基于以上的特色。由于java是面向对象的语言,因此后面不管是哪一种数据结构,都是经过对象和对象嵌套实现的。对象