字符串的声明与初始化主要两种:String s1=new String("abc");      或      String s2="abc";

String s1="abc";  //(1)在常量区里存放了一个"abc"字符串对象
String s2="abc"; //(2)s2引用常量区中的对象,不会创建新对象
String s3=new String("abc"); //(3)在堆中创建新对象
String s4=new String("abc"); //(4)在堆中又创建新对象

1.

JVM中存在着一个字符串池,其中保存着很多String对象,并且可以被共享使用。创建字符串常量 String s="abc";,会首先在字符串常量池中查找是否已经有相同的字符串被定义(由String类equals(Object obj)方法的返回值来判断)。若已经定义,则直接获取对其的引用,此时不需要创建新的对象;若没有定义,则首先创建这个字符串对象,然后把它加入到字符串池中,再将它的引用返回。

2.

new String("abc")会调用String类的构造函数public String(String original){},传入一个字符串常量,所以此语句相当于“abc”和new String()两个操作。若字符串常量池中不存在“abc”,则会创建一个字符串常量"abc",并将其添加到字符串池中;若存在,则不创建,然后new String()会在堆中创建一个新的对象(只要用到new总会生成新的对象),所以s3与s4指向的是堆中不同的String对象,地址也就不同。即两个内容相同的字符串对象"abc",它们在内存中的地址是不同的。

例:new String("abc")创建几个对象?

答:一个或两个。如果常量池中原来有"abc",那么只创建一个对象;如果常量池中没有字符串"abc",那么就会创建两个对象(一个常量区的"abc"字符串对象,一个在堆中new的String对象)。

3.

由于String是不可变类,一旦创建好了就不能被修改,因此String对象可以被共享而且不会导致程序的混乱。(不可变,就是其值不可变,如果想要拥有新值,只能再创建,开辟一块新的内存空间来存储。)

4.

String s;

s=null; //s是一个字符串类型的引用,它不指向任何一个字符串。

s=" ";   //s是一个字符串类型的引用,它指向另外一个字符串,这个字符串的值为" ",即空字符串。

5.

"=="运算符用来比较两个变量对应的内存中存储的数值是否相同。

String s=new String();  变量s占用一块存储空间,而new String()则存储在另一块存储空间里,此时,变量s对应内存中存储的数值是对象占用的那块内存的首地址。如果比较两个变量是否指向同一个对象,可以用"=="比较(看存储的地址值是否相同),但如果要比较两个对象的内容是否相等,那么"=="无法实现。(比如上图中的s3和s4,如果比较它俩是否指向同一个对象,可以用"==",但是要比较它俩分别对应的堆中的两个对象的内容值是否相同,就要用equals方法。)

equals是Object类提供的方法之一,每一个Java类都继承自Object类,所以每一个对象都具有equals方法。String类的equals方法是用于比较两个独立对象的内容是否相同,即堆中的内容是否相同。

例:String s1=new String("Hello");

String s2=new String("Hello");

两条new语句创建了两个对象,然后用s1、s2两个变量分别指向一个对象,这是两个不同的对象,它们的首地址是不同的,即a和b中存储的数值是不相同的,但两个对象中的内容是相同的。

所以,s1==s2会返回false,s1.equals(s2)会返回true。

如果s2=s1,s1==s2会返回true。

6.

Java中有5个类可以对字符或字符串进行操作:Character、String、StringBuffer、StringBuilder、StringTokenizer。

Character

用于单个字符操作。

String

用于字符串操作,属于不可变类,所以适合在需要被共享的场合中使用,如果用String保存一个经常被修改的字符串,会生成很多无用的对象,被垃圾回收器回收,影响程序性能,执行效率低。初始化方式:构造函数方式和赋值方式均可:String s=new String("world"); 或 String s="hello";

StringBuffer

字符串缓冲区,用于字符串操作,属于可变类,所以适合保存经常被修改的字符串,会比String少很多附加操作。初始化方式:只能使用构造函数方式:StringBuffer s=new StringBuffer("hello");

字符串修改的两种方式:

1.

String s="hello";

s+="world";

2.

StringBuffer s=new StringBuffer("hello");

String s1="world";

s.append(s1);

如果字符串修改次数多,StringBuffer要比String(第2种比第1种)运行效率高很多。

StringBuilder

字符串缓冲区,但不是线程安全的,如果只是在单线程中使用字符串缓冲区,那么StringBuilder的效率会更高些。所以,在只有单线程访问时可以使用StringBuilder,当有多个线程访问时,最好使用线程安全的StringBuffer。因为StringBuffer必要时可以对这些方法进行同步,所以任意特定实例上的所有操作好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。

在执行效率上,从高到低,依次是StringBuilder、StringBuffer、String。一般地,如果要操作的数据量比较小,优先使用String类;如果在单线程下操作大量数据,优先使用StringBuilder类;如果在多线程下操作大量数据,优先使用StringBuffer类。

