字符串的声明与初始化主要两种: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. Statement

    题目大意 给定一棵基环外向树,和若干组询问,对于每次独立的询问都指定一些起点和一些终点,你删去一些边,使得从任意起点出发都无法到达终点,并让删去的边的编号的最小值最大,求这个最大的最小值. 题解 不难 ...

  2. .net Core 2.1 MVC+EF+Redis搭建

    官方学习资料 搭建空MVC框架 1.创建一个空模板 2.创建文件夹 Controllers.Models.Views 3.在Controllers文件夹下创建HomeController.cs 选择C ...

  3. L2-016 愿天下有情人都是失散多年的兄妹(25 分)

    呵呵.大家都知道五服以内不得通婚,即两个人最近的共同祖先如果在五代以内(即本人.父母.祖父母.曾祖父母.高祖父母)则不可通婚.本题就请你帮助一对有情人判断一下,他们究竟是否可以成婚? 输入格式: 输入 ...

  4. Java中Calendar/SimpleDateFormat/Date常用方法总结

    //获取当前时刻yyyy-MM-dd HH:mm:ss Calendar calendar = Calendar.getInstance(); SimpleDateFormat sdf = new S ...

  5. gulp安装简介

    1 全局安装gulp:npm install -g gulp 2 在项目根目录中,安装项目的开发依赖:npm install --save-dev gulp 2.1 根据gulpfile.js中的依赖 ...

  6. HDOJ2043(JAVAset容器练习)

    import java.io.PrintWriter; import java.util.HashSet; import java.util.Scanner; public class Main { ...

  7. smbpasswd和pdbedit

    samba用户管理: smbpasswd :smbpasswd命令属于samba套件,能够实现添加或删除samba用户和为用户修改密码. smbpasswd [options] USERNAME -a ...

  8. windows7下安装gem包---bcrypt-ruby

    在Gemfile中添加 gem 'bcrypt-ruby', '~> 3.0.0' 然后执行bundle install,rails服务启动没有问题,但是运行程序时页面报错如下: cannot ...

  9. Python-IO模式介绍

    事件驱动模型:有个事件队列,把事件放到队列里,然后循环这个队列,取出事件执行 5种IO模式: 阻塞 I/O(blocking IO) 非阻塞 I/O(nonblocking IO) I/O 多路复用( ...

  10. Mysql 数据库时间更新字段

    关于时间更新: 创建时间: CURRENT_TIMESTAMP 更新时间: 勾选根据时间戳更新