字符串的声明与初始化主要两种: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. php实现多文件上传和下载。

    http://1229363.blog.163.com/blog/static/19743427200751291055264/

  2. freeMarker(十一)——模板语言之指令

    学习笔记,选自freeMarker中文文档,译自 Email: ddekany at users.sourceforge.net 1.assign 概要 <#assign name1=value ...

  3. 2017.10.1北京清北综合强化班DAY1

    a[问题描述]你是能看到第一题的 friends 呢.——hja何大爷对字符串十分有研究,于是天天出字符串题虐杀 zhx. 何大爷今天为字符串定义了新的权值计算方法.一个字符串 由小写字母组成,字符串 ...

  4. 洛谷【P1619】 解一元二次方程的烦恼

    我对模拟的理解:https://www.cnblogs.com/AKMer/p/9064018.html 题目传送门:https://www.luogu.org/problemnew/show/P16 ...

  5. fastjson 使用笔记

    1.string转json String params={'key1':'50001','key2':10007700'}Map<String, String> a = JSON.pars ...

  6. flume+kafka+storm+mysql架构设计

    前段时间学习了storm,最近刚开blog,就把这些资料放上来供大家参考. 这个框架用的组件基本都是最新稳定版本,flume-ng1.4+kafka0.8+storm0.9+mysql (项目是mav ...

  7. JavaScript-Tool:pluload

    ylbtech-JavaScript-Tool:pluload Plupload是用于处理文件上传的JavaScript API,支持多文件选择.文件类型过滤.请求分块.客户端图像缩放等功能,使用不同 ...

  8. 杂项-JS:artTemplate.js

    ylbtech-杂项-JS:artTemplate.js artTemplate 是新一代 javascript 模板引擎,它采用预编译方式让性能有了质的飞跃,并且充分利用 javascript 引擎 ...

  9. HTTP 2 VS HTTP 1.1

    提升H5应用加载速度的方式有很多,比如缓存.cdn加速.代码压缩合并和图片压缩等技术. 今天介绍的是HTTP 2.0

  10. HTTP之首部

    http报文包括起始行.首部和主体.     HTTP请求/响应起始行 请求组成: 方法 + 请求URL + HTTP版本 响应组成: HTTP版本 + 数字状态码 + 描述状态的原因短语    HT ...