docs: public Object put(String key, Object value) {
      if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) SibTr.entry(this, tc, "put", new Object[]{key, PasswordUtils.replaceValueIfKeyIsPassword(key,value)});
  
      // If the value is null (which is allowed for a Map Message) we can't tell
      // quickly whether the item is already in the map as null, or whether it doesn't exist,
      // so we just assume it will cause a change.
      // For properties we will never get a value of null, and it is properties we are really concerned with.
      if ((!changed)&& (value != null)) {
        Object old = get(key);
        if (value.equals(old)) {          // may as well call equals immediately, as it checks for == and we know value!=null
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) SibTr.exit(this, tc, "put",  "unchanged");
          return old;
        }
        else {
          changed = true;
          Object result = copyMap().put(key, value);
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) SibTr.exit(this, tc, "put", PasswordUtils.replaceValueIfKeyIsPassword(key,result));
          return result;
        }
      }
      else {
        changed = true;
        Object result = copyMap().put(key, value);
        if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) SibTr.exit(this, tc, "put", PasswordUtils.replaceValueIfKeyIsPassword(key,result));
        return result;
      }
    }