字符串在程序开发中无处不在,也是用户交互所涉及到最频繁的数据类型,那么字符串不仅仅就是我们简单的理解的String str = "abc";一起来更加深入的看一下

  在Java中,字符串被作为String类型的对象处理,和基本数据类型不同,字符串可以直接使用各种字符串对象的方法,而基本数据类型不行,String类位于java.lang包中,默认情况下该包会被自动的导入所有的应用程序

  String对象创建后不能被更改,是不可变的,我们重新赋值并不是修改了对象所引用的内存空间的数据,而是创建了新的对象,只是以前的对象指向了新的地址,所以随着字符串被重新赋值的次数越多,内存中无用的垃圾数据也会越来越多

  看下面一个简单的例子:

 public class HelloWorld {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "abc"; String s3 = "I love" + s1; // 比较字符串s1和s2
System.out.println("s1和s2内存地址相同吗?" + (s1 == s2)); //比较字符串s1和s3
System.out.println("s1和s3内存地址相同吗?" + (s1 == s3) ); String s4 = "I love " + s1;
//比较字符串s4和s3
// s1是变量,s4在运行时才知道具体值,所以s3和s4是不同的对象
System.out.println("s3和s4内存地址相同吗?" + (s4 == s3));
String s5 = new String("abcd");
String s6 = new String("abcd");
//比较s5和s6
String.out.println("s5和s6内存地址相同吗?" + (s5 == s6));
}
}

分析一下运行结果,首先知道==比较的是对象在内存中的地址,而不是引用的值,看s1和s2,因为s1和s2紧接着出现,所以编译器会进行优化,s1和s2会指向同一内存区域,所以s1 == s2返回true

对s3赋值 I love abc之后,s3是一个新的字符串对象,所以s1 == s3返回false

对s4赋值后,s4也是一个对象,虽然s3和s4的值相等,但是系统不会因为这个把它们指向同一内存地址,所以s3和s4是两个独立的对象,s3 == s4返回false

根据s1 == s2返回true,推测s5和s6也是紧接着出现,所以应该指向同一内存地址,其实不是,只要通过new关键字都会创建新的对象,尽管内容相同,所以s5 == s6返回false

  看一下String类常用的方法

  比如实例化String对象:String abc = "abc";就可以通过abc.方法()来调用指定的方法,常用的方法列表如下:

有几点需要注意一下:

1、字符串str的字符索引和数组一样从0开始,到str.length()-1

2、使用indexOf查找时,如果匹配则返回位置索引,如果找不到则返回-1

3、使用substring方法截取字符串时,包括beginIndex位置的字符串,不包括endIndex位置的字符串

4、比较两个字符串内容是否相等时,一定要用equals方法,不要用==来比较,前面说了==是比较两个字符串对象指向内存地址的首地址,但比较字符型等基本数据类型时可以用==比较值

字符串操作的方法有很多,这个需要多练习才可以加强记忆

  String类具有不可变的特性,当频繁操作字符串时,会产生很多额外的临时变量,所以使用StringBuilder或者StringBuffer可以避免这些问题

  StringBuffer是线程安全的,而StringBuilder没有实现线程安全,所以性能比StringBuffer高一些,一般情况下,创建一个内容可变的字符串对象,优先使用StringBuilder类,这个类常用的方法如下图:

简单使用方法如下:

 //创建StringBuilder对象
SrtingBuilder str = new StringBuilder("hello");
str.append("world");
System.out.println("str内容为:" + str + "长度为:" + str.length());
str.insert(5, ",");
str.insert(11, "!");
System.out.println("str内容为:" + str);

append方法是字符串后面追加一段字符串,和String对象不同,字符串更新后,原来内存地址不会被保留,这样就节省了内存空间

length方法和String一致

insert是在指定位置插入字符,比如str.insert(5, ",");是在索引位置5插入",",也可以理解为在原来的位置5之前放置一个","

toString方法可以把StringBuilder对象转换为String对象,程序中会多出一个对象,转换方式:String str2 = str.toString();

所以程序输出结果是:

str内容为:helloworld长度为:10

str内容为:hello,world!

对字符串对象的理解到这里

