精华内容
下载资源
问答
  • java打印string的地址
    千次阅读
    2021-10-03 17:24:36

    java是获取不到对象的地址的,但是你可以获取hashcode,对象的hashcode在某种意义上就相当于对象的地址了,hashCode是用来在散列存储结构中确定对象的存储地址的。

    既然Java中对象内存地址不能获取到,所以这篇文章就应该变为“Java中如何获取对象的真实hashCode,而不受hashCode()方法被覆盖的影响”,接着下文:

    Object的hashCode()默认是返回内存地址的,但是hashCode()可以重写,所以hashCode()不能代表内存地址的不同

    System.identityHashCode(Object)方法可以返回对象的内存地址,不管该对象的类是否重写了hashCode()方法。

    下面来验证:

    public class TestMem {
        public static void main(String[] args) {
            String s1 = "hello";
            String s2 = "world";
            String s3 = "helloworld";
            String s4 = s1+s2;
            System.out.println(s3==s4);
            System.out.println(s3.hashCode());
            System.out.println(s4.hashCode());
            System.out.println(System.identityHashCode(s3));
            System.out.println(System.identityHashCode(s4));
     
        }
    }

    结果:

    false
    -1524582912
    -1524582912
    1329552164
    363771819

    s3和s4的hashCode一样,但是内存地址不一样。

    由此可知,要想获取对象的内存地址应使用System.identityHashCode()方法

    更多相关内容
  • Java打印String对象的地址

    千次阅读 2022-04-15 18:07:20
    当使用System.out.println()方法打印String类型对象时,会输出String对象代表的字符串,并不会输出对象的地址。因此,我们必须借助其他API来实现该功能。 java.lang.System类的方法 public static native int ...

    一、System函数

    当使用System.out.println()方法打印String类型对象时,会输出String对象代表的字符串,并不会输出对象的地址。因此,我们必须借助其他API来实现该功能。

    java.lang.System类的方法

    public static native int identityHashCode(Object x);
    Returns the same hash code for the given object as would be returned by the default method hashCode(), whether or not the given object’s class overrides hashCode(). The hash code for the null reference is zero.
    Params: x – object for which the hashCode is to be calculated
    Returns: the hashCode

    无论给定对象的类是否覆盖hashCode(),返回给定对象的哈希码与默认hashCode()方法返回的哈希码相同。空引用的哈希码是零。默认hashCode()方法,即Object对象中的hashCode()方法

    public native int hashCode();
    As much as is reasonably practical, the hashCode method defined by class Object does return distinct integers for distinct objects. (This is typically implemented by converting the internal address of the object into an integer)

    在合理可行的情况下,由 Object 类定义的 hashCode() 方法为不同的对象返回不同的整数。 (通常将对象的内部地址转换为整数),也就是说Object类的hashcode()方法返回对象的地址。

    二、实现代码

    一般,被打印的对象的形式为:java.lang.Object@1ff9dc36,由全限定类名+@+十六进制数组成。

    为了打印的字符串对象的形式和一般形式相同,我们还需要使用另外两个方法,

    String.class.getName() 返回全限定类名java.lang.String;
    Integer.toHexString(int) 将十进制数转换为十六进制数并返回;

    代码如下及运行结果:
    在这里插入图片描述
    参考代码:

    public class StringObjectAddrTest {
    
        public static void main(String[] args) {
    
            String str = "HelloWorld";
            System.out.println(String.class.getName() + "@" + Integer.toHexString(System.identityHashCode(str)));
    
            // 与Object对比
            System.out.println(new Object());
        }
    
    }
    
    
    展开全文
  • 为什么String 的变量输出不是地址? 因为所有的类继承Object类,所以单独输出一个对象的时候,他会调用Object.toString,打印出来的...关于JavaString内存地址的问题。 在创建String类型的变量的时候建议使用直接赋值

    为什么String 的变量输出不是地址?
    因为所有的类继承Object类,所以单独输出一个对象的时候,他会调用Object.toString,打印出来的就是一串表达地址的字符串,最后调用的toString。
    在这里插入图片描述然而我们的String类里重写了toString(),它返回的是String自己,String是什么呢,String其实就是字符数组(),它内部封装了一个字符数组,所以打印字符串就是打印字符数组,而不是地址
    在这里插入图片描述
    关于Java中String内存地址的问题。
    在创建String类型的变量的时候建议使用直接赋值的方法去创建对象,在多个变量使用同一个字符串的时候,
    如果采用new 的方法的话,创建出来的对象是放在栈内存中,每个变量都会开辟出新的内存空间来完成储存,不管字符串是否一致。
    如果采用直接赋值的方式的话,字符串会放在常量池当中(常量池是堆内存中的一块特殊区域–常量池的位置变化在文末),不管创建多少个对象,都是引用的常量池的那个字符串,
    在这里插入图片描述
    两种方法相比较下来,直接赋值更加节省内存空间。

    (个人理解观点,如有错误,还请纠正。0.0)
    在6以及6版本以前 , 常量池是存放在了堆中 .
    在7版本中, 将常量池存放到了堆中
    在 8 版本之后, 取消了整个永久代区域,用元空间取代, 运行时常量池 和静态常量池存放在元空间中 , 而字符串常量池依然存放在堆中

    展开全文
  • javastring究竟占多少字节

    千次阅读 2021-02-12 13:35:49
    以前学java基础的时候考虑过string占多少字节,百度后有人说一个汉字占两个字节,所以一个string的字节数是可变的,遇到一个汉字+2,遇到一个字母+1。笔者对此结论严重怀疑,一个string在分配内存空间的过程中怎么...

    以前学java基础的时候考虑过string占多少字节,百度后有人说一个汉字占两个字节,所以一个string的字节数是可变的,遇到一个汉字+2,遇到一个字母+1。笔者对此结论严重怀疑,一个string在分配内存空间的过程中怎么可能会动态变化呢。笔者开始尝试测试string所占的字节数。

    一:首先想到的是通过string的getBytes方法测试其所占长度,是否与上述结论一致。

    请看下面代码:

    String  a="中国";

    System.out.println(a.getBytes().length);

    返回结果为6。

    这个结果与上述结论明显有出入,一个汉字占3个字节吗?显然不是这样的,因为一个char占两个字节,char是可以存放一个汉字的。getBytes方法只是将字符串转换为字节码,其转换关系在源码中可以找到,他是使用默认字符集将string转换为byte序列的,至于为啥每个汉字在getBytes的时候是3个,还请大神指教。

    二:通过outofmemory异常测试

    首先我们的电脑内存空间是有限的,所以如果定义一个数组的长度过长,一定会抛出outofmemory异常,每个人的整块内存空间应该是不一样的,所以笔者先测了下自己电脑上的最大整块内存空间,经多次调试,发现内存空间大小为1365966832字节。

    byte b[]=new byte[1365966832];

    这是一个临界值,再加1就会抛出outofmemory异常。大概1.3个G。

    同理测试,用string数组创建的话,临界值为341491708。

    上面的数除以下面的数等于4!故为4个字节。

    三:由于创建对象的初期,jvm虚拟机会把分配到的内存空间全部初始化为0(不包括对象头),其值为这些字段的数据类型对应的0值(引自深入理解java虚拟机),所以目前数组中的每个string还是null值(string对应的0值为null),那么根据最开始的可变理论,我们上述的结论还不够有说服力。我们开始为该数组赋值。

    String str[]=new String[341491708];

    for(int i=0;i

    str[i]="f";

    }

    System.out.println(str[0]);

    结果没有抛出异常,数组长度再大也可以。说明字节长度不变就是4个字节。

    四.有人可能会说,这样声明的字符串是被放到常量池里了,返回的只是个引用。ok我们利用最后零散的的内存空间new字符串出来。

    --------

    擦擦擦,刚刚死机了,感谢oschina的自动保存功能。。。

    --------

    String str[]=new String[341491708];

    for(int i=0;i

    str[i]=new String("f");

    if(i>996710){

    System.out.println(i);

    }

    }

    结果我的电脑不到100万就溢出了,换再长的字符串也一样。这里想亲手做实验的童鞋注意,之所以有个if判断才打印是因为打印很耗时,过滤掉前面没用的打印而已。

    综上所述string占4字节

    ----------------------------------------------------割割割割割割----------------------------------------

    以上论断是错的,具体原因应该与c语言的指针类型有关,现在笔者还有些东西没有想清楚,想清楚后会改,敬请期待~

    展开全文
  • JAVA打印数组的四种方法

    千次阅读 2021-06-10 20:44:41
    JAVA打印数组的四种方法探究 无聊看模块Integer.java源码时(IDEA中鼠标悬浮在Integer上按ctrl+alt 可以转到类源码),因为刚学java,想尝试着仿照python的方法打印数组: final int[] arr1 = {1,2,3,4,5}; System....
  • Java字符串String操作

    千次阅读 2021-02-12 15:41:35
    字符串查找str.indexOf(String s)返回的是搜索字符或字符串首次出现的位置,str.lastIndexOf(String s)返回的是搜索字符或字符串最后一次出现的位置,如果没有检索到字符串则返回-1。str.indexOf(String s)String ...
  • String s = new String("abc"); System.out.println(s); 这输出是s的内容,这明明是对象的引用啊,是地址啊 如果这样 Student student =new Student(); System.out.println(student);却打印地址
  • 打印对象和toString方法

    千次阅读 2021-03-15 16:19:43
    JAVA对象java对象是都是Object类的实例,都可直接调用... 6.2.1打印对象和toString方法先看下面程序:程序清单:codes/06/6-2/PrintObjectjavapublic classPrintObject{public static voidmain(String args[]){Person...
  • 1.String中的坑   最近看到一道关于string的面试题,差点让我以为string是值传递,就是下面这个例子,体验下: 1 2 3 4 5 6 7 8 9 10 11 12 ...
  • Java打印数组的几种方法

    千次阅读 2022-04-08 16:19:11
    Java打印数组的几种方法
  • 学习Java的小伙伴们有时候可能会碰到这么一些烦恼,写日期的时候代码一直报错,原因就是日期一直写的是字符串,在项目里就不能写成字符串了,必须把字符串类型转成日期类型,那Java中如何将字符串String转为日期类型...
  • java打印list中的元素

    千次阅读 2021-02-12 10:03:31
    该方法最终会调用java.util.AbstractCollection.toString()方法,遍历list中的元素方法2) System.out.println(Arrays.toString(list.toArray()));方法3)使用org.apache.commons.lang.builder.ToStringBuilder...
  • 我们给出了一个字符串数组,我们需要的是一个char [],即所有字符串中所有字符的数组 例如: 输入:[我,爱你] 输出:[i,l,o,v,e,y,o,u... 标签:java,arrays,string 来源: https://codeday.me/bug/20190928/1829263.html
  • 我们知道system.out.println(new XXX())可以打印出内存地址 我们看个例子: public class Test { public static void main(String[] args) { Test t = new Test(); System.out.println(t); 看下输出的结果: Test...
  • Java中去除String中空格的多种方法

    千次阅读 2021-07-14 12:36:15
    JavaString方法中确实有这样一个方法能够办到这件事,看来你和Java语言的设计者所见略同。前面提到的方法叫trim,知道这件事后,接下来就好办了。 我们来测试一下: String str = " hello world! this is right! ...
  • Java string类型转换成map代码实例

    千次阅读 2021-03-09 00:53:22
    Java string类型转换成map代码实例背景:有时候string类型的数据取出来是个很标准的key、value形式,通过Gson的可以直接转成map使用方式:Gson gson = new Gson();Map map = new HashMap();map = gson.fromJson(json...
  • JAVA byte类型转String类型

    千次阅读 2022-06-27 15:50:45
    RSA加密 byte类型转String类型,格式转换之后内容变了,解密解不出来
  • Java中将对象转换成String的三种方法

    万次阅读 2022-01-27 15:35:37
    String,toString,String.valueOf
  • Java String转成XML

    千次阅读 2020-02-25 16:27:33
    import java.io.StringReader; import java.io.StringWriter; import java.io.Writer; public class XmlFormatter { public String format(String unformattedXml) { try { final Document document = parseXml...
  • Javajava.lang.String类详解

    千次阅读 2019-10-22 23:45:22
    String类详解
  • JAVAString函数的20个方法详解

    万次阅读 多人点赞 2018-01-16 20:44:49
    系统类 String() 简介 ...只要是对字符串进行操作 都是返回的是一个新的字符串(原字符串不能更改)= ...String str1 = "wanglong";...字符串本身没有发生变化 而是引用地址发生了变化 相当于
  • Java 中 JSON 和String的相互转换

    千次阅读 2022-04-27 13:53:40
    json和string相互转换
  • java 打印例子(字符串换行问题)

    千次阅读 2021-03-04 06:12:12
    1.打印例子java打印中最关键的就是每一个绘图函数 g2.drawString(str, x, y ) 中的起点坐标(x,y)import java.awt.BasicStroke;import java.awt.Color;import java.awt.Component;import java.awt.Font;import java....
  • java打印数组常用的几种方法

    千次阅读 2021-04-19 17:19:19
    java打印数组常用的几种方法 1、使用 for 循环 最”朴实无华“的方法,却也是屡试不爽的方法,直接打印变量名不成,逐个遍历打印一定是可以的! int[] intArray = {1, 2, 3}; for(int i = 0; i < intArray.length...
  • Java String length()方法

    千次阅读 2020-07-13 12:44:52
    Java String length() function returns the length of the sequence of characters represented by this object. Java String length()函数返回此对象表示的字符序列的长度。 Java字符串长度 (Java String ...
  • 直接上代码 // An highlighted block String str = "å¤æ°”"; String newStr = new String(str.getBytes("ISO-8859-1"), "utf-8"); System.out.println(newStr ); 打印输出结果为:天气
  • JavaString 的相等比较(转)

    千次阅读 2019-03-17 00:16:17
    JavaString 的相等比较(转) 转载 地址:http://wenku.baidu.com/view/d223a71714791711cc791737.html 判断两个字符串是否相等的问题。在编程中,通常比较两个字符串是否相同的表达式是“==”,但在java中不能...
  • Java基础语法(九)——String

    万次阅读 多人点赞 2021-05-26 12:20:57
    一、创建字符串 创建字符串的方式有很多种,常见的构造 String 的方式如以下: 方式一:直接赋值法 方式二: new String() 方式三:创建一个字符数组ch,new String ( ch )
  • JavaString的next()和nextLine()方法

    千次阅读 2020-11-15 09:08:10
    java中,next()方法是不接收空格的,在接收到有效数据前,所有的空格或者tab键等输入被忽略,若有有效数据,则遇到这些键退出。 String s1 = input.next(); String s2 = input.next(); System.out.println(s1); ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 719,370
精华内容 287,748
关键字:

java打印string的地址