一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術(shù)及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - JAVA教程 - Java String創(chuàng)建對象實例解析

Java String創(chuàng)建對象實例解析

2021-03-30 11:39司馬懿字仲達 JAVA教程

這篇文章主要介紹了Java String創(chuàng)建對象實例解析,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下

本文研究的主要是Java String創(chuàng)建對象的問題,具體介紹如下。

首先我們要明白兩個概念,引用變量和對象,對象一般通過new在堆中創(chuàng)建,String只是一個引用變量。

所有的字符串都是String對象,由于字符串常量的大量使用,java中為了節(jié)省時間,在編譯階段,會把所有字符串常量放在字符串常量池中,字符串常量池的一個好處就是可以把相同的字符串合并,占用一個空間。

雖然在Java中無法直接獲取變量的地址,但是可以用==判斷一下兩個引用變量是否指向了一個地址即一個對象。

 

棧內(nèi)存 堆內(nèi)存
基礎(chǔ)類型,對象引用( 堆內(nèi)存地址 ) 由new 創(chuàng)建的對象和數(shù)組
存取速度快 相對于棧內(nèi)存較慢
數(shù)據(jù)大小在聲明周期必須確定 分配的內(nèi)存由java 虛擬機自動垃圾回收器管理。動態(tài)分配內(nèi)存大小
共享特性,棧中如果有字符串,則直接引用;如果沒有,開辟新的空間存入值 每new一次都在堆內(nèi)存中生成一個新的對象。不存在任何復用

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
package com.demo.test;
 
import java.lang.reflect.Field;
 
public class StringDemo {
 
  public static void main(String[] args) {
    //先在內(nèi)存中查找有沒有這個字符串對象存在,如果存在就指向這個字符串對象;
    String str1 = "abc";
    String str2 = "abc";
    /*
     public String toString() {
      return this;
     }
     */
    String str3 = "abc".toString();
    //不論內(nèi)存中是否已經(jīng)存在這個字符串對象,都會新建一個對象。
    String str4 = new String("abc");
    String str5 = new String("abc");
    String str6 = str5;
    String str7 = "a" + "b" + "c";
    String str8 = "a" + "b" + new String("c");
    //String是不可變字符串對象,StringBuilder和StringBuffer是可變字符串對象(其內(nèi)部的字符數(shù)組長度可變),StringBuffer線程安全,StringBuilder非線程安全
    String str9 = new StringBuilder().append("a").append("b").append("c").toString();
    String str10 = new StringBuffer().append("a").append("b").append("c").toString();
 
    System.out.println("--------> ==");
    System.out.println("---> 1");
    System.out.println(str1==str2);//true
 
    System.out.println("---> 3");
    System.out.println(str3==str1);//true
 
    System.out.println("---> 4");
    System.out.println(str4==str1);//false
    System.out.println(str4==str3);//false
    System.out.println(str4==str5);//false
    System.out.println(str4==str6);//false
 
    System.out.println("---> 7");
    System.out.println(str7==str1);//true
    System.out.println(str7==str3);//true
    System.out.println(str7==str4);//false
 
    System.out.println("---> 8");
    System.out.println(str8==str1);//false
    System.out.println(str8==str3);//false
    System.out.println(str8==str4);//false
    System.out.println(str8==str7);//false
 
    System.out.println("---> 9");
    System.out.println(str9==str1);//false
    System.out.println(str9==str3);//false
    System.out.println(str9==str4);//false
    System.out.println(str9==str7);//false
    System.out.println(str9==str8);//false
 
    System.out.println("---> 10");
    System.out.println(str10==str1);//false
    System.out.println(str10==str3);//false
    System.out.println(str10==str4);//false
    System.out.println(str10==str7);//false
    System.out.println(str10==str8);//false
    System.out.println(str10==str9);//false
 
    System.out.println("--------> equals");
    System.out.println(str1.equals(str4));//true
    System.out.println(str1.equals(str7));//true
    System.out.println(str1.equals(str8));//true
 
    System.out.println("--------> hashCode");
    /*
     hashCode計算公式: s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
      因此hashCode都是一樣的,而且是每次運行都一樣
     */
    System.out.println(str1.hashCode());//96354
    System.out.println(str2.hashCode());
    System.out.println(str3.hashCode());
    System.out.println(str4.hashCode());
    System.out.println(str5.hashCode());
    System.out.println(str6.hashCode());
    System.out.println(str7.hashCode());
 
    System.out.println("--------> normal change value");
    //String是不可變類,string只是指向堆內(nèi)存中的引用,存儲的是對象在堆中的地址,而非對象本身,給string賦值只是改變其引用對象而非對象本身
    str6 = "123";
    System.out.println(str5);//abc
    System.out.println(str6);//123
 
    System.out.println("--------> reflect change value");
    /*
     如果非要改變String的值,也不是不可行。只能使用反射了。
     public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
       // The value is used for character storage.
       private final char value[];
       ……
     }
    */
    str6 = str5;
    try {
      Field field = String.class.getDeclaredField("value");
//     Field field = str6.getClass().getDeclaredField("value");
      if(!field.isAccessible()) {
        field.setAccessible(true);
      }
      char[] value = (char[])field.get(str6);
      value[0] = '0';
      System.out.println(str5);//0bc
      System.out.println(str6);//0bc
    } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
      e.printStackTrace();
    }
 