对Java中字符串的进一步理解的更多相关文章

  1. 三张图彻底了解Java中字符串的不变性

    转载: 三张图彻底了解Java中字符串的不变性 定义一个字符串 String s = "abcd"; s中保存了string对象的引用.下面的箭头可以理解为"存储他的引用 ...

  2. Java内存管理的进一步理解-模拟过程图解

    Java内存管理的进一步理解-模拟过程图解--转载 java的内存管理分为: 1.堆内存:2.栈内存:3.方法区:4.本地方法区 /* 1:方法区      方法区存放装载的类数据信息包括:      ...

  3. java中字符串的非空判断

    问题如下:在java 中 字符串为null 如何判断String str;if(str==null) ??str.equal("null") ?? 答:我觉得应该搞清楚字符串对象和 ...

  4. java中字符串String 转 int(转)

    java中字符串String 转 int String -> int s="12345"; int i; 第一种方法:i=Integer.parseInt(s); 第二种方法 ...

  5. 【转】Java中字符串中子串的查找共有四种方法(indexof())

    原文网址:http://wfly2004.blog.163.com/blog/static/1176427201032692927349/ Java中字符串中子串的查找共有四种方法,如下:1.int ...

  6. Java中字符串中子串的查找共有四种方法(indexof())

    Java中字符串中子串的查找共有四种方法(indexof()) Java中字符串中子串的查找共有四种方法,如下:1.int indexOf(String str) :返回第一次出现的指定子字符串在此字 ...

  7. JAVA中字符串函数subString的用法小结

    本篇文章主要是对JAVA中字符串函数subString的用法进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助 String str; str=str.substring(int begi ...

  8. Java中字符串的一些常见方法

    1.Java中字符串的一些常见方法 /** * */ package com.you.model; /** * @author Administrator * @date 2014-02-24 */ ...

  9. Java中字符串indexof() 的使用方法

    Java中字符串中子串的查找共有四种方法(indexof())indexOf 方法返回一个整数值,指出 String 对象内子字符串的开始位置.如果没有找到子字符串,则返回-1.如果 startind ...

随机推荐

  1. BZOJ-1854 游戏 二分图匹配 (并查集)

    1854: [Scoi2010]游戏 Time Limit: 5 Sec Memory Limit: 162 MB Submit: 3372 Solved: 1244 [Submit][Status] ...

  2. 找回Reshaprer的Alt+Enter快捷键的方法

    用过Reshaprer一段时间发现这个Visual Studio插件确实是个好东东,特别是神级快捷键Alt+Enter更是好用至极,可以解决大部分代码问题,不过会发现装上Reshaprer后VS自带的 ...

  3. dijkstra,SPFA,Floyd求最短路

    Dijkstra: 裸的算法,O(n^2),使用邻接矩阵: 算法思想: 定义两个集合,一开始集合1只有一个源点,集合2有剩下的点. STEP1:在集合2中找一个到源点距离最近的顶点k:min{d[k] ...

  4. android 开发问题:java.lang.ClassCastException

    java.lang.ClassCastException: libcore.net.http.HttpURLConnectionImpl cannot be cast to javax.net.ssl ...

  5. UVA1025---A Spy in the Metro(DP)

    http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=35913 Secret agent Maria was sent to Alg ...

  6. 类,抽象基类,接口类三者间的区别与联系(C++)

    结构上的区别: 普通类:数据+方法+实现 抽象类:数据+方法(一定包含虚方法n>=1)+部分方法的实现 接口类:方法(纯虚方法) http://www.cnblogs.com/Tris-wu/p ...

  7. MyEclipse修改项目名称后,部署到 tomcat问题

    问题描述: 修改项目名称后,部署到tomcat问题 解决方案: 项目->属性->myelcipse->web下,修 改web context root就可! 要在eclipse里面改 ...

  8. Fast-cgi cgi nginx php-fpm 的关系 (转

    Fast-cgi  cgi  nginx  PHP-fpm 的关系 Fast-cgi是由cgi发展而来,是http服务器(http,nginx等)和动态脚本语言(php,perl等)之间的的通信接口, ...

  9. SCI完全攻略:从构思到发表

  10. Hibernate3的DetachedCriteria支持

    Hibernate3支持DetachedCriteria,这是一个非常有意义的特性!我们知道,在常规的Web编程中,有大量的动态条件查询,即用户在网页上面自由选择某些条件,程序根据用户的选择条件,动态 ...