zoukankan      html  css  js  c++  java
  • Java中的String数据类型

         本文主要是说明一些String数据类型的基本知识,有些杂乱,不过都是比较重要的东西,主要是参考了网上人的资料。原文网址:http://dev.yesky.com/91/2309091.shtml

      主要是一下几点:

      1、String是不属于8中基本数据类型的,String是一个对象。

          这里补充下JAVA的8种基本数据类型:基本类型分为三类,字符型(char)、布尔型(boolean)、数值型(byte、short、int、long、float、double)。这里数值型又可以分为两种,整数型(int、short、long)和浮点型(float、double)。JAVA中数值类型不存在无符号的,他们的取值范围是固定的,不会随机器硬件环境或者操作系统的改变而改变。

          对象的默认值是null,所以String的默认值也是null。但它又是一种独特的对象,有自己独特的一些性质。

          2.new String()和new String("");都是声明一个空串,这是要注意声明的是空串而不是null。

          3.String str1="hello"; 和String str2= new String("hello");的区别:

      这里不去谈堆也没有涉及栈,只是先简单引入常量池的概念。常量池(constant pool)指的是在编译期间被确定,并被保存在已编译的.class文件中的一些数据,包括了类、方法、接口等的常量,也包括字符串常量。下面有两个例子:

    1 String s0=”kvill”; 
    2 String s1=”kvill”; 
    3 String s2=”kv” + “ill”; 
    4 System.out.println( s0==s1 ); 
    5 System.out.println( s0==s2 );

    这里输出结果为:

    true 
    true

    解释下,java确保一个字符串常量只有一个拷贝,在例子中,s0和s1中的“kvill”都是字符串常量,在编译期就确定了,所以s0==s1为true。对于s2,“kv”和“ill”都是常量,当一个字符串常量由多个字符串常量相加得到时,它本身也是字符串常量。所以s2在编译期就被解析为一个字符串常量而得以确定,所以我们可以得出s0==s1==s2。但是用new String("kvill')建立的字符串不是一个常量,所以由new String()创立的字符串不放到常量池中。他们有各自的地址空间。

      

      4.String中的intern()函数。

      存在于.class文件中的常量池,在运行期被JVM装载,并且可以扩充。String的intern()方法就是扩充常量池的一个方法;当一个String实例str调用intern()方法时,Java查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用,如果没有,则在常量池中增加一个Unicode等于str的字符串并返回它的引用。

    下面看例子:

     1 String s0= “kvill”; 
     2 String s1=new String(”kvill”); 
     3 String s2=new String(“kvill”); 
     4 System.out.println( s0==s1 ); 
     5 System.out.println( “**********” ); 
     6 s1.intern(); 
     7 s2=s2.intern(); //把常量池中“kvill”的引用赋给s2 
     8 System.out.println( s0==s1); 
     9 System.out.println( s0==s1.intern() ); 
    10 System.out.println( s0==s2 );

    输出的结果为:

    false 
    ********** 
    false //虽然执行了s1.intern(),但它的返回值没有赋给s1 
    true //说明s1.intern()返回的是常量池中”kvill”的引用 
    true

      5.String是不可变的。

      String的实例一旦生成就不会再改变了,比如说:String str=”kv”+”ill”+” “+”ans”; 就是有4个字符串常量,首先”kv”和”ill”生成了”kvill”存在内存中,然后”kvill”又和” “ 生成 ”kvill “存在内存中,最后又和生成了”kvill ans”;并把这个字符串的地址赋给了str,就是因为String的“不可变”产生了很多临时变量,这也就是为什么建议用StringBuffer的原因了,因为StringBuffer是可改变的。

      综上,就是java中对String的一些理解。主要是参考的文章开头的链接那篇文章,有些东西我还没接触到,比如java虚拟机,所以对一些东西还是不懂得,准备看看这方面的书,有些人推荐这类书了。只是一直没看,得抓紧加油好好学习了!

  • 相关阅读:
    python requests 上传excel数据流
    No module named 'requests_toolbelt'
    code
    pytest 打印调试信息
    python3 获取日期时间
    Java单元测试之JUnit篇
    The import junit cannot be resolved解决问题
    什么是索引
    python3 ini文件读写
    js 测试题
  • 原文地址:https://www.cnblogs.com/Pillar/p/4206225.html
Copyright © 2011-2022 走看看