• 从jvm运行机制来分析 String对象负值


    测试1:

    代码 

    public class Test {
    	public static void main(String[] args) {
    		String s1="aaa";
    		f(s1);
    		System.out.println(s1);
    	}
    	
    	public static void f(String s2){
    		System.out.println(s2);
    		s2="bbb";
    	}
    }
    

    输出结果

    aaa
    aaa
    

    可以看到 方法f 对字符串的修改是没有意义的;

    测试2:

    先创建一个实体对象p 设置String 熟悉 n

    public class P {
    	private String n;
    
    	public String getN() {
    		return n;
    	}
    
    	public void setN(String n) {
    		this.n = n;
    	}
    }
    

    测试类对元测试类进修改:

    public class Test {
    	public static void main(String[] args) {
    		String s1="aaa";
    //		f(s1);
    //		System.out.println(s1);
    		
    		P p1 = new P();
    		p1.setN(s1);
    		
    		f(p1);
    		System.out.println(p1.getN());
    	}
    	
    	public static void f(String s2){
    		System.out.println(s2);
    		s2="bbb";
    	}
    	
    	public static void f(P p2){
    		System.out.println(p2.getN());
    		p2.setN("bbb");
    	}
    }
    

    输出

    aaa
    bbb
    

    可以看到字符串在测试2中改变了,这是什么原因呢。

    首先我们看一下String的特点,入下图从java代码中可以看到String是一个常量是不可改变的,所以每次对String进行修改时起始是创建了一个新的对象。

    测试1JVM分析:s1和s2其实都是对字符串“aaa”的引用,s1和s2 都指向内存“aaa” ,当执行 s2="bbb" 时 s2 的地址指向“bbb” ,s1仍然指向“aaa”。

    测试2 JVM分析:p1和p2 都是对象P的引用,执行 p2.setN("bbb"); 时对象P 的属性 n 地址从“aaa” 指向到"bbb" ,

    所以执行 System.out.println(p1.getN());  打印出"bbb"。

     

      

      

      

      

      

  • 相关阅读:
    ionic localstorage
    angular 中文鏈接
    把jqmobi 變成jQuery 的插件 從此使用jQuery
    jqmobi 的一些設置
    ionic ngcordova map 地圖
    ionic pull to refresh 下拉更新頁面
    json 對象的序列化
    鍵盤彈出,頁面佈局被推上去了.....
    Cordova V3.0.0中config.xml配置文件的iOS Configuration
    android ios 只能輸入數字 不能輸入小數點的 函數 cordova
  • 原文地址:https://www.cnblogs.com/xujishou/p/java.html
Copyright © 2020-2023  润新知