深入剖析Java之String字符串

在程序开发中字符串无处不在,如用户登陆时输入的用户名、密码等使用的就是字符串。

在 Java 中,字符串被作为 String 类型的对象处理。 String 类位于 java.lang 包中。默认情况下,该包被自动导入所有的程序。

创建 String 对象有三种方法

String s1="我是字符串1";
String s2=new String();//创建一个空的字符串对象
String s3=new String("我是字符串2");//创建一个空的字符串对象

创建String对象要注意下面这个问题:

 //申明一个string类型的s1,即没有在申请内存地址,更没有在内存任何指向引用地址;
String s1;
//申明一个string类型的s2,同时在内存里申请了一个地址,但是该地址不指向任何引用地址;
String s2=null;
//申明一个string类型的s3,既在内存里申请了地址,该地址又指向一个引用该字符串的引用地址;
String s3="";
//同理s3;
String s4=new String();

虽然new String()与""值一样,但是内存地址不一样

一般来说 字符串的使用 最好用String str = "";语句,可以防止后面的程序因引用地址混乱而找不到的异常!String s = null;String s;劲量少用!能不用就不要使用!

String 字符串的不变性

String 对象创建后则不能被修改,是不可变的,所谓的修改其实是创建了新的对象,所指向的内存空间不同。如下所示:

 public static void main(String[] args) {
// TODO Auto-generated method stub
//分别给四个字符串变量赋值,相同的内容
String s1="云开的立夏";
String s2="云开的立夏";
String s3=new String("云开的立夏");
String s4=new String("云开的立夏"); //多次出现的字符串,java编译程序只创建一个内存空间,所以返回true
System.out.println(s1==s2);
//s1和s3是不同的对象,所以返回false
System.out.println(s1==s3);
//s3和s4是不同的对象,所以返回false
System.out.println(s3==s4); s1="欢迎来到"+s1+"的博客园";
//字符串s1被修改,指向新的内存空间,返回false
System.out.println(s1); System.out.println(s1==s2); }

运行结果:

结果分析:

结合上面的代码,和运行结果我们来逐一分析,为什么会出现这样的结果?String字符串的不变性又是如何体现的呢?

1、 通过 String s1="云开的立夏"; 声明了一个字符串对象, s1 存放了到字符串对象的引用,在内存中的存放引用关系如下图所示:

然后通过 s1="欢迎来到"+s1+"的博客园"; 改变了字符串 s1 ,其实本质是创建了新的字符串对象,变量 s1 指向了新创建的字符串对象,如下图所示:

2、 一旦一个字符串在内存中创建,则这个字符串将不可改变。如果需要一个可以改变的字符串,我们可以使用StringBuffer或者StringBuilder(我明天将会写一篇博文来讲解它们的使用,请关注哦~)。

3、 每次 new 一个字符串就是产生一个新的对象,即便两个字符串的内容相同,使用 ”==” 比较时也为 ”false” ,如果只需比较内容是否相同,应使用 ”equals()” 方法(前面条件运算符章节讲过哦~~)。

Java 中的 String 类常用方法 Ⅰ

String 类提供了许多用来处理字符串的方法,例如,获取字符串长度、对字符串进行截取、将字符串转换为大写或小写、字符串分割等,下面我们就来领略它的强大之处吧。

String 类的常用方法:

