JVM( java virtual machine),即java虚拟机的缩写。
GC (Garbage Collection) :垃圾收集器
类加载:当程序主动使用某个类时,如果该类还未被加载到内存中,系统会通过加载,连接,初始化三个步骤来对该类进行初始化,JVM将会连续完成这三个步骤,也把这三个步骤统称为类加载或类初始化
堆:首先堆是动态分配的,JVM并不会自动释放这部分内存,只有等待系统的GC来进行回收。
栈:是在类加载中由系统静态分配的,而且分配时按照内存的高低地址进行分配。这部分内存系统会自动进行释放。
String是一个特殊的类型,它存储的机制是引用类型。
堆:需要程序员自己申请,可能用到的关键字有new、malloc、delete、free等等,一般速度比较慢
栈:由编译器(Compiler)自动分配释放,存放函数的参数值,局部变量的值等。
基本类型值指的是那些保存在栈内存中的简单数据段,即这种值完全保存在内存中的一个位置。
而 引用类型值则是指那些保存在 堆内存中的对象,意思是变量中保存的实际上只是一个指针,这个指针指向内存中的另一个位置,该位置保存对象。在将一个值赋给变量时,解析器必须确定这个值是基本类型值,还是引用类型值。基本数据类型的值在内存中分别占有固定大小的空间,因此可以把他们的值保存在栈内存中。对于保存基本数据类型的变量,我们可以说他们是按值访问的,因为我们操作的是它们实际保存的值。
如果赋给变量的是一个引用类型的值,则必须在堆内存中去为这个值分配空间。由于这种值的大小不固定,因此不能把它们保存到栈内存中。但内存地址的大小是固定的,因此可以将内存地址保存在栈内存中。这样,当查询引用类型的变量时,就可以首先从栈中读取内存地址,然后再“顺藤摸瓜”找到保存在堆中的值。对于这种查询方式,我们把它叫做按引用访问,因为我们操作的不是实际的值,而是被那个值所引用的对象。
复制变量值:
(1)如果从一个变量向另一个变量复制基本类型的值,会在栈中创建一个新值,然后把该值复制到为新变量分配的位置上。
var num1 = 5;
var num2 = num1;
这2个“5”是完全独立的,它们可以参与任何操作而不会相互影响。
(2)
当一个变量向另一个变量复制引用类型的值时,同样也会将存储在栈中的值复制一份到为新变量分配的空间中。不同的是,这个值的副本实际上是一个指针,而这个指针指向存储在堆中的一个对象。复制后,两个变量实际上将引用同一个对象。因此改变其中一个变量,就会影响到另一个变量:
var obj1 = new Object();
var obj2 = obj1;
obj1.name = "Nicholas";
alert(obj2.name); // "Nicholas"
包装类:包装类就是把基本类型变成对象类型。
Java共有六个包装类,分别是Boolean、Character、Integer、Long、Float和Double,从字面上我们就能够看出他们分别对应于 boolean、char、int、long、float和double。而String和Date本身就是类。所以也就不存在什么包装类的概念了。
“==”比较的是值(基本数据类型比较的是值,引用类型比较的是在栈中存放的内存地址)【变量(栈)内存中存放的对象的(堆)内存地址】
equal用于比较两个对象的值是否相同【不是比地址】
(特别注意)Object类中的equals方法和“==”是一样的,没有区别,而String类,Integer类等等一些类,是重写了equals方法,才使得equals和“==不同”,所以,当自己创建类时,自动继承了Object的equals方法,要想实现不同的等于比较,必须重载equals方法。
穿插点C语言的知识:
在用"%c"输入时,空格和“转义字符”均作为有效字符。
例:
scanf("%c%c%c",&c1,&c2,&c3);
输入:a□b□c↙
结果:a→c1,□→c2,b→c3 (其余被丢弃)
两个方法,是数据类型转化的方法。 intValue() 如Integer类型,就回有intValue()方法意识是说,把Integer类型转化为Int类型。其他类似,都是一个意思 。valueOf() 如String就有valueOf()方法,意识是说,要把参数中给的值,转化为String类型,Integer的valueOf()就是把参数给的值,转化为Integer类型。其他类似,都是一个意思。把参数给的值转化成所需的数据类型。
包装类都有 parseType(String str) 静态方法,可以把字符串直接转化成基本数据类型的值。
valueOf()是把一个包装类转化成另一个包装类,若要转化成基本的数据类型的值,还需要调用typeValue()方法
周长:perimeter
面积:area