文档章节

Java 复习 —— String

learn_more
 learn_more
发布于 2015/08/12 10:39
字数 736
阅读 48
收藏 4


1、String的实例过程

    Java字符串的维护就是一个享元模式的具体体现,我们知道String的实例有两种方式分别是:

String str =  "hello world";
String str2 = new String("hello world");

    其中前者字面量的方式具体流程是这样的:首先查找 String Pool(栈)中是否有“hello world”,如果不存在,那会在String Pool中创建一个“hello world”,同时将这个对象的引用返回给str;如果String Pool中存在,那么直接获取String Pool中的值返回;

    后者new一个的对象的具体流程是这样的:首先查找 String Pool中是否有“hello world”,如果不存在,那么同样在String Pool中创建一个,然后去堆(Heap)中创建一个“hello world”对象,并且把堆中的引用返回给str2;如果String Pool中存在了这个对象,那么,跳过String Pool中创建,而是直接在堆中去创建一个“hello world”然后把引用返回。

    通过以上就会明白:

为什么

"hello world" == "hello world" 为 true ;

但是 

new String("hello world") == new String("hello wrold") 为 false;

同时 

"hello world" == new String("hello world") 也为false;

    另外,String Pool 就是一个字符串的享元工厂,字面量的方式就是一个享元工厂模式。大家都知道StringBuffer的性能要好过 String,StringBuilder的性能要好过StringBuffer,可是为什么还要用String呢?原因就在这里,他们说的性能是字符串 修改的时候,而真正字符的基本操作,以及字符串从系统中获取的时候,String是最快的,维护的对象也最少。


2、String的相等判断

    String 重写了equals方法,Object的equals方法是直接比较两个对象的地址,所以使用在字符串上比较意义不是很大,想要判断两个字符串的是否相同,我们应该这样判断,采用重写的equals方法。具体代码如下:

     public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = count;
        if (n == anotherString.count) {
        char v1[] = value;
        char v2[] = anotherString.value;
        int i = offset;
        int j = anotherString.offset;
        while (n-- != 0) {
            if (v1[i++] != v2[j++])
            return false;
        }
        return true;
        }
    }
    return false;
    }

3、String 其他注意事项

1)、字符串没有属性暴露,内部有属性一般是私有而且final类型的;比如offset、count、value;

2)、字符串重写了equals方法,那么也一定后重写了hashcode方法;

3)、字符串不能被继承是因为他是一个final类型的类;

4)、字符串内容不能更改是因为内部使用一个final类型的char数组存储,所以不能改变;

5)、字符串的优势在于他的速度,因为他的设计是一种享元设计模式。


© 著作权归作者所有

learn_more
粉丝 93
博文 240
码字总数 210196
作品 0
深圳
程序员
私信 提问
Java程序员从笨鸟到菜鸟之——总结和声明

前段时间经过大约二十天的时间把javaSE的内容总结了一下,最近由于个人原因和一些乱七八糟的事情,一直没在更新,首先感谢那些一如既往支持我的朋友。最近不知道为什么,一直很懒,做东西也一...

长平狐
2012/11/12
98
0
为什么用 Java—— 一个 Python 程序员告诉你

来源:董老师在硅谷 这篇文章专门给程序员写的,普通读者慎入。原作者:Kevin Sookocheff 译者:Celia Zhen,原文点击文末链接。 每当我告诉别人我一直在用Java工作时,大家的反应都是: “纳...

oschina
2016/03/19
59.2K
84
jvm内存模型-深入理解jvm

  最近学习了周志明老师的《深入理解Java虚拟机》,收获颇多,留下一些学习笔记,供以后复习用。   JVM定义了若干个程序执行期间使用的数据区域。这个区域里的一些数据在JVM启动的时候创...

Swen_9826
2018/08/09
0
0
Java开发每日复盘2018_0515

今天跟大家分享几个Java小细节: 【1】「for each循环的写法」 【2】「常量 final 写法细节」 【3】「类型转换之String转其他」 下面我们来一个一个说: 【1】「for each循环的写法」 Java中:...

ZeroOSTalk
2018/05/16
0
0
java 私塾JDBC笔记整理

java 私塾JDBC笔记整理 一.JDBC是什么? Java DataBase Connection(类似于IO). 二.JDBC怎样实现传输? JDBC利用Driver来连接不同的数据库。如Oracle, SQL Server, MySql , DB2. Driver(驱动)...

luodis
2011/03/03
252
0

没有更多内容

加载失败,请刷新页面

加载更多

马蜂窝 IM 系统架构的演化和升级

今天,越来越多的用户被马蜂窝持续积累的笔记、攻略、嗡嗡等优质的分享内容所吸引,在这里激发了去旅行的热情,同时也拉动了马蜂窝交易的增长。在帮助用户做出旅行决策、完成交易的过程中,I...

马蜂窝技术
30分钟前
2
0
C++学习笔记:C/C++中static关键词有用途

C语言中:static关键词有三种用途 1.静态局部变量 特点: 该变量在全局数据区分配内存(局部变量在栈区分配内存) 静态局部变量在程序执行到该对象的声明处时被首次初始化,以后不会再进行初...

StupidZhe
30分钟前
2
0
Mysql Group Replication关闭和启动所有的组成员的注意点

Mysql Group Replication关闭和启动所有的组成员的注意点 2018年05月17日 11:45:02 zuozhiji 阅读数 1772 由于的我mgr建立在虚拟机上面(即使是正式环境,如果计划内的停机或者断电都需要关闭...

rootliu
34分钟前
2
0
并发模式与 RPS 模式之争,性能压测领域的星球大战

本文是《如何做好性能压测》系列专题分享的第四期,该专题将从性能压测的设计、实现、执行、监控、问题定位和分析、应用场景等多个纬度对性能压测的全过程进行拆解,以帮助大家构建完整的性能...

阿里云官方博客
35分钟前
2
0
iTOP-4412开发板基于Linux-C测试程序的编译和运行

iTOP-4412 开发板可以运行的文件系统很多,在具体的文件系统上实现特定功能前,可 以使用 Linux-C 程序来测试硬件以及驱动。而且这些程序很容易移植到 Android、Qt/E 以及 最小文件系统上。 ...

书白
36分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部