Java学习常见的易错点、难点(一)(五)
义一个例外类的时候必须使其继承excepiton或者RuntimeException。
Throw是一个语句,用来做抛出例外的功能。
而throws是表示如果下级方法中如果有例外抛出,那么本方法不做处理,继续向上抛出。
Throws后跟的是例外类型。
32.断言
断言是一种调试工具(assert)
其后跟的是布尔类型的表达式,如果表达式结果为真不影响程序运行。如果为假系统出现低级错误,在屏幕上出现assert信息。
Assert只是用于调试。在产品编译完成后上线assert代码就被删除了。
方法的覆盖中,如果子类的方法抛出的例外是父类方法抛出的例外的父类型,那么编译就会出错:子类无法覆盖父类。
结论:子类方法不可比父类方法抛出更多的例外。子类抛出的例外或者与父类抛出的例外一致,或者是父类抛出例外的子类型。或者子类型不抛出例外。
如果父类型无throws时,子类型也不允许出现throws。此时只能使用try catch。
33.HashMap
底层也是用数组,HashSet底层实际上也是 HashMap,HashSet 类中有HashMap属性(我们如何在 API中查属性)。HashSet实际上为 (key.null)类型的HashMap 。有key值而没有 value值。
正因为以上的原因, TreeSet和TreeMap 的实现也有些类似的关系。
注意: TreeSet和TreeMap 非常的消耗时间,因此很少使用。
HashSet VS TreeSet:HashSet 非常的消耗空间, TreeSet因为有排序功能,因此资源消耗非常的高,我们应该尽量少使用,而且最好不要重复使用。
基于以上原因,我们尽可能的运用 HashSet而不用TreeSet ,除非必须排序。
同理: HashMap VS TreeMap:一般使用HashMap ,排序的时候使用 TreeMap。
HashMap VS Hashtable(注意在这里table的第一个字母小写)之间的区别有些类似于 ArrayList和Vector ,Hashtable是重量级的组件,在考虑并发的情况,对安全性要求比较高的时候使用。
34.hashcode
一致性
在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。
equals
如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果,注:这里说的equals(Object) 方法是指Object类中未被子类重写过的equals方法。
如果两个hashCode()返回的结果相等,则两个对象的equals方法不一定相等。
附加
如果根据equals(java.lang.Object)方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。
编辑本段
重写HashMap对象是根据其Key的hashCode来获取对应的Value。
在重写父类的equals方法时,也重写hashcode方法,使相等的两个对象获取的HashCode也相等,这样当此对象做Map类中的Key时,两个equals为true的对象其获取的value都是同一个,比较符合实际。
1:Object类的hashCode.返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。
2:String类的hashCode.根据String类包含的字符串的内容,根据一种特殊算法返回哈希码,只要字符串内容相同,返回的哈希码也相同。
3:Integer类,返回的哈希码就是Integer对象里所包含的那个整数的数值,例如Integer i1=new Integer(100),i1.hashCode的值就是100 。由此可见,2个一样大小的Integer对象,返回的哈希码也一样。
35.io流
在流中close()方法由程序员控制。因为输入输出流已经超越了VM的边界,所以有时可能无法回收资源。原则:凡是跨出虚拟机边界的资源都要求程序员自己关闭,不要指望垃圾回收。以Stream结尾的类都是字节流。(非重点)管道流:也是一种节点流,用于给两个线程交换数据。
PipedOutputStream
PipedInputStream
输出流:connect(输入流)
RondomAccessFile类允许随机访问文件GetFilepoint()可以知道文件中的指针位置,使用seek()定位。Mode(“r”:随机读;”w”:随机写;”rw”:随机读写)Io包的InputStreamread称为从字节流到字符流的桥转换类。这个类可以设定字符转换方式。
OutputStreamred:字符到字节
Bufferread有readline() 使得字符输入更加方便。
在I/O流中,所有输入方法都是阻塞方法。
Bufferwrite给输出字符加缓冲,因为它的方法很少,所以使用父类 printwrite,它可以使用字节流对象,而且方法很多。用流传输对象称为对象的序列化,但并不使所有的对象都可以进行序列化的。只有在实现类时必须实现一个接口:IO包下的Serializable(可序列化的)。此接口没有任何的方法,这样的接口称为标记接口。
Class Student implements Serializable
把对象通过流序列化到某一个持久性介质称为对象的可持久化。Transient用来修饰属性。
Transient int num;
表示当我们对属性序列化时忽略这个属性(即忽略不使之持久化)。
所有属性必须都是可序列化的,特别是当有些属性本身也是对象的时候,要尤其注意这一点。判断是否一个属性或对象可序列化: Serialver。Serialver TestObject(TestObject 必须为已经编译)
36.toString()
toString方法是一个“自我描述"的方法,要输出自我有用的信息,要重写该方法。
37.SuppressWarnings
取消编译时的警告
38.线程
一般用Runnable接口,不用Thread类,Runnable可以实现数据共享
39.静态方法只能继承,不能重写
接口成员变量必须赋初值
40.float类型
共32位(不int相同),其中1位为符号位, 指数8位, 尾数23位。需要强调的是float的精度是23位(即能精确表达23位的数,超过就被截 了)。小数是以尾数长度来表示精确度的,比如pi=3.14,它的精度是2位,pi=3.1415,它的精度就为4位。 比较有趣的是int的精度比float要大,因为int的精度是31位,大于float。因为int类型的范围是(-2^31)