zoukankan      html  css  js  c++  java
  • Java 基础知识总结 (四、String)

    四、String

      public final class String extends Object implements Serializable, Comparable<String>, CharSequence

      String 类是final类,不能被继承。

      String 类代表字符串。Java程序中的所有字符串字面值(如“abc”)都作为此类的实例实现。

      字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。

    public class Test {
    	public static void main(String[] args) {
    		String str = "abc";
    		//等效于
    		char data[] = { 'a', 'b', 'c' };
    		String str2 = new String(data);
    	}
    }
    

      Java 语言提供对字符串串联符号("+")以及将其他对象转换为字符串的特殊支持。字符串串联是通过 StringBuilder(或 StringBuffer)类及其 append 方法实现的。字符串转换是通过 toString 方法实现的,该方法由 Object 类定义,并可被 Java 中的所有类继承。

      Constant Pool 常量池:

      常量池指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。除了包含代码中所定义的各种基本类型(如int、long等等)和对象型(String)的常量值(final)还包含一些以文本形式出现的符号引用,比如:类和接口的全限定名;字段的名称和描述符;方法的名称和描述符。

      虚拟机必须为每个被装载的类型维护一个常量池。常量池就是该类型所用到常量的一个有序集和,包括直接常量(string,integer和floating point常量)和对其他类型,字段和方法的符号引用。

      对于String常量,它的值是在常量池中的。而JVM中的常量池在内存当中是以表的形式存在的,

      对于String类型,有一张固定长度的CONSTANT_String_info表用来存储文字字符串值,注意:该表只存储文字字符串值,不存储符号引用。在程序执行的时候,常量池会储存在Method Area,而不是堆中。

      String字符串的本质:

      String字符串 = char[] + 操作(toUpperCase(),concat())。String的底层就是char[]数组,是char[]数组的封装类

      类: 数据+相关的操作。char数组只是数据, 没有操作

      String用来表示文本,即一系列 Unicode 字符。

      字符串是 Unicode 字符的有序集合,用于表示文本。所以String 对象是 System.Char 对象的有序集合,用于表示字符串。String 对象的值是该有序集合的内容,并且该值是不可变的。字符串本质是字符数组。

       String两种实例化方式

      采用直接赋值的方式进行对象的实例化;通过接收一个String类的对象,并重新实例化这个对象。

      1.直接使用“”双引号创建;      //编译时创建

      2.使用new String()创建;    //运行时创建

      3.使用new String("someString")创建以及其他重载构造函数创建;

      4.使用重载的字符串连接操作符“+”创建。

      String类的说明

      1.String使用private final char value[]来实现字符串的存储,String对象创建之后,就不能再修改此对象中存储的字符串内容。

      2.String类有一个特殊的创建方法,就是使用“”双引号来创建。

      3.Java对String类型重载了“+”操作符,可以直接使用“+”对两个字符串进行连接。

      4.运行期间调用String类的intern()方法可以向String Pool中动态添加对象。

        调用intern方法时,如果池中已经包含一个等于此String对象的字符串(通过equals(Object)方法确定),则返回池中的字符串。否则,将此String对象添加到池中,并且返回此String对象的引用。

    public class Test {
    	public static void main(String[] args) {
    		String str1 = "Hello";
    		String str2 = "Hello";
    		String str3 = new String("Hello");
    		String str4 = new String(str1);
    		System.out.println(str1 == str2); // true
    		System.out.println(str1 == str3); // false
    		System.out.println(str1 == str4); // false
    		System.out.println(str2 == str3); // false
    		System.out.println(str2 == str4); // false
    		System.out.println(str3 == str4); // false
    
    		str3 = str3.intern();
    		System.out.println(str1 == str3); // true
    
    		String str5 = "Hello" + "World";
    		String str6 = "HelloWorld";
    		System.out.println(str5 == str6); // true
    
    		String hello = "Hello", lo = "lo";
    		System.out.println(hello == "Hello"); // true
    		System.out.println(Other.hello == hello); // true
    		System.out.println(hello == ("Hel" + "lo")); // true	编译时创建 栈中
    		System.out.println(hello == ("Hel" + lo)); // false	运行时创建 堆中
    		System.out.println(hello == ("Hel" + lo).intern()); // true
    	}
    }
    

      

      

  • 相关阅读:
    MongoDB 集合上限说明
    MongoDB mtools-你可能没用过的mongodb神器(转载)
    Redis 你知道 Redis 的字符串是怎么实现的吗?(转载)
    Mongoimport 导数据自动去重
    MongoDB 数据类型
    MongoDB 数据类型整理
    MongoDB mongoimport 时间格式处理
    MongoDB 空值数组查询
    MongoDB WiredTiger 存储引擎cache_pool设计(转载)
    MongoDB运维实战lsm降低Disk Lantency(转载)
  • 原文地址:https://www.cnblogs.com/diaoyan/p/5239348.html
Copyright © 2011-2022 走看看