这是蓉姐总结的
1、初始化和清理
a. 在类中,构造器中调用构造器可以用this,继承是super,每个构造器只能调用一个
b. static方法内部不能调用非static方法
c. 重载方法需要完全独一无二的参数列表
d. 垃圾回收只与内存有关,java不允许创建局部对象,必须用new创建对象。
e. 内存泄露,实际上是无用的内存没有被及时回收,稳妥的做法是在对象被使用完成后,将对象赋值为null,对于强引用(普通的申明方式),只有显示赋值为null,GC才会视为回收对象
f. 4种整形:
byte 1字节 -128——127
short 2字节 -32768——32767
int 4字节 -2,147,483,648 ——2,147,483,647(超过20亿)
long 8字节 -9,223,372,036,854,775,808——9,223,372,036854,775,807
注释:java中所有的数据类所占据的字节数量与平台无关,java也没有任何无符号类型
2种浮点类型:
float 32位 IEEE 754单精度(有效位数 6 – 7位)
double 64位IEEE 754双精度(有效位数15位)
1种真值类型:
boolean true or false
1种Unicode编码的字符单元
char 整个Unicode字符集
对应的Class如:Integer Long Boolean Byte Character Double Float Short
g.java.lang :提供利用 Java 编程语言进行程序设计的基础类。
java.unit:包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)Arrays针对数组。
死锁就是多个线程对资源的依赖形成了环,解除死锁最根本的是打破这个环。
解决死锁的方法:超时,对每个线程都设置一个超时访问时间,一旦超时就自动释放资源,还可以设定另一个线程,对死锁线程进行检查,并释放掉产生死锁的线程。
2、访问控制权限
a.访问控制权限有四种:public, private, protected, 包权限。
b.如果不声明任何所属包,则在默认包下。
c.一个类只能声明为包权限和public型,默认的为包权限。
d.如果一个类的所有构造函数都为private型,则不能被直接实例化,也不能被继承,即:不能 Car car = new Car();典型的是单例模式的实例化。
e.包权限只允许包内的访问。
f.Protected允许包内访问,和子类访问。
3、复用类
a.每一个非基本类型的对象都有一个toString()方法,而且编译器需要一个String时,你确只有一个对象时,该方法便会被调用。如果在类中没有重写toString方法,则打印出来的是:类名@xxxx(该对象的散列码的无符号十六进制),如:
Car car = new Car();
System.out.println(“Car:”+car); //这时就会调用toString()方法。
b.用super表示调用超类,当前类是从超类继承来的。
c.如果不创建构造器,则编译器会自动为你创建一个构造器,如果超类没有构造器,则编译器会创建一个默认构造器来调用基类构造器。
d.初始化顺序为:从内到外,先调用基类构造器,在调用子类构造器,基类在导出类构造器能访问他之前就已经初始化完成。
e.如果在基类中的构造器是带参数的,则在导出类中一定要用super(参数)来调用基类的构造器,否则将出错。
f.清理,你并不知道垃圾回收会何时被调用,或者它是否将被调用,如果需要做特定的清理工作一定要编写一个特殊的方法来做清理,但是不要使用finalize()方法,必须将清理动作放置于finally子句中,以预防异常的发生。
g.@override注解,它不是关键字,可以当关键字使用,覆写某方法时,可以加此注释。重载和重写要分清楚。重写的方法名,返回类型,参数都必须一样。
h. 向上转型,很重要的多态。
i. final关键字,一个即是static又是final的域只占据一段不能改变的存储空间。final是一个永远不改变的编译时常量,一个在运行时被初始化的值,而你不希望改变它。
j.final使得基本类型数值恒定不变,使得对象的引用恒定不变,即引用一旦被初始化,则指向一个对象就无法把他改变为再指向另一个对象,但是对象自身却是可以被修改的。
k. 既是在声明的时候没有初始化,但是在使用前(构造函数中)也一定要初始化值。如:public class Car{
public final int a;
Car(int wheel){
a = 1;
}
Car(){
a = 3;
}
}
l.static强调一份,即:static在装载时就已经被初始化,而不是每次创建新对象都初始化一次,final说明是一个常量。
m.如果将参数设置为final,如果为基本类型,则只能读参数,不能改变参数。如果为对象,则无法在方法中改变参数引用所指向的对象。
Class Gigo{
Public void Gizo(){}
}
Public class FinalArguments{
void with(final Gizo g){
!// g = new Gizo(); //将会出错,不可以改变其引用指向的对象
}
void without (Gizo g){
g = new Gizo();
}
}
n. final类不允许继承,fianl类中方法都隐式的制定为final,因此无法覆盖它们。但是在另一个类中调用,值是可变的。
publicfinalclass SmallBrain {
inti=7;
intj = 1;
void f(){
System.out.println("final f()");
}
}
publicclass Jurassic {
publicstaticvoid main(String[] args){
SmallBrain b = new SmallBrain();
b.f();
b.i++;
b.j = 40;
System.out.println(b.i);
System.out.println(b.j);
}
}
结果:final f()
8
40
o.只要类中有一个可以被直接调用的构造方法,就可以被继承,如果全为私有构造方法则不可以被继承。
4、多态
a. 将一个方法调用同一个方法主体关联起来被称为绑定。动态绑定/运行时绑定/后期绑定,就是在运行时根据对象的类型进行绑定,向上转型实际上就是动态绑定。一些类都是从一个类导出而来。
b. JAVA中除了static方法和final方法之外,其他都是后期绑定,如果某些方法声明为final,则可以防止覆盖该方法,并可以关闭动态绑定
c. 基类的private方法是不允许被覆盖的,如果子类中含有和基类相同的方法,而基类中方法为private方法,则子类中同名的方法为一个新的方法,不是覆盖了父类的方法。
d. 如果需要为类创建清理工作,则需要自己定义清理类,如为:dispose()方法,由于继承,则有特定清理动作时,在导出类中如果覆盖了dispose()方法,则必须要调用基类的dispose()方法,否则基类的方法将不会被执行,基类的清理就不会发生,相当于一个普通方法在子类中被重写。用super调用基类。
e. 销毁的顺序和初始化的顺序是相反的,即:先销毁导出类,在销毁基类。对于字段的销毁,则与声明的顺序相反。
f. 静态方法是与类相关联的,不是与单个对象相关联的,静态方法不具备多态性。
5、接口
a. 如果一个类包含了一个或者多个抽象方法,则该类必须被限定为抽象类。
b. 如果继承一个抽象类,则必须为基类中的所有抽象方法提供方法定义。
c.接口默认的为包访问权限,则只能包内使用,只有包权限和pulic,接口中声明的方法都必须是public。
d. 在接口中可以很容易的添加新的方法声明,还可以通过继承在新接口中组合数个接口,接口继承使用extends关键字,extends只能用于单一类,但是可以应用于多个接口。
e. 在组合的不同接口中使用相同的方法名通常会造成代码的可读性混乱,应尽量避免。
f. 在接口中声明变量一定要有初始化值。
g. 接口中也可以包含域,但是这些域隐式的是static和final的。在接口中定义的域不能是空final,但是可以被非常量表达式初始化,如:
public interface Ranvals{
Random RAND = new Random(47);
int RANDOM_INT = RAND.nextInt(10);
}
6、垃圾回收
7、持有对象
a. 如果容器没有使用泛型,一般编译器会报警告信息,如果加注解@SuppressWarnings(“unchecked”)注解及其参数表示只有有关“不受检查的异常”的警告信息被抑制。
b. 如果声明一个Collection的容器没有使用泛型,则在其中可以加入Apple或者Orange类型的对象,都不会出现错误,因为对于容器加入的都是Object类型的对象,当用get()方法取出对象时,也是Object类型的,如果需要Apple类型则需要用(Apple)来进行转型。
c. 如果一个容易使用了泛型,如:List<Apple> list = new ArrayList<Apple>();则在list中只能加入Apple类型的。
d. java容器类类库主要是从Collection和Map接口继承,List, Set, Queue接口都是继承自Collection和Iterater接口,表示一个独立的元素序列。List必须按插入顺序保存元素,Set不能有重复元素,Queue按照队列规则来确定对象产生的顺序(通常与插入顺序相同),只允许一端插入元素,另一端删除元素。
e. Map 一组成对的“键值对”对象,允许你使用键来查找值,映射表允许你用一个对象来查找某个对象,他把某些对象和一些对象联系在一起,被称为关联数组或字典。
f. java.util包中的Arrays和Collections类中都包含了很多使用方法。Arrays包含用来操作数组(比如排序和搜索)的各种方法。还包含一个允许将数组作为列表来查看的静态工厂。Collections完全由在 collection 上进行操作或返回 collection 的静态方法组成。它包含在 collection 上操作的多态算法,即“包装器”,包装器返回由指定 collection 支持的新 collection。
g. List在Collection接口的基础上添加的大量的方法,使得可以在List中插入和移除元素,按照插入顺序保存元素。有两种类型:ArrayList和LinkedList。ArrayList长于随机访问访问元素,插入和删除元素慢。LinkedList随机访问较慢,但是插入和删除代价较低。
Set有三种类型:HashSet, TreeSet, LinkedHashSet。HashSet使用相当复杂的方式来存储元素,此方法为最快的获取元素的方式,TreeSet按照比较结果的升序保存对象,LinkedHashSet按照被添加的顺序保存对象。
Map有三种类型:HashMap, TreeMap, LinkedHashMap。HashMap提供了最快的查找技术,也没有按照任何明显的顺序来保存元素, TreeMap按照比较结果的升序保存键, LinkedHashMap按照插入顺序来保存键,同时保存了HashMap的查询速度。
h. 迭代器Iterator,迭代器是一个对象,它的工作是遍历并选择序列中的对象,它用来查找序列中是否还有元素,及获得下一个元素,并可执行删除等。ListIterator是一个更强大的Iterator, 它只用于List的访问,Iterator只能向前移动,但是ListIterator可以双向移动。
i. LinkedList添加了element(), offer(), peek(), poll(), remove()等方法,以便可以成为一个Queue的实现。并且具有实现栈的所有功能的方法。
j. stack栈是一种后进先出的容器,
k.Set,它具有不可重复性,不能将几个相同的对象加入到Set,因此可以用来询问某属性是否在某个Set中,它具有和Collection完全一样的接口,没有任何额外功能。HashSet()使用散列函数,TreeSet将元素存储在红—黑树数据结构中,LinkedHashSet因为查询速度的原因也使用了散列,但是看起来使用了链表来维护元素的插入顺序。
l. Map与数组还有其他的Collection一样,可以很容易的扩展到多维,能够很容易的将容器组合起来从而生成强大的数据结构,如:假设你需要知道拥有多个宠物的人,只需要建立Map<Person,List<Pet>>,Map可以返回它的键的Set,它的值的Collection,或者它的键值对的Set,分别对应方法:keyset(), values(),entrySet();
m. Queue队列是一种典型的先进先出的容器,即从容器的一端放入事物,另一端取出,并且事物放入的顺序和取出的顺序是相同的,队列常被当做一种可靠的将对象从程序的某个区域传输到另一个区域的途径。LinkedList实现了Queue接口,提供了支持队列的行为,可以当做Queue的一种实现,并向上转型为Queue。PriorityQueue
n. 容器中不能加入基本类型,但是会自动和包装类进行转换。
8、数组
a.数组现存的优点就是效率,数组一旦声明,大小不可变。
b.java.util类库中的Arrays类,它有一套用于数组的static实用方法
c.Arrays类中的equals()方法用来比较整个数组,条件:元素个数相等,对应位置的元素也相等。
d.程序设计的基本目标是:将保持不变的事物与会发生变化的事物相分离。在数组元素比较的操作中,不变的是通用的排序算法,变化的是各种对象相互比较的方式。
e.Java有两种方式来提供比较功能,第一种是实现java.lang.Comparable接口,使你的类具有天生的比较能力,实现compareTo(T o)方法。此方法接受另一个Object参数,如果当前对象小于参数则返回负值,如果相等则返回零,如果当前对象大于参数则返回1。
9、非对称加密技术
对称加密算法有:DES,AES
非对称加密算法有:RSA,有公钥和私钥,公钥加密只有私钥能解密,私钥加密只有公钥能解密
数字签名:DSA,只是为了验证身份和信息的完整性
Hash 算法,不可还原的密码存储,主要是可以校验信息的完整性,不能通过hash值计算出原有的信息,是不可逆算法,有MD5,HAVAL,SHA等一些。
PGP,对E_mail加密,还能附加数字签名
PKI(Public Key Infrastructure )即"公钥基础设施",是一种遵循既定标准的密钥管理平台,它能够为所有网络应用提供加密和数字签名等密码服务及所必需的密钥和证书管理体系,银行,证劵,政府等
数字证书:由CA发型,可用来识别对方身份,包含:公开密钥拥有者信息,及公开密钥文件,证书授权中心数字签名。
私钥加密,公钥解密主要是为了验证信息的完整性及信息所有人信息
公钥加密,私钥解密主要是为了加密信息
设备(如Web服务器)也可以申请数字证书(设备证书),利用数字签名的验证功能,可以验证服务器的身份,防止钓鱼。
10、JDK的一些
JDK提供了一个平台,JavaEE在这个平台上定义了一些用于服务器开发的规范,javaee是一个规范集。JDK这个平台以jre为核心,还提供了一些工具和类库。JRE是JAVA运行时环境,JVM是JRE这个核心的核心
JVM对应的是JAVA虚拟机规范,JRE对应JAVA语言规范,JDK对应的是各种JAVA SDK规范,JAVAEE对应各种JAVAEE规范。
JAVA SDK 就是JDK,software developer kit 包含了JRE的一系列开发工具,如:javac, javap,jps, keytool之类的工具。
11、classloader
10、并发