JAVA基础篇:JAVA语言和内存
一、内存分配
1.栈内存: 存储的局部变量,局部变量指的是定义在方法中的变量在变量使用完毕编译器会自动释放内存,操作方式类似于数据结果的栈,先进后出.
2.堆内存: 存储的是new出来的对象,也可以叫实体,由程序员释放内存,如果程序员不释放,程序结束时可能由垃圾回收器回收.
3.静态区: 全局变量和静态变量的存储是放在一起的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另外一块区域(BSS).程序结束后由系统释放.
4.常量池: 字符串存储的区域.程序结束后由系统释放
5.程序代码区: 存放函数体的二进制代码
1、堆内存溢出的情况
堆内存溢出
heap space表示堆空间,堆中主要存储的是对象。如果不断的new对象则会导致堆中的空间溢出
栈内存溢出
1.递归必须要有出口,否则容易造成栈内存溢出。
2.递归调用次数不能过多,否则容易造成栈内存溢出。
2、堆
new创建的对象
3、栈
基本类型的变量和对象的引用变量
4、方法区
jdk1.7之前叫做永久代,1.8之后改名为元数据空间
存储静态的方法或变量,类加载器等全局的数据信息
5、本地方法栈
保存native方法
6、计数器
指向程序当前的位置
二、JAVA语言
1、跨平台原理
Java语言并不是直接运行在系统中的,而是运行在JVM虚拟机中只要在不同的平台安装平台对应的Java虚拟机,那么就可以运行相同的Java程序.
JVM不跨平台,需要根据对应的平台安装对应的JVM虚拟机.
2、JAVA和其他语言区别
1.⼀处编译,多处运⾏
2.健全的安全体系
3.具有跨平台性
4.⾃带内存管理机制
3、JRE、JDK、JVM
三者关系
JDK
开发工具包(编译代码的工具/运行代码的工具/...)
JRE (运行时环境)
Java核心类库
JVM (虚拟机)
4、classpath
配置classpath是为了在系统的任意⽬录下都可以运⾏javac和 java命令
5、值传递和引⽤传递
Java中只有值传递,引用传递传递的是地址值。
如果是基本数据类型,传递的是值,
如果是引用数据类型,传递的地址值
6、==和equals
==
基本类型:比较的是值是否相同;
引用类型:比较的是引用是否相同;
equals
本质就是==,只不过 String 和 Integer 等重写了 equals 方法,把它变成了值比较
7、Hashcode和equals
equal绝对相等,hashCode不绝对相等
equal效率低,hashCode效率高
对于需要大量并且快速的对比的话,首先用hashCode()去对比,如果hashCode()不一样,则表示这两个对象肯定不相等,如果hashCode()相同,此时再对比他们的equal(),如果equal()也相同,则表示这两个对象是真的相同了,这样既能大大提高了效率也保证了对比的绝对正确性!
8、&和&& | 和||
&逻辑与 &&逻辑与 也叫做短路与 因为只要当前项为假,它就不往后判断了,直接认为表达式为假
|逻辑或 ||逻辑或 也叫做短路或 因为只要当前项为真,它也不往后判断了,直接认为表达式为真
9、深克隆和浅克隆
浅克隆:创建⼀个新对象,新对象的属性和原来对象完全相同,对于⾮基本类型属性,仍指向原有属
性所指向的对象的内存地址。
深克隆:创建⼀个新对象,属性中引⽤的其他对象也会被克隆,不再指向原有对象地址
这是本人总结的思维导图。感兴趣的小伙伴可以一起交流!
留言与评论(共有 0 条评论) “” |