首页
学习
活动
专区
圈层
工具
发布

4-通用对象操作

1.对象的等值性和唯一性 Object的Equals[虚]方法判断两个对象是否相等; Object.ReferenceEquals判断两个对象是否指向同一引用[严格意义上的相等、对象的唯一性]。...2.对象的散列码 Object的GetHashCode[虚]方法返回一个Int32类型的散列码,当重写Equals方法而没有重写GetHashCode方法时编译器会提示一个警告信息。...3.对象克隆 一个类必须自己确定是否允许被克隆,如果允许则应该实现IConeable接口,该接口定义一个方法Clone方法,实现该方法如下: class myConle : ICloneable {...public Object Clone() { //调用Object的受保护方法,实现浅拷贝 //浅拷贝共享对象中包括的应用类型的成员,值类型的成员则不共享;...return MemberwiseClone(); } } 对应深拷贝的话也应该实现此接口,创建一个新对象,初始化相关数据,返回新对象引用。

79460
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    面向对象设计——通用愉快的经历

    人们常常对我们说,该代码可重用性和耦合减少,个合格的面向对象的程序设计人员,这样的技术成为了我们的必备技能,今天就跟着我一起来一次轻松愉快的旅行!...泛型类是引用类型,是堆对象,主要是引入了类型參数这个概念。 注解: 泛型就是一个黑盒子,我们设计代码的时候不须要知道黑子里是什么类型。...我们关心的是对黑盒子的处理,这样,我们就不是针对详细的对象编程,我们就相当于定义了一套逻辑(运行标准),而我们在真正用的时候。给的是什么类型,他就具有了这个逻辑(运行标准)!...//转换为迭代器类型——为了将结果逐次输出 yield return baglist.Something; //转换为下一步要输出的对象...这句话如今来看真的非常有道理,尤其是这次的研究,我发现,不是我们学不会,而是我们不会学,我们对待学习,放纵多余慎重,将就多余斟酌,马虎多余认真,这种学习,最大的表现就是我们顶着面向对象程序设计员的帽子,

    39510

    《Effective Java》—— 对于所有对象都通用的方法

    本节主要涉及Object中通用的一些方法,比如equals,hashCode,toString,clone,finalize等等 覆盖equals时请遵守通用约定 equals方法实现的等价关系:...=null 高质量equals方法的诀窍: 使用==操作符检查——“参数是否为这个对象的引用” 使用instanceof检查——“参数是否为正确的类型” 参数转换成正确的类型 对于每个关键域,检查参数中的域是否与对象的域相匹配...写完后,问自己:是否对称、是否传递、是否一致 忠告: 覆盖equlas时,总是覆盖hashCode 不要企图让equals过于智能 不要将equals中的Object对象换成其他的类型 @Override...始终覆盖toString() 因为toString方法应该返回对象的关键信息 谨慎的覆盖clone 应该满足: x.clone() !...= x x.clone().getClass() == x.getClass() x.clone().equals(x) 另外clone方法相当于另一种构建器,不应该对原来的对象产生影响。

    84970

    C++ 通用对象池的设计与实现

    用语: client:使用对象池的线程 pool:对象池 deque:对象池的容器 base-object:初始化时client传入的基本对象 object:对象池的存储对象 size:池内剩余...功能概要 池一般用于复杂对象、高消耗对象的复用,基于这个观点,基本使用如下: client初始化一个基本对象base-object,该对象的创建过程可以是极其复杂的。...考虑边界情况: 如果资源对象只有一个,同时发生get和release,get会获得front的对象,release会在back空间放入一个新的对象,没有冲突发生。...这样把新建对象的消耗分散到各个时期,并减少了扩容获取双端锁的时间。 如果扩容的时候,发现上次渐进扩容未完成,则直接创建“剩余所需渐进创建对象个数+base_size/2个”对象。 5....缩容机制 缩容分两种,一种是删除池内对象,另一种是reserve deque。 由于池内对象可以看做无状态的base-object,删除池内对象时,pop_front即可。

    1.3K30

    用Java实现一个通用并发对象池

    在真正开始写代码前,我们先来梳理下一个对象池需要完成哪些功能。 如果有可用的对象,对象池应当能返回给客户端。 客户端把对象放回池里后,可以对这些对象进行重用。...为了能够支持任意对象,上面这个接口故意设计得很简单通用。它提供了从池里获取/返回对象的方法,还有一个关闭池的机制,以便释放对象。 现在我们来实现一下这个接口。...不过还有个问题,由于上面这些类是设计成能支持通用的对象池的,因此具体的实现不知道该如何验证对象的有效性(因为对象都是泛型的)。因此我们还需要些别的东西来帮助我们完成这个。...我们需要一个通用的方法来完成对象的校验,而具体的实现不必关心对象是何种类型。因此我们引入了一个新的接口,Validator,它定义了验证对象的方法。这个接口的定义如下: ? ? ?...这个功能不能依赖于对象池本身,必须要有一个通用的方式来创建新的对象。通过一个ObjectFactory的接口就能完成这个,它只有一个“如何创建新的对象”的方法。

    1.1K20

    效率编程 之「对于所有对象都通用的方法」

    第 1 条:覆盖equals方法时请遵守通用约定 覆盖equals方法看似很简单,但是有许多覆盖方式会导致错误,并且后果非常严重。...&& pn.areaCode == areaCode; } } 如上述代码所示,该类的equals方法就是根据上面的诀窍构造出来的,符合equals方法的各项等价关系以及通用约定...如果不这样做的话,就会违反Object.hashCode的通用约定,从而导致该类无法结合所有基于散列的集合一起正常工作,这样的集合包括HashMap、HashSet和Hashtable等。...但是它也是极为恶劣的,因为它使得每个对象都具有同样的散列码。因此,每个对象都被映射到同一个散列通中,使散列表退化为链表。它使得本该线性时间运行的程序变成了以平方级时间在运行。...result = 31 * result + lineNubmer; return result; } 如上述代码所示,这个hashCode方法就是根据上面的方法构造出来的,满足hashCode方法的通用约定

    68830

    ​第3章 对于所有对象都通用的方法

    ~~ 第3章 对于所有对象都通用的方法 Object的设定是为了扩展,它的所有非final方法(equals hashCode toString clone finalize)都有明确的通用约定,因为它们被设计是要被覆盖...(override)的 而在覆盖这些方法时,都有责任遵守这些通用的约定,否则,其他依赖这些约定的类(如HashMap&HashSet)就无法结合该类一起正常运作....什么时候应该覆盖equals 当类需要逻辑相等这个概念的时候就应该覆盖equals 比如要判断两个student是否是同一个人,这个时候我们就需要按需重写equals 通用约定 重写equals的时候就必须要遵守它的通用约定...Object通用约定(在Object类中的注释即是): 在应用程序的执行期间,只要对象的equals方法的比较操作所用到的信息没有被修改,那么对这同一个对象调用多次,hashCode方法都必须始终如一地返回同一个整数...如果两个对象根据equals方法比较是相等的,那么调用这两个对象中任意一个对象的hashCode方法都必须产生同样的整数结果.

    76220

    创建通用函数对象的三种方法

    题目:创建一个函数对象,检查一个人、一辆汽车或一条狗的年龄大于限定值的个数。 此对象,我们定义为 older_than,这是一个类对象。 方法一:面向对象 创建一个包含 age()虚函数的超类。...,必须指定对象的类型,很可能导致指定的类型与调用操作符要求的类型不一致的问题。...方法三:模板成员函数 因此,可以把调用操作符合作为一个模板成员函数,而不是创建一个模板,这种情况在实例化 older_than函数对象时,就不需要指定类型,编译器在调用“调用操作符”时,会自动推测参数的类型...object).age() > m_limit; } private: int m_limit; }; //再使用 older_than函数对象时...,就不用显式指明对象类型了,甚至可以对不同的类型使用相同的对象示例 older_than pp(5); std::count_if(persons.cbegin(), persons.cend(

    66120

    笔记《Effective Java》02:对所有对象都通用的方法

    今天整理第二章节:对所有对象都通用的方法。2、在重写equals方法时要遵守通用约定要避免犯错,最简单的方式就是不重写。这样的话,该类的实例只会与自身相等。...当一个类在对象相同之外还存在逻辑相等的概念,而且其上层超类都没有重写equals方法。这通常就是值类的情况。如Integer或String。在重写equals方法时,必须遵守通用约定。...3.1、为什么要重写hashCode如果没有这样做,类就会违反hashCode的通用约定,这将使其实例无法正常应用与诸如HashMap和HashSet等集合中。...hashCode有其通用约定,如下:当在一个对象上重复调用hashCode方法时,只要在equals的比较中用到的信息没有修改,他就必须一致的返回同样的值如果根据equals方法,两个对象是相等的,那么在这两个对象上调用...hashCode方法,必须产生同样的整数结果如果根据equals方法,两个对象不相等,那么在这两个对象上调用hashCode方法,并不要求产生不同的结果,只是不相等的对象产生不同的结果,可能会提高哈希表的性能

    37610

    CORBA 架构体系指南(通用对象请求代理体系架构)

    概述 通用对象请求代理体系架构 (CORBA) 是由对象管理组 (OMG) 定义的标准,它使以多种计算机语言编写并在多台计算机上运行的软件组件能够协同工作。...公共设施 公共设施分为两类: 横向设施(horizontal facilities)是指在通用领域内定义的对象。信息管理、网络管理、系统管理、任务管理和用户接口等都属于通用领域。...CORBA对象登记在命名服务中,它可根据对象的名字找出对应的服务器中的对象引用。 事件服务(event service)。...应用对象 这是未经OMG标准化的、由各个应用开发者自行开发的实体,应用对象使用CORBA提供的各种对象服务。...; 4) 给予客户端存根(client stub),编写客户对象调用程序; 5) 分别编译客户对象和服务对象程序; 6) 运行服务对象程序。

    3.4K31

    《Effective Java》读书笔记(二)之对于所有对象都通用的方法

    第八条 在改写equals的时候请遵守通用约定 一般以下几种情况,不适宜覆盖equals方法 1.类的每个实例本质上都是唯一的,对于代表活动实体而不是值的类确实如此,例如Thread. 2.不关心类是否提供了...如果类具有自己特有的“逻辑相等”的概念(不同于对象等同的概念),而且超类没有覆盖equals以实现期望的行为,就需要进行覆盖,这通常属于“值类”的情形,例如Integer和Date。...当使用equals来比较对象, 是希望他们在逻辑上是否相等, 而不是指向同一对象, 或者用来作为Map的key以及集合Set中的元素时, 就必须复写equals方法....实例受控,确保“每个值最多只存在一个对象”的类,枚举通常属于这种类型。对于枚举类型来说, 逻辑相等与对象相等是同一回事, 因此不需要覆盖equals方法。...的引用值x和y和z,如果x.equals(y)为true,y.equals(z);那么x.equals(x)也必须为true 4)一致性:对于任何非null的引用值x和y,如果用于equals比较的对象信息没有被修改的话

    43610

    Effective-java-读书笔记之对于所有对象都通用的方法

    第10条 覆盖equals时请遵守通用约定如果不覆盖equals方法, 类的每个实例都只与它自身相等. 如果满足以下任何一个条件, 就不需要覆盖equals方法: 类的每个实例本质上都是唯一的....例外: 实例受控的值类: 枚举, 一个值对应一个实例, 所以不需要覆盖equals.覆盖equals方法的时候, 必须要遵守通用约定:* 自反性(reflexive): 对象必须等于其自身.* 对称性(...如果不这样做的话, 就会违反Object.hashCode的通用约定, 从而导致该类无法结合所有基于散列的集合一起正常运作, 这样的集合包括HashMap, HashSet和Hashtable.通用约定...(接口的一种极端非典型的用法.)来自Object规范中的clone方法的通用约定:创建和返回对象的一个拷贝. 这个拷贝的精确含义取决于该对象的类. 通常要求:* x.clone() !...(浮点值没有遵守compareTo的通用约定.)从Java 7开始, 所有的基本类型的装箱类型都提供了静态的compare方法, 所以不再建议使用.如果一个类有多个关键域, 必须从最关键的域开始,

    65500
    领券