string转object对象_面试官:对象可能会迟到,但它永远不会缺席

2023-10-21 03:30

本文主要是介绍string转object对象_面试官:对象可能会迟到,但它永远不会缺席,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题一:简单聊一下关于你对Object的理解

在 Java 中,只有基本数据类型不是对象,比如,数值,布尔和字符类型的值都不是对象。而其余的数据类型都是继承自一个名为Object的类,这个类是所有类的始祖,每个类都是由Object类扩展而来。

如果一个类继承自Object类,我们可以将extends Object给省略掉,如果在一个类的定义中没有明确的指出哪个是它的父类,那么Object类就认为是这个类的父类。

ff17140e0817828573aaf9d1b286d9a5.png

问题二:Object类中有一个registerNatives方法,对此你了解多少?

从方法的命名上我们就可以看出,该方法是用于注册本地(native)方法,主要是为了服务于JNI的,它主要是提供了 java 类中的方法与对应 C++ 代码中的方法的映射,方便jvm去查找调用 C++ 中的方法。

2498714733147f712d53da7e89cb37dd.png

问题三:Object类中有clone方法,聊聊你对这个方法的认识

clone方法是Object类的一个protected的方法,我们可以这样去应用这个方法

  1. 实现Cloneable接口
  2. 重写clone方法,并指定public修饰符。

b0c9c3baf2846e9ce4f3f8cb630fdf8d.png

问题四:为什么我们一定要去实现Cloneable接口,而不是直接去重写这个方法呢?

我们通过源码可以发现这是一个空的接口,clone是从Object类继承的。这个接口只是作为一个标记,指示类设计者了解克隆继承。对象对于克隆也很"偏执",如果一个对象请求克隆,但没有实现这个接口,就会生成一个异常。

在 Java 中,Cloneable这样的接口叫做标记接口,标记接口不包括任何方法,它的唯一作用就是允许在类型查询的时候使用instanceof

if (obj instanceof Cloneable){//TODO
}

问题五:说一说你对关于深克隆和浅克隆的认识

首先来说一下Object类是如何实现clone,它对这个对象一无所知,所以只能逐个域的进行拷贝。如果对象中的所有数据域都是数值或其他基本类型,拷贝这些域没有任何问题,但是如果对象中包含子对象的引用,拷贝域就会得到相同子对象的另一个引用,这样一来,原对象和克隆对象仍然会去共享一些信息。这种Object类默认实现的clone方法称为浅拷贝(Shallow Clone)。

这里需要注意,关于浅克隆的安全性,如果原对象和浅克隆对象共享的子对象是不可变的,那么这种共享就是安全的。如果子对象属于一个不可变的类,如String,就是这种情况。或者在对象的生命期中,子对象一直包含不变的常量 ,没有更改器方法会改变它,也没有方法会生成它的引用,这种情况同样是安全的。

不过子类对象通常是可变的,这时我们就需要定义深拷贝(Deep Clone),来克隆这个类的所有子对象。

具体实现方法如下:

public Test clone() throws CloneNotSupportedException{//拷贝该对象Test cloned = (Test)super.clone();//拷贝该对象中的可变域cloned.time = (Date) time.clone();return cloned;
}

这里需要提到的一点是:

虽然我们已经学习了clone的两种用法,但是在实际的编码中还是尽量少用这个方法,它具有天生的不稳定性,仅仅了解即可。即使是Java的标准库中也只有5%的类实现了这个方法。

我们可以使用Java的对象串行化特性来实现克隆对象,虽然效率不高,但是很安全,而且很容易实现。

b4a125bb456da74d52e28a1cb2452bff.png

问题六: 关于equals方法,说说是什么?

Object类中的equals方法用于检测一个对象是否等于另一个对象。在Object类中,这个方法将判断两个对象是否具有相同的引用。如果两个对象具有相同的引用,它们一定是相等的。

7d68117b5a36569e30371c4fc94e9837.png

问题七:有没有自己去重写过equals方法呢?

当然,这个我有笔记~

bfd513de7ef2d023bcf0845267be7835.png

问题八:不限于Object,聊聊hashCode

在Java中,hash code是由对象导出的一个整型值,以下是几个常见哈希值的算法:

  1. Object类的hashCode()。返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。
  2. String类的hashCode()。根据String类包含的字符串的内容,根据一种特殊算法返回哈希码,只要字符串所在的堆空间相同,返回的哈希码也相同。
  3. Integer类,返回的哈希码就是Integer对象里所包含的那个整数的数值,例如Integer i1=new Integer(100),i1.hashCode的值就是100 。由此可见,2个一样大小的Integer对象,返回的哈希码也一样。

问题九:说说EqualsHashcode的关系

这两个其实确切意义上并没有什么联系,前提是我们不会在HashSet,HashMap这种本质是散列表的数据结构中使用,如果我们要在HashSet,HashMap这种本质是散列表的数据结构中使用,在重写equals方法的同时也要重写hashCode方法,以便用户将对象插入到散列表中,否则会导致数据不唯一,内存泄漏等各种问题。

