- 浏览: 1237202 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (193)
- ant/maven (6)
- algorithm (5)
- tomcat/weblogic/jboss (6)
- javascript/jquery (13)
- java (33)
- flex/flash (0)
- JPA/Hibernate/myBatis (18)
- java concurrent (7)
- test (2)
- windows/linux (6)
- java collection (7)
- design pattern (2)
- life/health (3)
- database (12)
- IDE (4)
- spring/ejb (20)
- html/css/ckeditor (7)
- jsp/servlet (3)
- java io (13)
- java security (4)
- jni (0)
- svn/git (2)
- english (2)
- java jmx (1)
- xml (1)
- struts/springmvc (9)
- middleware (2)
- cache (1)
- cglib (3)
最新评论
-
jlotusYo:
博主,真感谢。
Java 密码扩展无限制权限策略文件 -
senninha:
这个。。是api说明吧。。
ScheduledExecutorService 源码分析 -
zoutao2008:
请问大文件如何处理?按你这种方式的话,文件超过200M时就会报 ...
hessian系列之二:上传文件 -
lwj1113:
lwj1113 写道谢谢博主这么细致的demo;在系列五中通过 ...
myBatis系列之五:与Spring3集成 -
lwj1113:
谢谢博主这么细致的demo;在系列五中通过testng测试类跑 ...
myBatis系列之五:与Spring3集成
首先看看方法:
1. getClass方法
这是一个native方法,返回的是当前对象的类的字节码。
2. hashCode方法
这是一个native方法,返回的是根据当前对象的物理地址生成的哈希码,目的是为了区分不同的对象,这在一些根据Hash值来存储的集合中很有用。
如果两个对象经过equals比较后,返回true,那么它们的hashCode也必须是相同的;
如果两个对象经过equals比较后,返回false,那么它们的hashCode可以不同,也可以相同。
3. equals方法
比较当前对象是否和某个object相等。如果重写这个方法,需要满足下面的契约:
a. reflexive (反身性)
=> x != null
x.equals(x) return true
b. symmetric (对称性)
=> x != null && y != null
if (x.equals(y)) y.equals(x) return true
c. transitive (传递性)
=> x != null && y != null && z != null
if (x.equals(y) && y.equals(z)) x.equals(z) return true
d. consistent (连贯性)
=> x != null && y != null
x.equals(y) return false;
...
x.equals(y) return false;
e. x != null
x.equals(null) return false
4. clone方法
这是一个native方法,创建并返回该对象的拷贝。
对于某个对象x,
x.clone() != x return true // 但这不是绝对的
x.clone().getClass() == x.getClass() return true // 但这不是绝对的
典型情况下:
x.clone().equals(x) return true // 但这不是绝对的
按照惯例,该方法调用suer.clone()。如果这个类和所有它的超类都遵循这个规则,那么:x.clone().getClass() == x.getClass()
按照惯例,拷贝的对象应该和该对象相互独立。为了达到这个目标,在返回之前需要对其中的一个或几个字段进行修改,拷贝组成当前对象的变化部分,然后把引用改成指向拷贝。如果一个类只有原始类型字段或者对不变对象的引用,不需要做这些修改。
过程:
a. 首先如果当前对象的类没有实现Cloneable接口,抛CloneNotSupportedException异常
b. 创建当前对象的类的新实例,用当前对象的内容来初始化所有的字段。所以只是复制了引用,是shallow copy
5. toString方法
返回该对象的string表示形式。该表示应该能够表达该对象的信息。最好是所有的子类都重写该方法。
Object的toString方法返回:该对象的类名 + "@" + 该对象hashCode的16进制表示形式
6. notify方法
这是一个native方法,唤醒一个在当前对象监视器上等待的线程。
被唤醒的线程直到当前线程释放锁后才可以执行,并且和其它线程竞争对象的拥有权(没有优先级之分)。
这个方法应该仅仅被拥有对象监视器的线程所调用。
一个线程成为对象的监视器的拥有者的三种方法:
a. 执行该对象上的一个同步(synchronized)方法
b. 执行一个同步在该对象上的代码块
c. 执行该对象的类上的静态同步方法
7. notifyAll方法
这是一个native方法,唤醒所有在当前对象监视器上等待的线程。
和notify类似。
8. wait(long timeout)方法
这是一个native方法,使当前线程等待,直到另外一个线程调用改对象的notify或notifyAll方法,或者等待时间已到。
当前线程必须拥有该对象的监视器。
该方法会让当前线程T进入到当前对象的等待集中,让出当前对象的监视器,T被禁用直到下面情况中的一种发生:
a. 其它线程调用当前对象的notify方法,并且T恰好被选中唤醒
b. 其它线程调用当前对象的notifyAll方法
c. 其它线程暂停T
d. 等待时间已到
被唤醒后,T从等待集中被移除和启用等待线程调度,接着会和其它线程竞争当前对象的拥有权。如果T成功了,就会从wait方法的调用处返回,当前对象和T的同步状态和调用wait时一样。
有种情况是伪唤醒,就是T从wait处返回了,没有出现上面说的4种情况。所以wait方法放在loop块中,确保不是伪唤醒:
如果在wait之前或wait的时候,当前线程被中断了,那么直到当前线程恢复时才会抛InterruptedException。
wait方法会使当前线程让出当前对象的拥有权,但是不会让出同步的其它对象。
该方法必须是在当前线程是当前对象的拥有时才可以调用。
9. wait(long timeout, int nanos)方法
看到该方法的签名,以为nanos会提供更高精度的控制。但是代码将nanos四舍五入到timeout,调用wait(timeout)方法。
10. wait()方法
这里的参数0表示没有时间限制。
11. finalize方法
垃圾回收器觉得该对象没有被其它任何存在的线程引用时会调用该方法。子类可以通过复写该方法来达到资源释放。
Java不能保证什么线程会来调用某个对象的finalize方法。可以保证的是,当finalize被调用时,调用finalize的线程不会拥有用户可见的同步锁。在方法调用过程中出现的异常会被忽略并且方法调用会终止。
任何对象的finalize方法只会被调用一次。
public final native Class<?> getClass(); public native int hashCode(); public boolean equals(Object obj); protected native Object clone() throws CloneNotSupportedException; public String toString(); public final native void notify(); public final native void notifyAll(); public final native void wait(long timeout) throws InterruptedException; public final void wait(long timeout, int nanos) throws InterruptedException; public final void wait() throws InterruptedException; protected void finalize() throws Throwable;
1. getClass方法
这是一个native方法,返回的是当前对象的类的字节码。
2. hashCode方法
这是一个native方法,返回的是根据当前对象的物理地址生成的哈希码,目的是为了区分不同的对象,这在一些根据Hash值来存储的集合中很有用。
如果两个对象经过equals比较后,返回true,那么它们的hashCode也必须是相同的;
如果两个对象经过equals比较后,返回false,那么它们的hashCode可以不同,也可以相同。
3. equals方法
比较当前对象是否和某个object相等。如果重写这个方法,需要满足下面的契约:
a. reflexive (反身性)
=> x != null
x.equals(x) return true
b. symmetric (对称性)
=> x != null && y != null
if (x.equals(y)) y.equals(x) return true
c. transitive (传递性)
=> x != null && y != null && z != null
if (x.equals(y) && y.equals(z)) x.equals(z) return true
d. consistent (连贯性)
=> x != null && y != null
x.equals(y) return false;
...
x.equals(y) return false;
e. x != null
x.equals(null) return false
4. clone方法
这是一个native方法,创建并返回该对象的拷贝。
对于某个对象x,
x.clone() != x return true // 但这不是绝对的
x.clone().getClass() == x.getClass() return true // 但这不是绝对的
典型情况下:
x.clone().equals(x) return true // 但这不是绝对的
按照惯例,该方法调用suer.clone()。如果这个类和所有它的超类都遵循这个规则,那么:x.clone().getClass() == x.getClass()
按照惯例,拷贝的对象应该和该对象相互独立。为了达到这个目标,在返回之前需要对其中的一个或几个字段进行修改,拷贝组成当前对象的变化部分,然后把引用改成指向拷贝。如果一个类只有原始类型字段或者对不变对象的引用,不需要做这些修改。
过程:
a. 首先如果当前对象的类没有实现Cloneable接口,抛CloneNotSupportedException异常
b. 创建当前对象的类的新实例,用当前对象的内容来初始化所有的字段。所以只是复制了引用,是shallow copy
5. toString方法
public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
返回该对象的string表示形式。该表示应该能够表达该对象的信息。最好是所有的子类都重写该方法。
Object的toString方法返回:该对象的类名 + "@" + 该对象hashCode的16进制表示形式
6. notify方法
这是一个native方法,唤醒一个在当前对象监视器上等待的线程。
被唤醒的线程直到当前线程释放锁后才可以执行,并且和其它线程竞争对象的拥有权(没有优先级之分)。
这个方法应该仅仅被拥有对象监视器的线程所调用。
一个线程成为对象的监视器的拥有者的三种方法:
a. 执行该对象上的一个同步(synchronized)方法
b. 执行一个同步在该对象上的代码块
c. 执行该对象的类上的静态同步方法
7. notifyAll方法
这是一个native方法,唤醒所有在当前对象监视器上等待的线程。
和notify类似。
8. wait(long timeout)方法
这是一个native方法,使当前线程等待,直到另外一个线程调用改对象的notify或notifyAll方法,或者等待时间已到。
当前线程必须拥有该对象的监视器。
该方法会让当前线程T进入到当前对象的等待集中,让出当前对象的监视器,T被禁用直到下面情况中的一种发生:
a. 其它线程调用当前对象的notify方法,并且T恰好被选中唤醒
b. 其它线程调用当前对象的notifyAll方法
c. 其它线程暂停T
d. 等待时间已到
被唤醒后,T从等待集中被移除和启用等待线程调度,接着会和其它线程竞争当前对象的拥有权。如果T成功了,就会从wait方法的调用处返回,当前对象和T的同步状态和调用wait时一样。
有种情况是伪唤醒,就是T从wait处返回了,没有出现上面说的4种情况。所以wait方法放在loop块中,确保不是伪唤醒:
synchronized (obj) { while (<condition does not hold>) obj.wait(timeout); ... // Perform action appropriate to condition }
如果在wait之前或wait的时候,当前线程被中断了,那么直到当前线程恢复时才会抛InterruptedException。
wait方法会使当前线程让出当前对象的拥有权,但是不会让出同步的其它对象。
该方法必须是在当前线程是当前对象的拥有时才可以调用。
9. wait(long timeout, int nanos)方法
public final void wait(long timeout, int nanos) throws InterruptedException { if (timeout < 0) { throw new IllegalArgumentException("timeout value is negative"); } if (nanos < 0 || nanos > 999999) { throw new IllegalArgumentException("nanosecond timeout value out of range"); } if (nanos >= 500000 || (nanos != 0 && timeout == 0)) { timeout++; } wait(timeout); }
看到该方法的签名,以为nanos会提供更高精度的控制。但是代码将nanos四舍五入到timeout,调用wait(timeout)方法。
10. wait()方法
public final void wait() throws InterruptedException { wait(0); }
这里的参数0表示没有时间限制。
11. finalize方法
垃圾回收器觉得该对象没有被其它任何存在的线程引用时会调用该方法。子类可以通过复写该方法来达到资源释放。
Java不能保证什么线程会来调用某个对象的finalize方法。可以保证的是,当finalize被调用时,调用finalize的线程不会拥有用户可见的同步锁。在方法调用过程中出现的异常会被忽略并且方法调用会终止。
任何对象的finalize方法只会被调用一次。
发表评论
-
Netty系列之二、Netty组件
2014-10-12 19:55 0Netty主要由以下几个组件构成: Bootstrap o ... -
Netty系列之二:传输方式
2014-09-17 22:35 0NIO (Non-blocking I/O) io.netty ... -
Java正则表达式实例
2014-08-25 22:50 1887题目: 有两个文件context.txt和words ... -
quartz系列之九:存储
2014-08-05 13:16 0这里以1.8.x为例: 任务 ... -
JVM 四种引用
2014-04-24 19:56 17171. 强引用 指通过普通 ... -
Proxy 源码分析
2014-04-21 10:47 0public class Proxy implements ... -
NIO UDP 编程
2014-04-17 23:18 4204和TCP的SocketChannel类似,UDP的Dat ... -
Matcher 源码分析
2014-04-15 14:45 0首先看下接口: public interface Matc ... -
BTrace 使用
2014-03-20 18:03 0简介 Btrace (Byte Trace)是Sun推出的一款 ... -
NIO Socket 编程
2014-04-11 22:48 1602Java NIO (Nonblocking IO)解决了常规I ... -
hessian系列之二:上传文件
2014-02-17 17:16 6150hessian较早版本通过 byte[] 进行文件传输;4.0 ... -
hessian系列之三:与Spring集成
2014-02-17 20:21 17811Spring封装了hessian客户端和服务端的通用代码,把实 ... -
hessian系列之一:Hello world
2014-01-06 20:51 2254Hessian是一个Web Service的轻量级二进制协议, ... -
XStream:自定义转换器
2013-12-30 22:47 0XStream是一款不错的oxm (Object-XML ma ... -
Http连接工具类
2013-12-28 16:13 0public class HttpConnUtil { ... -
Integer源码分析
2013-12-26 19:59 0private static String toU ... -
全排序
2013-12-23 21:02 0写一个函数, 如 foo(String str), 打印出 s ... -
logback系列之四:输出日志到不同文件
2013-12-03 16:25 68753logback系列之一:输出日志到控制台 logback系列之 ... -
Properties 源码分析
2013-11-26 10:32 01. Properties类扩展了Hashtable,用来保存 ... -
logback系列之三:输出日志到文件(滚动)
2013-11-16 23:37 64262logback系列之一:输出日志到控制台 logback系列之 ...
相关推荐
qt最重要的类, object类的源码分析,相当实用, 相当有参考价值
讲述Open Inventor (OIV)的编程要点、基本概念...分析FreeCAD中几何渲染相关的DocumentObject、ViewProvider、View3DInventorViewer、View3DInventor等类,通过Part模块中Cube的创建过程,梳理了几何数据显示的流程。
主要通过redisObject进行类型转换。 t_list.c list在Server/Client中的应答操作。主要通过redisObject进行类型转换。 t_set.c set在Server/Client中的应答操作。主要通过redisObject进行类型转换。 t_string.c ...
Android 动画机制 补间、属性、帧动画、源码分析 Android系统提供了很多丰富的API去实现UI的2D与3D动画,最主要的划分可以分为如下几类: * View Animation:最早提供的一种动画,用来这只view。 * Drawable ...
NULL 博文链接:https://wang-yanli.iteye.com/blog/1477681
集合源码分析 高并发与多线程 Stargazers over time 线程 线程的创建和启动 线程的sleep、yield、join 线程的状态 代码在 部分。 synchronized关键字(悲观锁) synchronized(Object) 不能用String常量、Integer、Long...
主要介绍了Java从JDK源码角度对Object进行实例分析,具有一定借鉴价值,需要的朋友可以参考下。
ES6 Object.assign() 的实现; 安装 $ bower 安装 es6-object-assign 用法 var oa = new ObjectAssign ( ) ; var t = { name : "lisa" , age : 25 } ; var r = { speak : function ( ) { console . log ( 'Hello, ...
集合源码分析 Java-Virtual-Machine Java虚拟机资源汇总 最后更新时间 2019-10-24 注意 资料的排列的顺序不分先后。 资料的所有权归原作者所有,这里是汇总。 知识水平的限制,导致资料的介绍或者范围有一定的局限性...
介绍源码前,我们先看下Retrofit的基本使用,大致了解下流程,跟着这个流程来分析源码才不会乱。 1、初始化Retrofit对象 Retrofit retrofit = new Retrofit.Builder() //使用自定义的mGsonConverterFactory ....
ORM是Object和Relation之间的映射,包括Object->Relation和Relation->Object两方面。Hibernate是个完整的ORM框架,而MyBatis完成的是Relation->Object,也就是其所说的data mapper framework。关于ORM的一些设计思路...
这是关于UML分析方面的,如何将UML分析与具体的对象设计结合在一起
基于jdk1.8 的ArrayList的源码分析 前言:一说到ArrayList的大家可能立马想到的就是:有序、可重复、查找快但是增删慢、线程不安全。但是具体的原因都不是很清楚,本文就会根据这些问题和大家一起去学习。主要会从...
集合源码分析 Java-Virtual-Machine Java虚拟机资源汇总 最后更新时间 2019-04-23 注意 资料的排列的顺序不分先后。 资料的所有权归原作者所有,这里是汇总。 知识水平的限制,导致资料的介绍或者范围有一定的局限性...
这本书也不适合带领你学习面向对象(Object Oriented)技术 — 是的,STL 与面向对象没有太多关连。本书前言清楚说明了书籍的定位和合适的读者,以及各类基础读物。如果你的Generic Programming/STL实力足以阅读本书...
如何知道数据变了,其实上文我们已经给出答案了,就是通过Object.defineProperty( )对属性设置一个set函数,当数据改变了就会来触发这个函数,所以我们只要将一些需要更新的方法放在这里面就可以实现data更新view了...
集合源码分析 2020年深圳java打工仔找工作记录帖,有一段时间的社畜了,所以直奔主题, 找的资料都是面试常用的,整理一下,希望能帮到大家 主要三个部分 1.搜集面试题目 2.java资料 3 找工作日期记录,看从准备工作开始,...
SFND 3D对象跟踪 该项目是Udacity的Sensor Fusion Nanodegree中的第三个项目。 该项目涵盖了TTC构件下面显示的所有部分。本地运行的依赖项cmake> = 2.8 所有操作系统:make> = 4.1(Linux,Mac),3.81(Windows) ...
JDK1.8源码分析 导入源码过程中的注意事项 JDK1.8对应JDK版本下载: 提取码:49wi 源码在src目录下 以下两个类手动添加的,解决编译过程中该包的丢失 sun.font.FontConfigManager sun.awt.UNIXToolkit 其中: 1.请...
这本书也不适合带领你学习面向对象(Object Oriented)技术 — 是的,STL 与面向对象没有太多关连。本书前言清楚说明了书籍的定位和合适的读者,以及各类基础读物。如果你的Generic Programming/STL实力足以阅读本书...