字符串

字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,在程序中所有的双引号字符串,都是String类的对象。

字符串的特点

1、字符串的内容永不可变。

2、正在是因为字符串的不可变,所以字符串是可心共享使用的。

3、字符串效果上相当于是char[]字符数组,但是底层其实是byte[]字节数组。

创建字符串

创建字符串一共有两种比较常用的方法,两种常用的方法。

第一种常用的方法

直接在等号后面加上一字符串的常量。

    String str = "Hello World!";
System.out.println("第一种常用的创建方法:" + str);
//输出的结果:第一种常用的创建方法:Hello World!

第二种常用的方法

用String类的无参构造方法。

    String str = new String();
System.out.println("第二种常用的的创建方法:" + str);
//输出的结果:第二种常用的创建方法:(后面是空,没有值的)

第一种不常用的方法

用String类的有参构造方法。【public String(char[])】

    char[] arrch = {'老', '酒','馆','的','锅'};
String str = new String(arrch);
System.out.println("第一种不常用的创建方法:" + str);
//输出的结果:第一种不常用的创建方法:老酒馆的锅

第二种不常用的方法

用String类的有参构造方法。【public String(byte[])】

    byte[] arrbyte = {97, 98, 99}; //里面的数字,是对照ASCII表的
String str = new String(arrbyte);
System.out.println("第二种不常用的创建方法:" + str);
//输出的结果:第二种不常用的创建方法:abc

上面的所有加上引号的字符串,都是一个String对象,都在在常量池里面的

字符串的常量池

在上面说到,所有的加引号的字符串都在常量池中间,但是常量池是什么东西呢?

常量池其实就是在创建类的时候,所类中的所有的常量写到常量池当中。

例:

    String str1 = "abc";
String str2 = "abc"; char[] arrch = {'a', 'b', 'c'};
String str3 = new String(arrch); //比较三个Sting的地址 输出的结果:
System.out.println(str1 == str2); //true
System.out.println(str1 == str3); //false
System.out.println(str2 == str3); //false

要据上面的图可以得知,常量池中其实存的也是一个地址,在常量如果相等的情况下,会指向常量池中的同一个地址。常量池中的地址,指向的是一个字节数组,所有的数组最后存的都是字节数组。

而字符数组在在jvm中存储的是按照一个数组来存储的,当String的构造方法调用这个数组的时候,这个数组会转成字符数组的形式,然后再给String类的构造方法。

而用构造方法构造的String类,他是一个对象了,所以不在常量池中在着了,是在堆中随机存储着,所以说,str1 == str2 地址相同,但是str1 == str3str2 == str3地址不相同。

对于引用类型来说,==进行的是地址值的比较。

字符串的操作和使用

比较方法

在我们日常用的时候,如果我们只想比较字符串里面的值,不关心地址,就可用比较方法,所以说java专门写了两个比较的方法。

public boolean equals(Object obj)public boolean equalsIgnoreCase(Sttring str)

上面的两个方法,一个是严格区分大小写的,一个是忽略大小写的。

例:

equals方法的使用:

   String str1 = "ABC";
String str2 = "ABC"; char[] arrch = {'A', 'B', 'C'};
String str3 = new String(arrch); //比较三个Sting的地址 输出的结果:
System.out.println(str1.equals(str2)); //true
System.out.println(str1.equals(str3)); //true
//也可心直接和常量进行比较
String str = null;
System.out.println(str.equals("ABC")); //不推荐使用:会报错 => java.lang.NullPointerException(空指针异常)
System.out.println("ABC".equals(str)); //推荐使用

equalsIgnoreCase方法的使用:

   String str4 = "guo";
String str5 = "GUO";
System.out.println(str4.equalsIgnoreCase(str5));
//true 但是只能进行英文的忽略大小写比较

获取字符串长度

在日常使用中获取长度和比较是String类里面用的最多的两个方法了。

public int length()

例:

    String str = "dfghjhgfdfg";
System.out.println("字符串的长度是:"+str.length());
//字符串的长度是:11

拼接字符串

拼接字符串,也有自己的方法,但是我们在用的时候,一般是直接用‘+’来直接拼接的,没有使用方法。