1.hashCode是为了提高在散列结构存储中查找的效率,在线性表中没有作用。

2.equals()hashCode()需要同时覆盖,而且定义必须一致,也就是说equals比较了哪些域,hashCode就会对哪些域进行hash值的处理。

3.若两个对象equals()返回true,则hashCode()有必要也返回相同的值。

4.若两个对象equals()返回false,则hashCode()不一定返回不同的值。

5.若两个对象hashCode()返回相同的值,则equals()不一定返回true。

6.若两个对象hashCode()返回不同值,则equals()一定返回false。

7.同一对象在执行期间若已经存储在集合中,则不能修改影响hashCode值的相关信息,否则会导致内存泄露问题。

这篇关于string转object对象_面试官:对象可能会迟到,但它永远不会缺席的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/251625

相关文章

Java第二阶段---09类和对象---第三节 构造方法

第三节 构造方法 1.概念 构造方法是一种特殊的方法,主要用于创建对象以及完成对象的属性初始化操作。构造方法不能被对象调用。 2.语法 //[]中内容可有可无 访问修饰符 类名([参数列表]){ } 3.示例 public class Car {     //车特征(属性)     public String name;//车名   可以直接拿来用 说明它有初始值     pu

【Python报错已解决】AttributeError: ‘list‘ object has no attribute ‘text‘

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一:检查属性名2.2 步骤二:访问列表元素的属性 三、其他解决方法四、总结 前言 在Python编程中,属性错误(At

HTML5自定义属性对象Dataset

原文转自HTML5自定义属性对象Dataset简介 一、html5 自定义属性介绍 之前翻译的“你必须知道的28个HTML5特征、窍门和技术”一文中对于HTML5中自定义合法属性data-已经做过些介绍,就是在HTML5中我们可以使用data-前缀设置我们需要的自定义属性,来进行一些数据的存放,例如我们要在一个文字按钮上存放相对应的id: <a href="javascript:" d

string字符会调用new分配堆内存吗

gcc的string默认大小是32个字节,字符串小于等于15直接保存在栈上,超过之后才会使用new分配。

找出php中可能有问题的代码行

前言 当你发现一个平时占用cpu比较少的进程突然间占用cpu接近100%时,你如何找到导致cpu飙升的原因?我的思路是,首先找到进程正在执行的代码行,从而确定可能有问题的代码段。然后,再仔细分析有问题的代码段,从而找出原因。 如果你的程序使用的是c、c++编写,那么你可以很容易的找到正在执行的代码行。但是,程序是php编写的,如何找到可能有问题的代码行呢?这个问题就是本文要解决的问题。 背景

PHP7扩展开发之对象方式使用lib库

前言 上一篇文章,我们使用的是函数方式调用lib库。这篇文章我们将使用对象的方式调用lib库。调用代码如下: <?php $hello = new hello(); $result = $hello->get(); var_dump($result); ?> 我们将在扩展中实现hello类。hello类中将依赖lib库。 代码 基础代码 这个扩展,我们将在say扩展上增加相关代码。sa

hibernate修改数据库已有的对象【简化操作】

陈科肇 直接上代码: /*** 更新新的数据并并未修改旧的数据* @param oldEntity 数据库存在的实体* @param newEntity 更改后的实体* @throws IllegalAccessException * @throws IllegalArgumentException */public void updateNew(T oldEntity,T newEntity

如何保证android程序进程不到万不得已的情况下,不会被结束

最近,做一个调用系统自带相机的那么一个功能,遇到的坑,在此记录一下。 设备:红米note4 问题起因 因为自定义的相机,很难满足客户的所有需要,比如:自拍杆的支持,优化方面等等。这些方面自定义的相机都不比系统自带的好,因为有些系统都是商家定制的,难免会出现一个奇葩的问题。比如:你在这款手机上运行,无任何问题,然而你换一款手机后,问题就出现了。 比如:小米的红米系列,你启用系统自带拍照功能后

【吊打面试官系列-Redis面试题】说说 Redis 哈希槽的概念?

大家好,我是锋哥。今天分享关于 【说说 Redis 哈希槽的概念?】面试题,希望对大家有帮助; 说说 Redis 哈希槽的概念? Redis 集群没有使用一致性 hash,而是引入了哈希槽的概念,Redis 集群有 16384 个哈希槽,每个 key 通过 CRC16 校验后对 16384 取模来决定放置哪个槽, 集群的每个节点负责一部分 hash 槽。

类和对象的定义和调用演示(C++)

我习惯把类的定义放在头文件中 Student.h #define _CRT_SECURE_NO_WARNINGS#include <string>using namespace std;class student{public:char m_name[25];int m_age;int m_score;char* get_name(){return m_name;}int set_name