Java(三)数据结构与算法
数据结构
栈:存储局部变量
堆:存储new出来的数组或对象
方法区:面向对象部分讲解
本地方法区:和系统相关
寄存器:给CPU使用
栈:先进后出
队列:先进先出
数组:
数组:存储同一种数据类型多个元素的集合(可以看成是一个容器)。
定义格式:数据类型[] 数组名 = new 数据类型[数组长度];
- 数组的初始化:为数组开辟连续的内存空间,并为每个数组元素赋予值。
-
动态初始化:只指定长度,由系统给出初始化值。
定义格式: 数据类型[] 数组名 = new 数据类型[数组长度]; -
静态初始化:给出初始化值,由系统决定长度。
定义格式:数据类型[] 数组名 = new 数据类型[]{元素1,元素2,…};//先声明后赋值
数据类型[] 数组名 = {元素1,元素2,…};//声明和赋值都在同一行
注意:
- 不允许动静结合。
-
ArrayIndexOutOfBoundsException:数组索引越界异常
原因:你访问了不存在的索引。 -
NullPointerException:空指针异常
原因:数组已经不在指向堆内存了。而你还用数组名去访问元素。
数组遍历:就是依次输出数组中的每一个元素。
数组的属性: arr.length数组的长度。
数组的最大索引: arr.length - 1。
二维数组
格式:
- 数据类型 数组名[][] = new 数据类型[m][n];
- 数据类型[] 数组名[] = new 数据类型[m][n];
- 数据类型[] [] 数组名 = new 数据类型[m][n]; ——推荐用这种写法
Java参数中的参数传递问题:
基本数据类型的值传递,不改变原值,因为调用后就会弹栈,局部变量随之消失。
引用数据类型的值传递,改变原值,因为即使方法弹栈,但是堆内存数组对象还在,可以通过地址继续访问。
内存管理
Stack 栈(栈内存)
在线程创建时创建,它的生命期是跟随线程的生命期,线程结束栈内存也就释放,对于栈来说不存在垃圾回收问题,只要线程一结束,该栈就Over。存放基本类型的变量,对象的引用变量。
当在一段代码中定义一个变量时,Java就在栈中为则会个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉该变量分配的内存空间。该内存空间可以立刻被另作他用。
Heap 堆(堆内存)
一个JVM实例只存在一个堆类存,堆内存的大小是可以调节的。
存放由new创建的对象(包括对象变量以及对象方法)和数组。由JVM的自动垃圾回收期GC来管理。
面试题
-
Java中到底是传值还是传址?
1,既是传值,也是传地址,基本数据类型传递的值,引用数据类型传递的地址。
2,java中只有传值,因为地址值也是值。 -
堆和栈有什么区别?
答:堆是存放对象的,但是对象内的临时变量是存在栈内存中。
栈是跟随线程的,有线程就有栈,堆是跟随JVM的,有JVM就有堆内存。 -
类变量和实例变量有什么区别?
答:静态变量是类变量,非静态变量是实例变量。直白的说,有static修饰的变量是静态变量,没有static修饰的变量是实例变量。静态变量存在方法区中,实例变量存在堆内存中。 -
为什么会产生OOM产生?
答:一句话:Heap内存中没有足够的可用内存了。这句话要好好理解,不是说Heap没有内存了,是说新申请内存的对象大于Heap空闲内存,比如现在Heap还空闲1M,但是新申请的内存需要1.1M,于是就会报OOM了,可能以后的对象申请的内存都只要0.9M,于是就只出现一次OOM,GC也正常了,看起来像偶发事件,就是这么回事。
但如果此时GC没有回收就会产生挂起情况,系统不响应了。 -
我产生的对象不多呀,为什么还会产生OutOfMemory?
答:继承层次忒多了,Heap中 产生的对象是先产生 父类,然后才产生子类。 -
OOM错误分几种?
答:分两种,分别是“OutOfMemoryError:java heap size”和”OutOfMemoryError: PermGen space”,两种都是内存溢出。heap size是说申请不到新的内存了,这个很常见,检查应用或调整堆内存大小。
“PermGen space”是因为永久存储区满了,这个也很常见,一般在热发布的环境中出现,是因为每次发布应用系统都不重启,久而久之永久存储区中的死对象太多导致新对象无法申请内存,一般重新启动一下即可。 -
为什么会产生StackOverflowError?
答:因为一个线程把Stack内存全部耗尽了,一般是递归函数造成的。 -
一个机器上可以看多个JVM吗?JVM之间可以互访吗?
答:可以多个JVM,只要机器承受得了。JVM之间是不可以互访,你不能在A-JVM中访问B-JVM的Heap内存,这是不可能的。在以前老版本的JVM中,会出现A-JVM *****后影响到B-JVM,现在版本非常少见。
树
树形结构时一类重要的非线性结构。是结点之间有分支,并具有层次关系的结构,类似于自然界的数。
在编译程序中,用来表示源程序的语法结构;
在数据库系统中,用来组织信息;
在分析算法的行为时,用来描述其执行过程。