StringTokenizer

分割字符串的工具类

import java.util.StringTokenizer;

public class Test {
public static void main(String[] args){
StringTokenizer s=new StringTokenizer("Hello my friends");
while (s.hasMoreTokens()) {
System.out.println(s.nextToken());
}
}
} //运行结果:
Hello
my
friends

Java基础笔记(十一)—— 字符串与数组的更多相关文章

  1. Java基础笔记(十)—— 数组

    数组是具有相同类型的数据的集合,是一种引用数据类型,一般具有固定的长度,并且在内存中占据连续的空间. 数组声明:数据类型[ ] 数组名;             数据类型 数组名[ ]; 如:int[ ...

  2. java基础笔记(4)----数组

    介绍: 数组是一种数据类型,是引用类型,是一块连续的内存空间,用于存储和管理相同类型的多个数据. 定义:-- > 数组的声明方式 先声明,在开辟内存空间--> int [] a; a=ne ...

  3. Java基础笔记 – Annotation注解的介绍和使用 自定义注解

    Java基础笔记 – Annotation注解的介绍和使用 自定义注解 本文由arthinking发表于5年前 | Java基础 | 评论数 7 |  被围观 25,969 views+ 1.Anno ...

  4. 【转】Java基础笔记 – 枚举类型的使用介绍和静态导入--不错

    原文网址:http://www.itzhai.com/java-based-notes-introduction-and-use-of-an-enumeration-type-static-impor ...

  5. Java基础-处理json字符串解析案例

    Java基础-处理json字符串解析案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 作为一名开发人员,想必大家或多或少都有接触到XML文件,XML全称为“extensible ...

  6. python3.4学习笔记(十一) 列表、数组实例

    python3.4学习笔记(十一) 列表.数组实例 #python列表,数组类型要相同,python不需要指定数据类型,可以把各种类型打包进去#python列表可以包含整数,浮点数,字符串,对象#创建 ...

  7. java基础-引用数据类型之一维数组(Array)

    java基础-引用数据类型之一维数组(Array) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数组的定义 1>.为什么需要数组 保存一个数据可以定义一个变量,如果要保 ...

  8. Java学习笔记之---方法和数组

    Java学习笔记之---方法与数组 (一)方法 (1)什么是方法? 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 (2)方法的优点 使程序变得更简短而 ...

  9. java基础知识点补充---二维数组

    #java基础知识点补充---二维数组 首先定义一个二维数组 int[][] ns={ {1,2,3,4}, {5,6,7,8}, {9,10,11,12}, {13,14,15,16} }; 实现遍 ...

  10. 075 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 07 综合案例-数组移位-主方法功能4的实现

    075 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 07 综合案例-数组移位-主方法功能4的实现 本文知识点:综合案例-数组移位-主方法功能4的实现 说明:因为 ...

随机推荐

  1. leetcode 1 Two Sum(查找)

    Given an array of integers, find two numbers such that they add up to a specific target number. The ...

  2. Git 部署 Web 网站

    /*************************************************************************** * Git 部署 Web 网站 * 说明: * ...

  3. C语言小程序(一)、判断三角型类型

    最近回炉重造C语言,陆续写一些比较短的代码,选择其中的一些贴到这里,都是在Linux下的代码,Windows未测试. 第一个判断三角形的类型,两个浮点型数据不能直接判断相等,为了输入方便一些,自己设置 ...

  4. 倍增模板orz

    #include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #i ...

  5. Error Domain=NSURLErrorDomain Code=-1202,Https服务器证书无效

    错误:“此服务器的证书无效.您可能正在连接到一个伪装成“www.xxxxxx.com”的服务器, 这会威胁到您的机密信息的安全 原因:安全证书是自建证书,没有得到认证. 解决方法: 1.导入NSURL ...

  6. Android 开发:开源库Speex支持arm64的动态库文件

    随着处理器制造工艺的不断进步,和Android系统的不断发展,最近出了arm64-v8a的架构,由于项目中用到了speex的第三方语音编解码的动态库,其他架构的处理器暂不用说,一切正常,唯独到arm6 ...

  7. JSP介绍(4)--- JSP Cookie 处理

    Cookie是存储在客户机的文本文件,它们保存了大量轨迹信息. JSP脚本通过request对象中的getCookies()方法来访问这些cookie,这个方法会返回一个Cookie对象的数组. 通常 ...

  8. Python模块-logging模块(二)

    logging模块记录日志有四个主要类:logger,handler,formatter,filter logger提供了应用程序可以直接使用的接口,每个程序在输出信息之前都要获得一个Logger h ...

  9. NEKOGAMES

    http://bbs.3dmgame.com/thread-4133434-1-1.html

  10. [poj1088]滑雪(二维最长下降子序列)

    解题关键:记忆化搜索 #include<cstdio> #include<cstring> #include<algorithm> #include<cstd ...