new运算符,new创建对象实例(对象实例在堆内存中),对象引用指向对象实例(对象引用在栈内存中)。一个对象引用可以指向0个或者1个对象(一根绳子可以不系气球,也可以系一个气球)。一个对象可以有n个引用指向它(可以用n条绳子系住一个气球)。
(1)在外部调用静态方法时,可以使用类名.方法名的方式,也可以使用对象名.方法名的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。
(2)静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例变量和实例方法;实例方法无此限制。
对象的相等,比的是内存中存放的内容是否相等。而引用相等,比较的是他们指向的内存地址是否相等。
hashCode()的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode()定义在JDK的Object.java中,这就意味着任何类都包含有hashCode()函数。
散列表存储的是键值对(key-value),它的特点是:能根据“键”快速地检索出对应的值,这其中就利用到了散列码。
当你把对象放入hashSet中时,HashSet会先计算对象的hashcode值来判断对象加入的位置,同时也会与其他已经加入的对象hashcode比较,如果没有相符的hashcode,HashSet会假设对象没有重复出现。如果有相同hashcode值的对象,这时候会使用equals()方法来检查hashcode相等的对象是否真的相同,如果相同,则不会重复加入。如果不同,就会散列到其他位置。
fianl关键字主要用在三个地方:变量、方法、类
(1)对于一个fianl变量,如果是基本数据类型的变量,则其数值一点初始化之后不能修改;如果是引用类型的变量,则对齐初始化后不能再指向另一个对象。
(2)当使用final修饰一个类时,表明这个类不能被继承。final类中的所有成员方法都会隐式地指定为final方法。
(3)使用final方法的原因是把方法锁定,以防任何继承类修改它。
在java中,所有的异常都有一个共同的祖先java.lang包中的Throwable类:这有两个重要的子类:Exception(异常)和Error(错误),两者都是Java异常处理的重要子类。
Error:是程序无法处理的错误。大多数错误与代码编写者执行的操作无关,而表示jvm出现的问题。例如:java虚拟机运行错误,当jvm不再拥有执行操作所需要的资源时,将出现OutOfMemoryError。这些异常发生时,java虚拟机一般会选择线程终止。
Exception(异常):是程序本身可以处理的异常。主要包括:
RuntimeException:由java虚拟机抛出。
NullPointerException:要访问的变量没有引用任何对象时,抛出该异常。
ArithmeticException:算数运算异常,一个整数除以0时,抛出该异常。
ArrayIndexOutOfBoundsException:下标越界异常。
注意:异常本身可以被程序处理,错误不能被程序处理。
public String getMessage():返回异常发生时的详细信息
public String toString():返回异常发生时的简要描述
public String getLocalizedMessage():返回异常对象的本地化信息。使用Throwable的子类覆盖这个方法,可以生成本地化信息。如果子类没有覆盖方法,则该方法返回的信息与getMessage()返回的结果相同。
public void printStackTrace():在控制台上打印Throwable对象封装的异常信息。
try块:用于捕获异常。其后可以接零个或者多个catch块,如果没有catch块,则必须接一个finally块。
catch块:用于处理try捕获到的异常。
finally块:无论是否捕获到异常或者处理到异常,finally块的语句都会执行。
当在try块或者catch块中遇到return语句时,finally语句将在方法返回之前被执行。在四种特殊情况下,finally不会被执行:
(1)在finally语句中发生了异常。
(2)在前面的代码中使用了System.exit()退出程序。
(3)程序所在的线程死亡。
(4)关闭cpu。
使用transient 关键字的作用是:阻止实例中哪些用此关键字修饰的变量序列化;当对象被反序列化时,被transient修饰的变量值不会被持久化和恢复。transient只能修饰变量,不能修饰类和方法。
Segment段:
整个ConcurrentHashMap是由一个个的Segment组成,Segment代表部分或者一段的意思,很多地方会将其描述非分段锁。
线程安全:
简单理解就是,ConcurrentHashMap是一个Segment数组,Segment通过继承ReenTranLock拉进行加锁,所以每次需要加锁的操作锁住的是一个Segment,这样就保证了每个Segmnet是线程安全的,也就实现了全局线程安全。
并行度concurrencyLevel:并行级别、并发数、Segment数。默认是16,也就是说ConcurrentHashMap有16个分段锁,所以理论上最多支持16个线程并发写,只要他们的操作分布在不同的Segment上,这个值是可以再初始化的时候设置为其他值,但是一旦初始化后,不能进行扩容。
HashTable是遗留类,很多映射的常用功能与HashMap相似,不同的是它继承自Dictionayt类,并且是线程安全的,任何时间只有一个线程能写HashTable,并发性不如ConcurrentHashTable,因此ConcurrentHashTable中引入了分段锁。
动态语言,是指在程序运行时可以改变其结构;新的函数可以引进,已有的函数可以被删除等结构上的变化。比较常见的JavScript、Python属于动态语言,而c。c++则不属于动态语言。从反射角度,java属于半动态语言。
指的是在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法,这种动态获取程序信息以及动态调用对象的功能称为java的反射机制。
概念:
Annotation(注解)是Java提供的一种对元程序中元素关联信息和元数据(metadata)的途径和方法。Annotation(注解)是一个接口,程序可以通过反射来获取指定程序中元素的Annotation对象,然后通过Annotation对象来获取注解中的元数据信息。
元注解的作用是注解其他注解。
@Target修饰对象范围:
@Target说明了注解所修饰的对象范围:Annotation可被用于packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量。在Annotation类型的声明中使用target可以更加清晰明确地修饰目标范围。
@Retention定义被保留的时间长短
表示需要在什么级别保存注解信息,用于描述注解的生命周期。
@Documented 描述-javadoc
@ Documented 用于描述其它类型的 annotation 应该被作为被标注的程序成员的公共 API,因此可以
被例如 javadoc 此类的工具文档化。
@Inherited 阐述了某个被标注的类型是被继承的
表示某个被标注的类型是可以被继承地。如果一个使用的@Inherited修饰的annotation类型被用于一个class,那么这个注解奖杯用于该class的子类。
如果没有涌过来读取注解的方法和工作,那么注解也就不必比注释更有用处了。使用注解的过程中,很重要的一部分就是创建使用注解处理器。