对Java中字符串的进一步理解

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

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

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

  看下面一个简单的例子:

 1 public class HelloWorld {
 2     public static void main(String[] args) {
 3         String s1 = "abc";
 4         String s2 = "abc";
 5
 6         String s3 = "I love" + s1;
 7
 8                  // 比较字符串s1和s2
 9         System.out.println("s1和s2内存地址相同吗?" + (s1 == s2));
10
11                 //比较字符串s1和s3
12         System.out.println("s1和s3内存地址相同吗?" +  (s1 == s3)               );
13
14         String s4 = "I love " + s1;
15                 //比较字符串s4和s3
16         // s1是变量,s4在运行时才知道具体值,所以s3和s4是不同的对象
17         System.out.println("s3和s4内存地址相同吗?" + (s4 == s3));
18                 String s5 = new String("abcd");
19                 String s6 = new String("abcd");
20                 //比较s5和s6
21                 String.out.println("s5和s6内存地址相同吗?" + (s5 == s6));
22     }
23 }

分析一下运行结果,首先知道==比较的是对象在内存中的地址,而不是引用的值,看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类,这个类常用的方法如下图:

简单使用方法如下:

1 //创建StringBuilder对象
2 SrtingBuilder str = new StringBuilder("hello");
3 str.append("world");
4 System.out.println("str内容为:" + str + "长度为:" + str.length());
5 str.insert(5, ",");
6 str.insert(11, "!");
7 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!

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

时间: 2024-10-19 04:37:50

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

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

Java内存管理的进一步理解-模拟过程图解--转载 java的内存管理分为: 1.堆内存:2.栈内存:3.方法区:4.本地方法区 /* 1:方法区      方法区存放装载的类数据信息包括:      (1):基本信息:      1)每个类的全限定名       2)每个类的直接超类的全限定名(可约束类型转换)      3)该类是类还是接口      4)该类型的访问修饰符      5)直接超接口的全限定名的有序列表      (2):每个已装载类的详细信息:      1)运行时常量池:

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

原文网址:http://wfly2004.blog.163.com/blog/static/1176427201032692927349/ Java中字符串中子串的查找共有四种方法,如下:1.int indexOf(String str) :返回第一次出现的指定子字符串在此字符串中的索引. 2.int indexOf(String str, int startIndex):从指定的索引处开始,返回第一次出现的指定子字符串在此字符串中的索引. 3.int lastIndexOf(String st

Java中字符串比较时==和equals的区别

==是比较两个字符串引用的地址是否相同,即是否指向同一个对象,而equals方法则比较字符串的内容是否相同. 例如String a = "abc"; String b = "abc"; a == b返回true,a.equals(b)同样返回true,这是为什么呢? 原来程序在运行时有一个字符串池,创建字符串时会先查找池中是否有相应的字符串,如果已经存在的话只需把引用指向它即可,如果没有则新建一个. 上例中创建a时,会在字符串池中首先创建一个"abc&qu

Java中字符串对象

Java中字符串对象创建有两种形式,一种为字面量形式,如String str = "droid";,另一种就是使用new这种标准的构造对象的方法,如String str = new String("droid");,这两种方式我们在代码编写时都经常使用,尤其是字面量的方式.然而这两种实现其实存在着一些性能和内存占用的差别.这一切都是源于JVM为了减少字符串对象的重复创建,其维护了一个特殊的内存,这段内存被成为字符串常量池或者字符串字面量池. 工作原理 当代码中出现字

java中字符串String 转 int(转)

java中字符串String 转 int String -> int s="12345"; int i; 第一种方法:i=Integer.parseInt(s); 第二种方法:i=Integer.valueOf(s).intValue(); 这两种方法有什么区别呢?作用是不是一样的呢?是不是在任何下都能互换呢? int -> String int i=12345; String s=""; 第一种方法:s=i+""; 第二种方法:s=

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

Java中字符串中子串的查找共有四种方法(indexof()) Java中字符串中子串的查找共有四种方法,如下:1.int indexOf(String str) :返回第一次出现的指定子字符串在此字符串中的索引. 2.int indexOf(String str, int startIndex):从指定的索引处开始,返回第一次出现的指定子字符串在此字符串中的索引. 3.int lastIndexOf(String str) :返回在此字符串中最右边出现的指定子字符串的索引. 4.int las

Java中字符串与日期之间的转换

项目过程中,经常遇到需要字符串格式的日期和Date类型的日期之间的相互转换.使用SimpleDateFormat类,可以方便完成想要的转换. SimpleDateFormat能够实现本地化的时间格式化及转换.从选定一个自定义的模式(pattren)开始,模式由已经定义好的 'A' to 'Z' 及 'a' to 'z'字母组成,也可以在模式中引入文本,但要使用’(单括号)括住.下图就是已经定义好的模式字母表: Letter Date or Time Component Presentation

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

Java中字符串中子串的查找共有四种方法(indexof()) indexOf 方法返回一个整数值,指出 String 对象内子字符串的开始位置.如果没有找到子字符串,则返回-1.如果 startindex 是负数,则 startindex 被当作零.如果它比最大的字符位置索引还大,则它被当作最大的可能索引. Java中字符串中子串的查找共有四种方法,如下:1.int indexOf(String str) :返回第一次出现的指定子字符串在此字符串中的索引. 2.int indexOf(Stri

Java中线程同步的理解 - 其实应该叫做Java线程排队

Java中线程同步的理解 我们可以在计算机上运行各种计算机软件程序.每一个运行的程序可能包括多个独立运行的线程(Thread). 线程(Thread)是一份独立运行的程序,有自己专用的运行栈.线程有可能和其他线程共享一些资源,比如,内存,文件,数据库等. 当多个线程同时读写同一份共享资源的时候,可能会引起冲突.这时候,我们需要引入线程"同步"机制,即各位线程之间要有个先来后到,不能一窝蜂挤上去抢作一团. 同步这个词是从英文synchronize(使同时发生)翻译过来的.我也不明白为什么