    System.out.println("--------> obj.toString()");
    Object obj = new Object();
    /*
    public String toString() {
      return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
    */
    System.out.println(obj.toString());//java.lang.Object@15db9742
 
    String[] arr1 = {"0"};
    String[] arr2 = {"0"};
    System.out.println(arr1.equals(arr2));//false
  }
}

總結(jié)

  • 如果String指向的是一個字符串常量,那么會先在字符串常量池(棧)中查找,如果有就直接指向它;沒有則在字符串常量池中創(chuàng)建該常量,然后String指向該常量。
  • 如果String使用關(guān)鍵字new初始化,則會在堆中開辟固定的空間存放該字符串的值,然后String指向該常量。
  • 使用字符串常量拼接,由于表達式先計算右值,因此相當于將String指向一個新拼接好的字符串常量。同樣會在字符串常量池中查找,如果有就直接指向它;沒有則在字符串常量池中創(chuàng)建該常量,然后String指向該常量。但是如果拼接中存在使用new生成的字符串,則新的字符串就等價于使用new在堆中創(chuàng)建的一樣。
  • 修改String的值,只能改變String的指向,不會改變String指向的對象本身。如果非要改變指向的對象本身,可以使用反射。
  • 如果是數(shù)組,由于它是對象,那么equals只比較其數(shù)組指針地址,并不會去比較其中的元素是否相等。

以上就是本文關(guān)于Java String創(chuàng)建對象實例解析的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

原文鏈接:http://blog.csdn.net/chy555chy/article/details/52795984

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 性色老女人| 精品欧美小视频在线观看 | 久久精品国产亚洲AV天美18 | 亚洲视频中文字幕 | vod国产成人精品视频 | 久久无码AV亚洲精品色午夜麻豆 | www.亚洲天堂| 亚洲视屏在线观看 | 国产高清在线观看 | 激情六月丁香婷婷四房播 | 色先锋 影音先锋a 资源站 | 免费yjsp妖精com | 免费高清观看 | 和肥岳在厨房激情 | 韩日视频在线 | 久久99re热在线观看视频 | 超碰av| 日本免费精品 | 72张让男人一看就硬的图片 | 2048论坛永久入口 原创合集 | 99ri国产在线 | 无限在线观看免费入口 | 我把寡妇日出水好爽 | 亚洲网站在线播放 | 红楼梦黄色小说 | 亚洲视屏在线观看 | 精品国产一级毛片大全 | 午夜久| 99精品偷自拍 | 女人被男人躁得好爽免费视频 | 久久99国产亚洲高清观着 | 91精品国产亚洲爽啪在线影院 | 交换朋友夫妇3中文字幕 | 精品一区二区三区在线视频观看 | 欧美腐剧mm在线观看 | 91色爱 | 视频一区在线观看 | 百合漫画咱啪全彩抚慰 | 国产精品最新 | 国产精品俺来也在线观看了 | 日韩成人影视 |