四、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
}
}

  

  

Java 基础知识总结 (四、String)的更多相关文章

  1. java 基础知识(四)

    自己写一个简单的Map 清浅池塘 程序员,专栏:Java那些事儿唯一作者,咨询前请先点详细资料   130 人赞同了该文章 许多许多年以前,在自学Java的时候,笔者曾经写过一个简单的Map,当年很有 ...

  2. java基础知识(四)java内存机制

    Java内存管理:深入Java内存区域 上面的文章对于java的内存管理机制讲的非常细致,在这里我们只是为了便于后面内容的理解,对java内存机制做一个简单的梳理. 程序计数器:当前线程所执行的字节码 ...

  3. java基础知识拾遗(四)

    1.Runnable对象 启动线程:(new Thread(new MyRunnable()).start() 2.jsp中<%@ page language="java" ...

  4. 正则表达式、Calendar类、SimpleDateFormat类、Date类、BigDecimal类、BigInteger类、System类、Random类、Math类(Java基础知识十四)

    1.正则表达式的概述和简单使用 * A:正则表达式(一个字符串,是规则)     * 是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符串.其实就是一种规则.有自己特殊的应用. * B: ...

  5. Java基础知识陷阱(四)

    本文发表于本人博客. 今天我们来说说关于java继承以及反射有关的问题,大家先看下下面代码,试问可以编译通过不,为什么具体说说原因? public class Test{ public static ...

  6. JAVA基础知识(四):final关键字

    final关键字可以用于成员变量.本地变量.方法以及类. 2. final成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误. 3. 你不能够对final变量再次赋值. 4. 本地 ...

  7. Java基础知识陷阱系列

    Java基础知识陷阱系列 今天抽空把Java基础知识陷阱有关的文章汇总于此,便于大家查看. Java基础知识陷阱(一) Java基础知识陷阱(二) Java基础知识陷阱(三) Java基础知识陷阱(四 ...

  8. java基础知识回顾之---java String final类普通方法

    辞职了,最近一段时间在找工作,把在大二的时候学习java基础知识回顾下,拿出来跟大家分享,如果有问题,欢迎大家的指正. /*     * 按照面向对象的思想对字符串进行功能分类.     *      ...

  9. Java基础知识系列——String

    最近晚上没有什么事(主要是不加班有单身),就复习了一下Java的基础知识.我复习Java基础知识主要是依据Java API和The Java™ Tutorials. 今天是第一篇,复习了一下Strin ...

随机推荐

  1. C#中get和set的写法

    class program{ private string name; public string XXXXXX{ get{return name;} set{name=value;} } } 在C# ...

  2. 如何在IIS 7.5中部署Asp.Net MVC 5的网站

    0 Sign in to vote 系统是 windwos 2008 已经安装.Net 4.0 和 .Net 4.5 已经安装MVC4 的需要文件,MVC5 找不见下载地方,求各位大哥告知一下在哪里可 ...

  3. BufferedReader需要显示关闭

    BufferedReader reader = new BufferedReader(); …… reader.close(); BufferedReader需要显示关闭 解释: 方法调用结束后,这两 ...

  4. Node调试之道-----JSHint

    Node调试之道-----JSHint Node的优势我就不再乱吹捧了,它让javascript统一web的前后台成为了可能.但是对于新手来说,server端的JS代码可能不像client端的代码那么 ...

  5. Abstract和Virtual和interface , 派生类中重写 override / new关键字

    http://www.cnblogs.com/blsong/archive/2010/08/12/1798064.html C#中Abstract和Virtual 在C#的学习中,容易混淆virtua ...

  6. VS问题:该依赖项是由项目系统添加的,不能删除。

    该依赖项是由项目系统添加的,不能删除. 原因:是该项目添加对依赖项的引用时,不是直接引用的dll,而是通过“添加引用->项目”的方式引用的项目. 解决:删除“引用”目录下该依赖项的引用,然后通过 ...

  7. C#加密解密(DES,AES,Base64,md5,SHA256,RSA,RC4)

    一:异或^简单加解密(数字类型) 1:原理: 异或用于比较两个二进制数的相应位,在执行按位"异或"运算时,如果两个二进制数的相应位都为1或者都为0,则返回0;如果两个二进制数的相应 ...

  8. 45. Scramble String

    Scramble String Given a string s1, we may represent it as a binary tree by partitioning it to two no ...

  9. MVC 项目中为什么会有两个web.config

    我们对MVC 并不陌生, 在创建MVC项目时,总会发现,在工程目录 中有两个 web.config 文件,一个是在工程的根目录下,一是在 views 下,两个web.config 中的内容也不尽相同, ...

  10. mongodb转换List实体(去掉多余的字段) 批量添加

    Gson gson = new Gson(); String str = "list集合json字符串"; JsonObject object = gson.fromJson(st ...