JavaBase-3

前序:越到最后越感觉到数据结构和算法的重要性,在以后的职业生涯中,除了思想拼得更是基础,基础稳固的前提下,你掌握信息的能力,阅读源码的能力能得到质的提升。前两篇把Java的一些基础关键字和所有对象的父类Object给研究完了,接下来按照我的知识体系是要深入研究Java的一些基础类和特性,例如String、异常、反射等等;研究完这些就开始深入集合框架。


2.特殊方法说明

2.2 String

final修饰 不可变 对此特性的理解就是经常和StringBuilder的对比 StringBulider又和StringBuffer对比,这是操作字符串相关的几个类。

JVM层次的就是对常量池的迁移,jdk6以前常量池是放在永久代,jdk7已做了移除,放在了堆空间。

intern方法的内部细节,要先说明一下String类型的用法:

直接使用双引号声明出来的String对象会直接存储在常量池中。
    如果不是用双引号声明的String对象,可以使用String提供的intern方法。intern 方法会从字符串常量池中查询当前字符串是否存在,若不存在就会将当前字符串放入常量池中

下面看看intern的结构

Java利用nativei调用C++中StringTable的intern函数来实现,原理和HashMap相似,只是容量是被指定的无法自动扩容

Jdk6 -XX:StringTableSize 容量默认是1009 在7、8以后默认是60013,结构就是一个HashTable,所以说在字符串操作很多应应用中要适当调大此容量,否则会造成过多的碰撞,存储和获取性能都会下降。

了解常量池存储情况-XX:+PrintStringTableStatistics

intern使用的时机,需要注意 参考 http://tech.meituan.com/in_depth_understanding_string_intern.html

将String常量池 从 Perm 区移动到了Java Heap区 String#intern 方法时,如果存在堆中的对象,会直接保存对象的引用,而不会重新创建对象。

2.3  反射

反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;

这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

反射机制主要提供了以下功能: 

在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。

通过反射机制操作某个类的属性 可以直接对 private 的属性赋值

Field field = clazz.getDeclaredField(“proprety”);
field.setAccessible(true);
field.set(obj, “Java反射机制”); 

参考 http://baike.xsoftlab.net/view/209.html#1

    2.4 异常

Throwable 两个子类  Error Exception

Error 程序无法处理的错误,表示运行应用程序中较严重问题。JVM出现问题OOM SOF
Exception 程序本身可以处理的异常 
非检异常 NoCheckException RuntimeException NullPointerException IndexOutOfBoundsException
检查异常 CheckException IOException SQLException
一旦某个catch捕获到匹配的异常类型,将进入异常处理代码。一经处理结束,就意味着整个try-catch语句结束。其他的catch子句不再有匹配和捕获异常类型的机会。
当在try块或catch块中遇到return语句时,finally语句块将在方法返回之前被执行。在以下4种特殊情况下,finally块不会被执行:
1)在finally语句块中发生了异常。
2)在前面的代码中用了System.exit()退出程序。
3)程序所在的线程死亡。
4)关闭CPU

参考 http://blog.csdn.net/hguisu/article/details/6155636

    2.5 泛型

泛型的定义:泛型是JDK 1.5的一项新特性,它的本质是参数化类型(Parameterized Type)的应用,也就是说所操作的数据类型被指定为一个参数,在用到的时候在指定具体的类型。

这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口和泛型 方法。

Java语言中的泛型则不一样,它只在程序源码中存在,在编译后的字节码文件中,就已经被替换为原来的原始类型(Raw Type,也称为裸类型)了,并且在相应的地方插入了强制转型代码,

因此对于运行期的Java语言来说,ArrayList<int>与ArrayList<String>就是同一个类。所以说泛型技术实际上是Java语言的一颗语法糖,

Java语言中的泛型实现方法称为类型擦除,基于这种方法实现的泛型被称为伪泛型。

使用泛型机制编写的程序代码要比那些杂乱的使用Object变量,然后再进行强制类型转换的代码具有更好的安全性和可读性。泛型对于集合类来说尤其有用。


评论已关闭。