资讯专栏INFORMATION COLUMN

Java中的字符串

songjz / 2529人阅读

摘要:对引用的对象在运行时抛出异常,空串是长度为的字符串,和别的字符串的区别就是长度为。一块内存空间,堆中地址相同不同输出分配两块内存空间,栈中地址不同输出输出输出输出解决方案类是可变的,不会再字符串常量池中,而在堆中。

1、JAVA中的字符串API详解

String对象存储字符串,String类位于java.lang包中.

String s="Hello world";
String s=new String();
String s=new String("Hello world");

String类length()方法,确定字符串长度;数组length是属性;

String类equals()方法,比较两个字符串内容是否一致(堆中数据);而不是用“==”比较(栈地址比较),Java中特有...
equalsIgnoreCase()方法:判读两者是否相等,忽略大小写;
toLowerCase():全部转为小写;
toUpCase():全部转为大写;

数字转为字符串:String number=1+"";

字符串相加:使用“+”
使用String类concat()方法

String s=new String("你好,");
String name=new String("张三!");
String sentence=s.concat(name);

注意:s.concat(name)返回值为连接后的字符串,而s并未变化!

trim()方法:去掉字符串中空格【前后空格去除,中间不去除】

字符串提取:public int indexOf(int ch)、public int indexOf(String value) 搜索第一个出现的字符ch(或字符串value);
public int lastIndexOf(int ch)、public int lastIndexOf(String value) 搜索最后一个出现的字符(或字符串value)【字符串中可能存在相同字符】;

public String substring(int index):提取从位置索引开始的字符串部分【包括index】

public String substring(int beginindex,int endindex):提取从beginindex开始,endindex结束字符串部分【含beginindex,不含endindex】

split(String value)方法:拆分字符串,分隔符是value,部分分隔符与正则表达式冲突:比如“|”,需要转义“|”;

String caseString="ab,cde,fg";
String[] array=caseString.split(",");
for (String item:array) {
    System.out.println(item);
}

注意:空串与null区别,对未初始化的对象操作会被编译器挡在门外;null是一个特殊的初始化值,是一个不指向任何对象的引用。对引用null的对象在运行时抛出异常,空串是长度为0的字符串,和别的字符串的区别就是长度为0。

2、JAVA字符串不变性与常量池

字符串不变性:字符串内存地址一旦分配之后,字符串是只读的,不允许更改;字符串更改实际是开辟新内存空间,栈指针断开指向新空间;旧控件编程垃圾!

常量池:String的不变性机制显然会在String常量内有大量的冗余。因此,Java为了更有效地使用内存,JVM留出一块特殊的内存区域,被称为“String常量池”。
譬如String a="abc",当你定义这样的变量时,java会先去常量池寻找有没有""abc"这样的字符串,如果有,直接把内存地址交给a,否则生成一个"abc"的字符串。当下一个String b="abc"时,JVM不会再次生成"abc",而是直接将"abc"引用给b,所以你会发现a==b。

Demo:

//一块内存空间,堆中地址相同不同
String str1="java";
String str2="java";
System.out.println(str1==str2);
输出:true.

//分配两块内存空间,栈中地址不同
String str1=new String("java");
String str2=new String("java");
System.out.println(str1==str2);
输出:false.

String str1="java";
String str2="blog";
String s=str1+str2;
System.out.println(s=="javablog");
输出:false.

String s="java"+"blog";
System.out.println(s=="javablog");
输出:true.

String str2="blog";
String s="java"+str2;
System.out.println(s=="javablog");
输出:false.

解决方案:
- StringBuffer类是可变的,不会再字符串常量池中,而在堆中。如果缓冲区溢出,容量自动增大,固定容量为16。
- StringBuilder

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64057.html

相关文章

  • Java JDK11中的新API

    摘要:将参数的所有字节写入输出流两个允许指定的新构造函数。四个允许指定的新构造函数。返回从此字符串中提取的行的流,由行终止符分隔。如上所述,使用指定的将字符编码为字节。返回此表示的执行客户端中的包装原因,如果原因不存在或未知,则返回。 有关API更改的完整列表,可在Github上获得。 这里列出的是除了java.net.http和jdk.jfr模块之外的所有新方法。没有列出java.secu...

    pepperwang 评论0 收藏0
  • JavaScript中的正则表达式

    Javascript的正则表达式是前端中比较重要的部分,正则表达式主要用于字符串处理,表单验证等场合,实用高效,文章主要对JavaScript中的正则的学习与总结 正则表达式的定义 正则表达式:是一个描述字符模式的对象,JavaScrip中正则表达式用RegExp对象表示,可以使用RegExp构造函数来创建正则对象 正则表达式的创建 1.字面量创建 var reg = /[a-z]/; 2.构...

    _Zhao 评论0 收藏0
  • java:String

    摘要:类是类它内部的方法也默认被修饰不能重写字符串常量池当这样声明一个字符串会检测字符串常量池中是否存在这个值的字符串如果存在就直接赋值给否则创建一个新的再赋值给当连续用同样的方式声明两个字符串并作比较结果为这个操作符比较的是什么对于基本变量比较 String类是final类,它内部的方法也默认被final修饰,不能重写. 字符串常量池 当这样声明一个字符串 String str = h...

    U2FsdGVkX1x 评论0 收藏0
  • 最最最常见的Java面试题总结——第二周

    摘要:与都继承自类,在中也是使用字符数组保存字符串,,这两种对象都是可变的。采用字节码的好处语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。 String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的? String和StringBuffer、StringBuilder的区别 可变性...

    yearsj 评论0 收藏0
  • 《深入理解Java虚拟机》(二)Java虚拟机运行时数据区

    摘要:虚拟机运行时数据区分为以下几个部分。程序计数器也是在虚拟机规范中唯一没有规定任何异常情况的区域。在方法运行期间不会改变局部变量表的大小。长度在位和位的虚拟机中,分别为官方称它为。 Java虚拟机运行时数据区 详解 2.1 概述 本文参考的是周志明的 《深入理解Java虚拟机》第二章 ,为了整理思路,简单记录一下,方便后期查阅。 2.2 运行时数据区域 Java虚拟机在Java程序运行时...

    draveness 评论0 收藏0

发表评论

0条评论

songjz

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<