在拼接字符串的时候,我们要知道,拼接出来的字符串,是和原来的字符串是一点都不相等的,不管用方法还是用‘+’号。就是因为常量不可改变。

方法:public String concat(String str);

例:

    String str1 = "老";
String str2 = "酒馆";
System.out.println(str1.concat(str2));
//老酒馆
System.out.println(str1 + str2);
//老酒馆

获取指定位置的单个字符

也是常用的方法:public char charAt(int index);

例:

    String str = "老酒馆的锅";
char c = str.charAt(2);
System.out.println("指定位置出来的字符是:" + c);
//指定位置出来的字符是:馆

查找字符串首次出现的位置索引

在java里面只要是索引就是从0开始的,所以字符串也是。

String里面常用的方法是:public int indexOf(String str);

例:

    String str = "老酒馆的锅";
int index = str.indexOf("酒馆");
System.out.println("字符串首次出现的位置索引:"+index);
//字符串首次出现的位置索引:1

截取字符串

String类里面截取字符串只有一种方法,但是这一种方法有一个重载。

public String substring(int begin)public String substring(int begin,int end) 这两种方法。

第一种方法:

    String str = "老酒馆的锅";
//从0开始数,在第三个字符串的地方开始往后面截取,包括3
String substring = str.substring(3);
System.out.println(substring); //的锅

第二种方法:

    String str = "老酒馆的锅";
//从0开始数,在第一个字符串的地方开始往后面截取,包括1
//但是不包括后面,[1,3);
String substring = str.substring(1, 3);
System.out.println(substring); //酒馆

字符串转换

字符串转换可以在非常多的场景里面用的到,所以String类里面也提供的有技持的方法。

public char[] toCharArray(); 将当前字符串拆分成为字符数组。

public byte[] getBytes(); 获得当前字符串底层的字节数组。

public String replace(CharSequence oldStr,CharSequence newStr); 将所有的老字符串都替换成新的字符串。

toCharArray():

    String str = "老酒馆的锅";
//转换成字符数组
char[] chars = str.toCharArray();
System.out.println(chars[0]); //老

getBytes():

    String str = "老酒馆的锅";
//转换成字节数组
byte[] chars = str.getBytes();
//这里面对应的是utf-8里面的字符
System.out.println(chars[0]); // -24 => 老
System.out.println(chars[1]); //-128 =>酒
System.out.println(chars[2]); //-127 =>馆

replace(CharSequence oldStr,CharSequence newStr):

    String str = "Hello Word !";
//把所有的o替换成&号
String str2 = str.replace("o", "&");
System.out.println(str2); //Hell& W&rd !

字符串分割方法

在日常使用中会对有规律的字符串按照对应的规则分成若干份。

public String[] split(String regex);

    String str = "Hello Word !";
//根据空格进行切分
String[] strs = str.split(" ");
for (String s : strs) {
System.out.println(s);
}
/* 分割成三个字符串了
Hello
Word
!
*/
//有一种特殊的情况,就是根据"."进行切割的时候必须在点前面加上\\
String s = "aaa.bbb.ccc";
String[] split = s.split(".");
System.out.println(split.length); //0
String[] split1 = s.split("\\.");
System.out.println(split1.length); //3
//这就说明必须在点的前面加上\\,
//这是因为在split里面是按照正侧表达式进行切割的,"."具有特殊函意,所以要加上转义字符

以上就是字符串的简单的介绍和使用方法了。


细节决定成败!

个人愚见,如有不对,恳请扶正!