哇,String类的常用方法确实有多哦!死记硬背可是不行的,我们来结合代码来熟悉一下方法的使用:

 public static void main(String[] args) {
// TODO Auto-generated method stub
String str="学习 java 编程"; //打印字符串长度
System.out.println("字符串长度:"+str.length()); //查找字符‘编’的位置,如果找不到返回-1
char c='编';
System.out.println("字符‘编’的位置:"+str.indexOf(c));
System.out.println("字符‘b’的位置:"+str.indexOf('b'));
//查找字符串“java”的位置,如果找不到返回-1
System.out.println("字符串“java”的位置"+str.indexOf("java"));
System.out.println("字符串“云开的立夏”的位置"+str.indexOf("云开的立夏")); //按空格把字符串拆分成一个数组,并输出数组元素
String[] arr=str.split(" ");
System.out.print("按空格把字符串拆分成一个数组"+Arrays.toString(arr));
System.out.println();
//按,(字符串中不存在的)把字符串拆分成一个数组,并输出数组元素
String[] arr2=str.split(",");
System.out.print("按按,(字符串中不存在的)把字符串拆分成一个数组"+Arrays.toString(arr2));
System.out.println();
//按空格把字符串拆分成一个数组,并规定数组最大长度为2,并输出数组元素
String[] arr3=str.split(" ",2);
System.out.print("按空格把字符串拆分成一个数组,并规定数组最大长度为2:"+Arrays.toString(arr3));
System.out.println(); //获取索引位置[3,7)之间的子串
System.out.println("获取索引位置[3,7)之间的子串:"+str.substring(3, 7));
//获取索引位置3开始的子串
System.out.println("获取索引位置[3,7)之间的子串:"+str.substring(3)); }

运行结果:

结果分析:

1. 字符串 str 中字符的索引从0开始,范围为 0 到 str.length()-1

2. 使用 indexOf 进行字符或字符串查找时,如果匹配返回位置索引;如果没有匹配结果,返回 -1

3. 使用 substring(beginIndex , endIndex) 进行字符串截取时,包括 beginIndex 位置的字符,不包括 endIndex 位置的字符

4、使用String[] split(String regex, int limit)进行字符串拆分时,如果按字符串没有的字符分隔则不进行分隔,即返回长度为1的数组内容就是原来的字符串。

Java 中的 String 类常用方法 Ⅱ

我们继续来看 String 类常用的方法,如下代码所示:

     public static void main(String[] args) {
// TODO Auto-generated method stub
String str="学习 java 编程"; //将字符转换为大写
System.out.println("将字符转换为大写:"+str.toUpperCase());
//再讲字符串转换为小写
System.out.println("再讲字符串转换为小写:"+str.toLowerCase()); //获取位置为1的字符
System.out.println("获取位置为1的字符:"+str.charAt(1)); //将字符串转为byte[]数组,并打印输出
byte[] b=str.getBytes();
System.out.print("将字符串转为byte[]数组:"+Arrays.toString(b));
System.out.println(); //定义一个新的字符串,前后加上空格
String str2=" 学习 java 编程 ";
//返回除去前后空格的字符串
String str3=str2.trim();
System.out.println("返回除去前后空格的字符串:"+str3); //将str和str3字符串进行比较
System.out.println("str和str3的内存地址相同吗?:"+(str==str3));
System.out.println("str和str3的内容相同吗?:"+str.equals(str3)); } }

运行结果:

结果分析:

1.  ==: 判断两个字符串在内存中首地址是否相同,即判断是否是同一个字符串对象。

2.  equals(): 比较存储在两个字符串对象中的内容是否一致。

3. 汉字对应的字节值为负数,原因在于每个字节是 8 位,最大值不能超过 127,而汉字转换为字节后超过 127,如果超过就会溢出,以负数的形式显示。(关于编码,我会在后续的博文中讲解,小小期待哦~~)

注意:Object类中equal()方法比较的是对象的引用是否指向同一块内存地址,而String类中equals(): 比较存储在两个字符串对象中的内容是否一致。Object类中是equal()方法;String类中是equals(),差了一个s。

针对如此繁杂的方法,推荐大家一个学习技巧:好记性不如烂笔头!多看的同时一定要多敲哦~~


附一个完整的方法表:

