树形图中的JAVA想要在对象中改变值吗?

Cha*_*ool 1 java dictionary replace object treemap

所以,我将Object类声明为TreeMap值.

public class Info {
    String name;
    String pName;// ????
    String psw;//?????
    public Info(String name,String pName, String psw){
       this.name = name;
       this.pName=pName;
       this.psw=psw;
    }

    public Info(String name,String psw){
       this.psw=psw;
    }

    public Info(String name){
        this.name=name;
    }
}


public class menu {
    Scanner sc = new Scanner(System.in);
    static TreeMap<String, Info> map = new TreeMap<String, Info>();
    public menu() {// constructor
        map.put("admin", new Info("admin","1234"));// initialize root 
    }
    private void adminChangePsw() {
        System.out.print("new password :");
        String data = sc.next();
        map.replace(admin, <value>);// howww?
    }
Run Code Online (Sandbox Code Playgroud)

我想更改管理员密码,我尝试在类Info下添加以下代码,

public Info(String psw){
    this.psw=psw;
}
Run Code Online (Sandbox Code Playgroud)

但是这段代码也有String类型,所以猜我不能用它

    public Info(String name){
        this.name=name;
    }
Run Code Online (Sandbox Code Playgroud)

经过几次尝试后,发现替换(K,V)就是我现在所需要的,但是如果value是Object Class,我不知道怎么做.

public void setPsw(String data){
    psw=data;
}

map.replace("admin",map.get("admin").setPsw(data));
Run Code Online (Sandbox Code Playgroud)

我也尝试了这个(笑),当然它不起作用..

任何人都给我提示,谢谢:>

Pet*_*rey 6

任何集合仅包含对象的引用.不是对象本身.当您添加值/元素时,您正在做的是将该对象的引用添加到集合中.

这意味着当您更新可变对象时,不需要将其放回集合中.

map.get("admin").setPsw(data);
Run Code Online (Sandbox Code Playgroud)

这将引用Info并调用setPsw它.

注意:如果您具有不可变值并且获得新值,则必须替换它.

比如说你有

Map<String, Integer> map = ....
map.put("admin", map.get("admin") + 1); // the + 1 creates a new Integer reference.
Run Code Online (Sandbox Code Playgroud)

BTW在Java 8中你可以做到

map.compute("admin", (k, v) -> v == null ? 1 : v + 1);
Run Code Online (Sandbox Code Playgroud)