关于java中String类的问题

关于 java中string类不能用== 比较问题!大神进!~

s和s1引用的是同一个字符串对象.
其实,JAVA里面存在字符串池这个东西.
String s = "hello";String s1 = "hello";
这两句只会创建一个"hello"字符串放入串池里面,s和s1只是这个字符串的两个引用而已.

定义一个string类型的变量有两种方式:
string name= "tom ";
string name =new string( "tom ")
使用第一种方式的时候,就使用了串池,
使用第二中方式的时候,就是一种普通的声明对象的方式
如果你使用了第一种方式,那么当你在声明一个内容也是 "tom "的string时,它将使用串池里原来的那个内存,而不会重新分配内存,也就是说,string saname= "tom ",将会指向同一块内存

另外关于string类型是不可改变的问题:
string类型是不可改变的,也就是说,当你想改变一个string对象的时候,比如name= "madding "
那么虚拟机不会改变原来的对象,而是生成一个新的string对象,然后让name去指向它,如果原来的那个 "tom "没有任何对象去引用它,虚拟机的垃圾回收机制将接收它。

1、str1和st2分别指向不同的地址。创建一个String时,直接new对象(如new String("abc")),jvm会马上在内存堆中创建这个String对象,然后将该引用返回给变量。这与其他类一样。但是String还有一个特殊的创建方式(如String test = "abc"),此时,jvm首先会在内部维护的strings pool中通过String的 equels 方法查找是对象池中是否存放有该String对象,如果有,则返回已有的String对象给用户,而不会在heap中重新创建一个新的String对象;如果对象池中没有该String对象,jvm则在heap中创建新的String对象,将其引用返回给用户,同时将该引用添加至strings pool中。

2、hash值是一样的,为什么一样呢,我们来看下 String类的hashCode()方法:

public int hashCode() {
int h = hash;
        int len = count;
if (h == 0 && len > 0) {
    int off = offset;
    char val[] = value;

            for (int i = 0; i < len; i++) {
                h = 31*h + val[off++];
            }
            hash = h;
        }
        return h;
    }

通过代码可以看到,计算hash值用到的值,a、字符串长度,b、组成字符串的char[]。str1和str2的长度及组成的char[]完全一样,哈希值当然相等了。



标准的基本类型只要值相等,哈希值就相同;
Integer a=10;
Integer b=10;
那么a和b的哈希值就相同。类似的还有Short、Long、Byte、Boolean、String等等
如果容器的哈希值就不一样了,如List的哈希值是不一样的。对于List来讲,每一个元素都有它的顺序。如果被添加的顺序不同,最后的哈希值必然不同。Map虽然元素添加的顺序不一样,但是每一个元素的Key-Value值一样。Map是一种无序的存储结构,因此它的哈希值与元素添加顺序无关,这两个Map的哈希值相同。类似的,由于Set也是一种无序的存储结构,两个Set虽然添加元素的顺序不一样,但是总体来说元素的个数和内容是一样的。因此这两个Set的哈希值也相同。

HashCode的产生是根据值来产生的,与内存对应无关.所以相同的值会有相同的hashcode.其实你可以去看看hashcode的源码,就明白了

 public int hashCode() {
 int h = hash;
        int len = count;
 if (h == 0 && len > 0) {
     int off = offset;
     char val[] = value;
            for (int i = 0; i < len; i++) {
                h = 31*h + val[off++];
            }
            hash = h;
        }
        return h;
    }


String比较特殊,它有个专门的存储位置,在new的时候会先去内存里找,如果有就不会再创建了,而是把引用指向该地址

String的哈希值是根据字符串的值来进行计算的,只要字符串的值相同,哈希值肯定相同。
顺便说一下,哈希值在Java中,一般是用来在支持哈希算法的类如HashSet、HashMap等中用来快速寻找对象的。所以要求,如果两个对象的值(不是地址)相同,则其哈希值必须相同(当然你可以设计成不同,不会有任何地方报错,但上述的HashSet、HashMap等的运行会出现异常结果。例如在HashSet中,你刚放进去一个对象,再放同值的另一个对象时,会成功添加进去,而不是将原来的替换。)

