在Java中,地址中的“@”符号(例如,在打印的堆栈跟踪中)通常用于将对象的实例表示为“对象名称”+“@”+ System.identityHashCode()(那里)在Memory address of variables in Java)对此进行了很好的讨论。
但这似乎并不能解释Android Studio打印出对象地址时使用的语法。
我有一个变量gmap,当在Android Studio Debugger的“变量”窗口中查看时(当程序遇到断点时),该变量具有以下值。
gmap = {com.google.android.gms.maps.GoogleMap@4541}
但是,当我在“评估代码片段”窗口中运行以下内容时,它们都没有提供值“4541”。
gmap.toString(): com.google.android.gms.maps.GoogleMap@63676d9
System.identityHashCode(gmap): 104232665
gmap.hashCode(): 104232665
String.format("%x", System.identityHashCode(gmap)): 63676d9
String.format("%d", System.identityHashCode(gmap)): 104232665
“4541”代表什么?
更新: 我再看一下堆栈跟踪,发现数字往往以一种顺序的方式增加。以下是mContext变量的部分转储,如断点处的“变量”窗口所示。
mContext = {com.barryholroyd.tapit.ActivityMain@3624}
LOGTAG = {java.lang.String@3642} "TAPIT APS"
bh_aps = {com.barryholroyd.tapit.Bhlogger@3643}
mActionBar = null
mActivityInfo = {android.content.pm.ActivityInfo@3644}
mActivityTransitionState = {android.app.ActivityTransitionState@3645}
mAllLoaderManagers = null
mApplication = {android.app.Application@3646}
mCalled = true
mChangeCanvasToTranslucent = false
mChangingConfigurations = false
mCheckedForLoaderManager = false
mComponent = {android.content.ComponentName@3647}
mConfigChangeFlags = 0
mContainer = {android.app.Activity$1@3648}
mCurrentConfig = {android.content.res.Configuration@3649}
我怀疑@ ####值可能偏移到某种分配表或其他东西,但这只是猜测。我不确定如何/为什么这会有用。我宁愿让它们成为哈希代码或其他可以帮助我轻松识别特定类实例化的东西。
百里