1、面向对象
java语言是面向对象语言,他和面向过程C不同点是,有封装、继承、多态,万物皆是对象,但是执行效率面向过程稍微快些。
2、垃圾回收
JVM垃圾自动回收,即GC操作(后面会细讲)
3、跨平台性
一次编译,到处运行,其实JVM会针对不同不同有不同的实现,我们编写的代码会通过JVM转为.class字节码文件,字节码通过JVM可以在不同平台上运行,转化为能被不同平台识别的机器码。
1、JDK是提供给java开发人员使用的开发工具包,包含了JRE
2、JRE是运行环境,包含了JVM
byte、short、int、long、float、double、char、boolean
1、<<(左移) 向左移动n位,相当于乘以2的n次幂 2、>>(右移) 向左移动n位,相当于除以2的n次幂 3、>>(无符号右移) 被移位二进制最高位无论是0或者是1,空缺位都用0补
1、访问修饰符
抽象类:public,protected和default等修饰
接口只能是:public
2、extends和implements
3、抽象类可以有构造器,接口不行
4、抽象类单根继承,接口多个实现
5、接口是约束定义规范,子类可以不实现父类所有方法,但是要实现接口里所有的方法
静态变量存储在方法区,属于类所有.实例变量存储在堆当中,其引用存在当前线程栈.需要注意的是从JDK1.8开始用于实现方法区的PermSpace被MetaSpace取代了.
1、浅拷贝:
被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。即对象的浅拷贝会对“主”对象进行拷贝,但不会复制主对象里面的对象。”里面的对象“会在原来的对象和它的副本之间共享。简而言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象。
构造方法和clone()方法都介意实现浅拷贝
2、深拷贝:
深拷贝是一个整个独立的对象拷贝,深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存。当对象和它所引用的对象一起拷贝时即发生深拷贝。深拷贝相比于浅拷贝速度较慢并且花销较大。简而言之,深拷贝把要复制的对象所引用的对象都复制了一遍。
重写clone方法、通过对象序列化实现深拷贝
1、基本数据类型:==是值比较
2、引用数据类型,==和equals都是比较内存地址,只不过有些类重写了Object类的equals方法,比如string类比较的就是值是否相等,重写equals需要重写hashcode方法
被final修饰的类不可以被继承
被final修饰的方法不可以被重写
被final修饰的变量不可以被改变.如果修饰引用,那么表示引用不可变,引用指向的内容可变.
被final修饰的方法,JVM会尝试将其内联,以提高运行效率
被final修饰的常量,在编译阶段会存入常量池中.
除此之外,编译器对final域要遵守的两个重排序规则更好:
在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序
初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序.
常见的final修饰类:
1、java.lang包中
包装类:Boolean,Character,Short,Integer,Long,Float,Double,Byte,Void(八大类型的包装类型加一个void)
字符串类:String,StringBuilder,StringBuffer
系统类:System、Math,StrictMath
2、java.util包中
UUID、Scanner
3、java.lang.reflect包中
Constructor、Field、Method
Stirng中的intern()是个Native方法,它会首先从常量池中查找是否存在该常量值的字符串,若不存在则先在常量池中创建,否则直接返回常量池已经存在的字符串的引用
String和StringBuffer主要区别是性能:String是不可变对象,每次对String类型进行操作都等同于产生了一个新的String对象,然后指向新的String对象.所以尽量不要对String进行大量的拼接操作,否则会产生很多临时对象,导致GC开始工作,影响系统性能.
StringBuffer是对象本身操作,而不是产生新的对象,因此在有大量拼接的情况下,我们建议使用StringBuffer(线程安全).