SN 方法 描述
1 char charAt(int index)
返回指定索引处的字符
2 int compareTo(Object o)
该字符串的另一个对象比较
3 int compareTo(String anotherString)
字典顺序比较两个字符串
4 int compareToIgnoreCase(String str)
按字典顺序比较两个字符串,忽略大小写差异
5 String concat(String str)
将指定字符串添加到该字符串的结尾处
6 boolean contentEquals(StringBuffer sb)
当且仅当此String表示字符与指定StringBuffer的顺序相同时返回true
7 static String copyValueOf(char[] data)
返回表示所指定的数组中的字符序列的字符串
8 static String copyValueOf(char[] data, int offset, int count)
返回表示所指定的数组中的字符序列的字符串
9 boolean endsWith(String suffix)
测试此字符串是否以指定的后缀结束
10 boolean equals(Object anObject)
比较此字符串指定的对象
11 boolean equalsIgnoreCase(String anotherString)
这个字符串与另一个字符串比较,不考虑大小写
12 byte getBytes()
将此String使用平台默认的字符集的字节序列解码,并将结果存储到一个新的字节数组
13 byte[] getBytes(String charsetName)
将此String使用指定字符集的字节序列解码,并将结果存储到一个新的字节数组
14 void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
将这个字符串的字符复制到目标字符数组
15 int hashCode()
返回此字符串的哈希码
16 int indexOf(int ch)
返回此字符串指定字符第一次出现处的索引
17 int indexOf(int ch, int fromIndex)
返回此字符串指定字符,从指定索引的搜索中第一次出现处的索引
18 int indexOf(String str)
返回此字符串的指定子第一次出现处的索引
19 int indexOf(String str, int fromIndex)
返回此字符串的指定从指定索引处的子字符串第一次出现的索引
20 String intern()
返回字符串对象规范表示形式
21 int lastIndexOf(int ch)
返回此字符串指定字符最后一次出现处的索引
22 int lastIndexOf(int ch, int fromIndex)
返回此字符串指定字符最后一次出现处的索引,从指定索引处开始向后搜索
23 int lastIndexOf(String str)
返回此字符串指定子最右边出现处的索引
24 int lastIndexOf(String str, int fromIndex)
返回此字符串的指定子最后一次出现处的索引,指定索引处向后开始搜索
25 int length()
返回此字符串的长度
26 boolean matches(String regex)
判断此字符串是否与给定的正则表达式匹配。
27 boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len)

检测两个字符串区域是否是相等的
28 boolean regionMatches(int toffset, String other, int ooffset, int len)
检测两个字符串区域是否是相等的
29 String replace(char oldChar, char newChar)
返回从此字符串中使用newChar替换oldChar所有出现的字符串
30 String replaceAll(String regex, String replacement)
这个替换字符串使用给定的正则表达式匹配并替换每个子字符串
31 String replaceFirst(String regex, String replacement)
这个替换字符串使用给定的正则表达式匹配替换第一个字符串
32 String[] split(String regex)
围绕给定的正则表达式的匹配来拆分此字符串
33 String[] split(String regex, int limit)
围绕给定的正则表达式的匹配来拆分此字符串
34 boolean startsWith(String prefix)
测试此字符串是否以指定的前缀开始
35 boolean startsWith(String prefix, int toffset)
检测此字符串是否从指定索引开始以指定前缀开始
36 CharSequence subSequence(int beginIndex, int endIndex)
返回一个新的字符序列,它是此序列的子序列
37 String substring(int beginIndex)
返回一个新字符串,它是此字符串的子串
38 String substring(int beginIndex, int endIndex)
返回一个新字符串,它是此字符串的子串
39 char[] toCharArray()
 
这个字符串转换为一个新的字符数组
40 String toLowerCase()
 
将所有在这个字符串中的字符的使用默认语言环境的规则转为小写
41 String toLowerCase(Locale locale)
 
将所有在这个字符串中的字符使用给定Locale的规则转为小写
42 String toString()
这个对象(这已经是一个字符串!)本身返回。
43 String toUpperCase()
所有的字符在这个字符串使用默认语言环境的规则转换为大写。
44 String toUpperCase(Locale locale)
所有的字符在这个字符串使用给定的Locale规则转换为大写
45 String trim()
返回字符串的副本,开头和结尾的空白省略
46 static String valueOf(primitive data type x)
返回传递的数据类型参数的字符串表示