Java | 字符串的使用 & 分析的更多相关文章

  1. java 字符串内存分配的分析与总结

    经常在网上各大版块都能看到对于java字符串运行时内存分配的探讨,形如:String a = "123",String b = new String("123" ...

  2. Java字符串分割函数split源码分析

    spilt方法作用 以所有匹配regex的子串为分隔符,将input划分为多个子串. 例如: The input "boo:and:foo", for example, yield ...

  3. Java 类反射机制分析

    Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...

  4. Java 动态代理机制分析及扩展

    Java 动态代理机制分析及扩展,第 1 部分 王 忠平, 软件工程师, IBM 何 平, 软件工程师, IBM 简介: 本文通过分析 Java 动态代理的机制和特点,解读动态代理类的源代码,并且模拟 ...

  5. 为什么Java字符串是不可变对象?

    转自 http://developer.51cto.com/art/201503/468905.htm 本文主要来介绍一下Java中的不可变对象,以及Java中String类的不可变性,那么为什么Ja ...

  6. 三个实例演示 Java Thread Dump 日志分析

    原文地址: http://www.cnblogs.com/zhengyun_ustc/archive/2013/01/06/dumpanalysis.html jstack Dump 日志文件中的线程 ...

  7. 三个实例演示 Java Thread Dump 日志分析(转)

    原文链接:http://www.cnblogs.com/zhengyun_ustc/archive/2013/01/06/dumpanalysis.html 转来当笔记^_^ jstack Dump ...

  8. 初探Java字符串

    转载: 初探Java字符串 String印象 String是java中的无处不在的类,使用也很简单.初学java,就已经有字符串是不可变的盖棺定论,解释通常是:它是final的. 不过,String是 ...

  9. Java 动态代理机制分析及扩展,第 1 部分

    Java 动态代理机制分析及扩展,第 1 部分 http://www.ibm.com/developerworks/cn/java/j-lo-proxy1/ 本文通过分析 Java 动态代理的机制和特 ...

随机推荐

  1. MongoDB(8)- 文档删除操作

    删除方法 db.collection.deleteOne() 删除单条文档 db.collection.deleteMany() 删除多条文档 db.collection.remove() 删除单条或 ...

  2. 在 Android 使用 QuickJS JavaScript 引擎教程

    quickjs-android 是 QuickJS JavaScript 引擎的 Android 接口框架,整体基于面向对象设计,提供了自动GC功能,使用简单.armeabi-v7a 的大小仅 350 ...

  3. Zabbix企业分布式监控工具

    前言:在工作中常常需要对服务器进行监控,但是要选择一款合适监控软件可不容易,今天介绍下zabbix这款监控软件 一.Zabbix介绍1.Zabbix是一个企业级的.开源的.分布式的监控套件2.Zabb ...

  4. 达梦数据库产品支持技术学习分享_Week1

    本周主要从以下几个方面进行本人对达梦数据库学习的分享,学习进度和学习情况因人而异,仅供参考. 一.达梦数据库的体系架构 二.达梦数据库的安装 三.达梦数据库的数据类型 四.达梦数据库的DDL.DML. ...

  5. 在windows上 使用celery 报错

    在windows上 使用celery 报错       在windows上 使用celery 报错 ValueError: not enough values to unpack (expected ...

  6. Amazon SageMaker和NVIDIA NGC加速AI和ML工作流

    Amazon SageMaker和NVIDIA NGC加速AI和ML工作流 从自动驾驶汽车到药物发现,人工智能正成为主流,并迅速渗透到每个行业.但是,开发和部署AI应用程序是一项具有挑战性的工作.该过 ...

  7. Jittor框架API

    Jittor框架API 这里是Jittor主模块的API文档,可以通过import jittor来获取该模块. classjittor.ExitHooks exc_handler(exc_type,  ...

  8. MinkowskiEngine多GPU训练

    MinkowskiEngine多GPU训练 目前,MinkowskiEngine通过数据并行化支持Multi-GPU训练.在数据并行化中,有一组微型批处理,这些微型批处理将被送到到网络的一组副本中. ...

  9. 使用PCAST检测散度以比较GPU和CPU结果

    使用PCAST检测散度以比较GPU和CPU结果 并行编译器辅助软件测试(PCAST)是英伟达HPC FORTRAN.C++和C编译器中的一个特性.PCAST有两个用例.一个新的处理器或新的编译程序的部 ...

  10. VB Aspose.Pdf 字体变小方格问题处理

    宋体是这样写的:SimSun原先以为是:宋体 先定义字体,在PDF中无法设置,这个找了很久,原来是使用:FontRepository.FindFont方式,这个坑了很久,很多都说是setFont,压根 ...