首先应该明确一点 str1 和 str2 指向的地址是不同的每一次new 都会在堆中开辟一块内存用于存储数据,普通的Object类的hashcode方法返回这个对象在程序的唯一ID表示,但是String的hashcode返回的是根据string中的值计算出来的。。所以你可以看到不管你在几个程序中打印出来的hashCode都是一样的 你可以在任何时间打印下 new String(“a”).hashCode() 你会发现值都是97

是个选择题:在JAVA中,下面关于String类和StringBuffer类的描述正确...
答:StringBuffer s= new StringBuffer();s.toString就可以得到String类型 所以选A,给分吧 补充:可以直接将字符串“test”复制给声明的Stirng类 而不可以直接复制给StringBuffer类的变量,只有通过s.append(“test”)去给值 ,所以下面别人选C是错的。只有A是对的 ...

关于java中String类!!!
答:一、从根本上认识java.lang.String类和String池 首先,我建议先看看String类的源码实现,这是从本质上认识String类的根本出发点。从中可以看到:1、String类是final的,不可被继承。public final class String。2、String类是的本质是字符数组char[], 并且其值不可改变。private final char value[];然...

java中string类的方法有哪些?
答:\x0d\x0aintcompareTo(StringanotherString)\x0d\x0a按字典顺序比较两个字符串。\x0d\x0aintcompareToIgnoreCase(Stringstr)\x0d\x0a不考虑大小写,按字典顺序比较两个字符串。\x0d\x0aStringconcat(Stringstr)\x0d\x0a将指定字符串联到此字符串的结尾。\x0d\x0abooleancontains(CharS...

java中string类的方法有哪些?
答:boolean equalsIgnoreCase(String anotherString)将此 String 与另一个 String 进行比较,不考虑大小写。static String format(Locale l, String format, Object... args)使用指定的语言环境、格式字符串和参数返回一个格式化字符串。static String format(String format, Object... args)使用指定的格式字符...

java中String类型存储位置
答:一、new String都是在堆上创建字符串对象。当调用 intern() 方法时,编译器会将字符串添加到常量池中(stringTable维护),并返回指向该常量的引用。二、通过字面量赋值创建字符串(如:String str=”twm”)时,会先在常量池中查找是否存在相同的字符串,若存在,则将栈中的引用直接指向该字符串;...

string 是什么类型的?
答:string属于Java中的字符串类型,也是一个引用类型,并不属于基本的数据类型。Java中基本的数据类型只有八个,分别是数值型:byte、short、int、long;浮点型:float、double;字符型:char;布尔型:boolean。Java有字符串常量池机制,在声明字符串常量和字符串常量连接都需要使用到字符串常量池,如果字符串...

java中String是什么?
答:String他很特殊,Java为他单独设计了一些方法,你不要和其他类混淆!(是被Java封装好了的)知道构造原理以后,他其实也很简单,我先说特殊地方,就是双引号 String s="你好";此刻s指向的就是一个字符串对象,是对象!与你平时写的new很类似,只不过他这个对象放在常量池里面!你想想,有没有其他对象可以直接...

String包含在Java哪个包里
答:java的String类在lang包里。java.lang.String是java字符串类,包含了字符串的值和实现字符串相关操作的一些方法。常用方法包括:1、public boolean equals(Object obj)判断当前字符串与obj的内容是否相同2、public boolean equalsIgnoreCase(String str)判断当前字符串与str的内容是否相同,这个方法不会区分大小...

java中string是什么类型
答:Java 中 string 不属于基本的数据类型,只是代表一个类,是一个引用类型。String是引用类型,不过java有字符串常量池机制,声明字符串常量或者字符串常量连接都要用到字符串常量池。如果常量池中有该字符串序列则返回,所以str创建了一个字符串并放入常量池中,str2内的字符序列已在常量池中所以str2直接...

...>类型的东西是什么?如何将一个string类型的字符串增加到里面?_百度...
答:Set是集合的意思,是同种对象的集合,<String>说明这种对象都是String类型的对象。可以这样:Set<String> set = new HashSet<String>();String s1 = "hello";String s2 = "world";set.add(s1);set.add(s2);这样就添加了两个元素。

IT评价网,数码产品家用电器电子设备等点评来自于网友使用感受交流,不对其内容作任何保证

联系反馈
Copyright© IT评价网