JAVA基础——重新认识String字符串的更多相关文章

  1. Java基础——数组应用之字符串String类

    字符串String的使用 Java字符串就是Unicode字符序列,例如串“Java”就是4个Unicode字符J,a,v,a组成的. Java中没有内置的字符串类型,而是在标准Java类库中提供了一 ...

  2. Java基础知识系列——String

    最近晚上没有什么事(主要是不加班有单身),就复习了一下Java的基础知识.我复习Java基础知识主要是依据Java API和The Java™ Tutorials. 今天是第一篇,复习了一下Strin ...

  3. java基础学习日志--String、StringBuffer方法案例

    package StringDemo; import java.util.Arrays; /* * 常用String.StringBufer类的方法 */ public class Demo1 { p ...

  4. 【JAVA - 基础】之String存储机制浅析

    本文主要解决以下几个问题 String源码解析? String和new String的区别? String通过"+"或concat累加时的对象创建机制? StringBuilder ...

  5. Java基础笔记之String相关知识

    (二)String Sring 被声明为 final ,因此不可被继承. String的不可变性: 看String的定义(java9版本): public final class String imp ...

  6. Java 基础 - 如何理解String不可变

    ref: https://www.zhihu.com/question/20618891 第一个答案. 扩展“ Java 基础 - System.arraycopy() 浅拷贝 深拷贝

  7. JAVA基础学习之String、StringBuffer、StringBuilder、基本数据类型的使用、整形进制转换、集合Collection、Vector、ArrayList、LinkedList、HashSet、TreeSet等(3)

    主函数类MainDemo.java package com.itcast.test20140109; import java.util.ArrayList; import java.util.Coll ...

  8. 【Java基础】关于String的总结

    String构造方法初始化和常量赋值初始化区别 下面的代码是一个String对象的两种不同的初始化方式,关于这两种不同初始化方式的区别,本文通过画内存图来进行解释,首先代码如下: public cla ...

  9. JAVA基础--常用类 String,StringBuffer, 基础数据类型包装类, Math类, Enum类

    字符串相关类: String, StringBuffer String类为不可变的字符序列 String s1="hello"; String s2="hello&quo ...

随机推荐

  1. zookeeper java api(使用java代码操作zookeeper)

    1 导入相关的pom依赖 <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId&g ...

  2. 数据预处理:PCA,SVD,whitening,normalization

    数据预处理是为了让算法有更好的表现,whitening.PCA.SVD都是预处理的方式: whitening的目标是让特征向量中的特征之间不相关,PCA的目标是降低特征向量的维度,SVD的目标是提高稀 ...

  3. js,javascript生成 UUID的四种方法

    全局唯一标识符(GUID,Globally Unique Identifier)也称作 UUID(Universally Unique IDentifier) . GUID是一种由算法生成的二进制长度 ...

  4. 136. Single Number唯一的一个只出现了一次的数字

    [抄题]: Given a non-empty array of integers, every element appears twice except for one. Find that sin ...

  5. 243. Shortest Word Distance 最短的单词index之差

    [抄题]: Given a list of words and two words word1 and word2, return the shortest distance between thes ...

  6. 通明讲JDBC(一)–认识JDBC

    本章记录了jdbc的简单使用方式! 0,jdbc的作用 1,jdbc入门准备工作 2,jdbc注册驱动 3,使用jdbc对数据库CRUD 0,jdbc的作用 与数据库建立连接.发送操作数据库的语句并处 ...

  7. 618F Double Knapsack

    传送门 题目大意 分析 代码 #include<iostream> #include<cstdio> #include<cstring> #include<s ...

  8. python文件处理os模块

    一.os模块概述 Python os模块包含普遍的操作系统功能.如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的.(一语中的) 二.常用方法 1.os.name 输出字符串指示正在使用的平台 ...

  9. 写一段php代码,确保报个进程同时写入同一个文件

  10. mvc json 日期问题的最简单解决方法

    1.首先编写BaseController这个类,需要引入Newtonsoft.Json.dll程序集 using System;using System.Collections.Generic;usi ...