Java基础之String类型详解

2023-11-19

目录

 

1、简介

2、字符串的比较

3、String的实例化方式

1.直接赋值方式

2.构造方法实例化

4、String对象(常量)池

5、字符串修改

6、String类常用方法

1.字符串查找

2.字符串替换

3.字符串拆分

4.字符串截取

5.字符串格式化

6.其他方法


1、简介

java中String不是基本数据类型,String中之所以能够保存字符串是因为其中定义了一个数组。

 

2、字符串的比较

public class StringDemo {
    public static void main(String[] args) {
        String strA= "abc";
        String strB=new String("abc");
        System.out.println(strA==strB);
    }
}

结果:false

 

如上,字符串内容虽然相同,但是==的结果却是false,若是想要实现比较字符串内容的比较,需要用equals方法。

public class StringDemo {
    public static void main(String[] args) {
        String strA= "abc";
        String strB=new String("abc");
        System.out.println(strA.equals(strB));
    }
}

结果:true

ps:这里介绍一个典型的面试题:

请解释String比较中“==”与equals()区别?

  • == :进行的是数值比较,如果用于对象比较上比较的是两个内存的地址数值。
  • equals() :是类所提供的一个比较方法,可以直接进行字符串内容比较。

 

3、String的实例化方式

1.直接赋值方式

public class StringDemo {
    public static void main(String[] args) {
        String strA = "abc";
        String strB = "abc";
        System.out.println(strA == strB);
    }
}

结果:true

如上,==返回结果是true,因为Java底层专门提供了一个字符串常量池,在给strB赋值时,会首先去字符串常量池中查找是否有这个值,没有的话会在常量池中加入,有的话会直接将其地址给strB。

 

2.构造方法实例化

 

构造方法实例化,会构造两块堆内存空间,只使用一块,匿名对象开辟的内存空间会成为垃圾空间。

 

String strA = new String( "abc" );

构造方法实例化String对象不会自动保存到字符串常量池中。

所以以下执行的结果为false

public class StringDemo {
    public static void main(String[] args) {
          String strB=new String("abc");
          String strA= "abc";
        System.out.println(strA==strB);
    }
}

但是构造方法有办法实现手动入池的操作,即intern方法,如下结果就是true,因为都引用的常量池里的"abc"

public class StringDemo {
    public static void main(String[] args) {
        String strB=new String("abc").intern();
        String strA= "abc";
        System.out.println(strA==strB);
    }
}

ps:这里再介绍一个典型的面试题:

请解释String中两种对象实例化方法的区别?

  • 直接赋值:只会产生一个实例化对象,并且可以自动保存到String对象(常量)池
  • 构造方法:会产生两个实例化对象,并且不会自动入池,但是可以利用intern方法。

 

4、String对象(常量)池

对象池主要的目的是为了实现数据的共享,在Java中String对象池分为两种:

  • 静态常量池:指的是程序在加载的时候会自动将此程序中保存的字符串、常量、类和方法等,全部进行分配;
  • 运行时常量池:当一个程序加载之后,里面可能有一些变量,这个时候提供的常量池。

举例:

public class StringDemo {
    public static void main(String[] args) {

        String strA= "abc"+"123"+"DEF";
        String strB="abc123DEF";

        System.out.println(strA==strB);
    }
}
结果:true
public class StringDemo {
    public static void main(String[] args) {

        String rr = "123";

        String strA = "abc" + rr + "DEF";
        String strB = "abc123DEF";

        System.out.println(strA == strB);
    }
}
结果:false

5、字符串修改

字符串不可修改

 

如上图,我们发现,这种处理下字符串常量的值并没有发生任何改变,只是开辟新的堆内存空间,并且改变strA的引用,这种改变会带来额外的垃圾空间。

若是我们在程序中频繁使用这种操作,会产生大量垃圾空间导致程序的性能非常差,所以在开发中尽量减少频繁更改String类内容的操作。

 

6、String类常用方法

  • string(char[ ] value) 将传入的字符数组全变成字符串
public class StringDemo {
    public static void main(String[] args) {
        char[] cc = {'a', 'b', '1'};
        System.out.println(new String(cc));
    }
}
结果:ab1
  • string(char[ ] value,int offset,int count) 将传入的字符数组部分变成字符串,offset是起始位置,count是范围大小
public class StringDemo {
    public static void main(String[] args) {
        char[] cc = {'a', 'b', '1','2','3'};
        System.out.println(new String(cc,2,3));
    }
}
结果:123
  • charAt(int index) 获取指定索引位置的字符
public class StringDemo {
    public static void main(String[] args) {
       
        String str ="abcdefg";
        System.out.println(str.charAt(2));
    }
}
结果:c
  • toCharArray() 将字符串中数据以字符数组的形式返回
public class StringDemo {
    public static void main(String[] args) {
        String str = "abcdefg";
        char[] cc = str.toCharArray();
        System.out.println(cc.length);
    }
}
结果:7
  • equals() 字符串判断,区分大小写

上文有介绍用法

  • equalsIgnoreCase() 不区分大小写的判断
public class StringDemo {
    public static void main(String[] args) {
        String str = "abc";
        String str1 = "ABC";
        System.out.println(str.equalsIgnoreCase(str1));
    }
}
结果:true
  • compareTo() 字符串的比较,返回数字,ascii码值相减,区分大小写
public class StringDemo {
    public static void main(String[] args) {
        String str = "a";
        String str1 = "A";
        System.out.println(str.compareTo(str1));
    }
}
结果:32
  • compareToIgnoreCase()同上,不区分大小写

 

字节数组的String类应用

  • string(byte[ ] value) 将传入的字节数组全变成字符串
  • string(char[ ] value,int offset,int count) 将传入的字节数组部分变成字符串,offset是起始位置,count是范围大小
  • string.getBytes() 将字符串转化为字节数组
  • getBytes(String ccc) 编码转换

 

常用方法归类:

 

1.字符串查找

contains(String s) 判断子字符串是否存在

indexOf(String s)从头查找指定字符串的位置

intdexOf(String s, int fromIndex)从指定位置开始查找指定字符串的位置

public class StringDemo {
    public static void main(String[] args) {
        String str = "1234C";
        System.out.println(str.indexOf("C",2));
    }
}
结果:4

lastIndexOf(String str)从后往前找

lastIndexOf(String s, int fromIndex)从指定位置由后往前找

 

startsWith(String str)判断是否以指定字符串开头

public class StringDemo {
    public static void main(String[] args) {
        String str = "1234C";
        System.out.println(str.startsWith("123"));
    }
}
结果:true

startsWith(String str,int toffset)判断是否从指定位置以指定字符串开头

endsWith(String str)判断是否以指定字符串结尾

 

2.字符串替换

replaceAll(String regex,String replacement)全部替换

    public static void main(String[] args) {
        String str = "123V123";
        System.out.println(str.replaceAll("123","abc"));
    }
}
结果:abcVabc

replaceFirst(String regex,String replacement)替换首个

 

3.字符串拆分

split(String regex)按照指定字符串全部拆分

split(String regex,int limit)按照指定字符串限制拆分成指定段数

public class StringDemo {
    public static void main(String[] args) {
        String str = "123VV456VVaaVVcc";
        for (String a : str.split("VV", 2)) {
            System.out.println(a);
        }
    }
}
结果:
123
456VVaaVVcc

 

4.字符串截取

substring(int beginIndex)从指定位置开始截取到最后

substring(int beginIndex,int endIndex)设置了截取范围

public class StringDemo {
    public static void main(String[] args) {
        String str = "123VV456VVaaVVcc";
            System.out.println(str.substring(3,8));
    }
}
结果:VV456

5.字符串格式化

public class StringDemo {
    public static void main(String[] args) {
        String name = "KOBE";
        int age = 18;
        double high = 198.534;
        String str = String.format("姓名:%s、年龄:%d,身高:%.2f", name, age, high);
        System.out.println(str);
    }
}
结果:
姓名:KOBE、年龄:18,身高:198.53

6.其他方法

concat()字符串连接

intern()字符串入池

isEmpty()字符串判断是否为""

length()返回字符串长度

trim()去除开头结尾的空格

toUpperCase()转大写

toLowerCase()转小写

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java基础之String类型详解 的相关文章

  • 当转义引号存在时,在外部引号或外部方括号中分割逗号

    是否可以按照以下条件拆分字符串 用 即逗号 分隔 在每个元素上 忽略第一个 和最后一个 内的逗号检查 在每个元素上 忽略第一个 和最后一个 内的逗号检查 e g String source to char DATE YYYY MM DD I
  • 将 frontend-maven-plugin 从 Maven 迁移到 gradle

    我有一个com github eirslett frontend maven plugin in my maven项目
  • 如何在编写 XML 文件时忽略 DTD 验证但保留 Doctype?

    我正在开发一个系统 该系统应该能够读取任何 或至少是任何格式良好的 XML 文件 操作一些节点并将它们写回到同一个文件中 我希望我的代码尽可能通用 但我不希望 对代码中任何位置的架构 文档类型信息的硬编码引用 文档类型信息位于源文档中 我想
  • 在 Mac OS X 上的某个时刻,移动光标未显示在焦点上

    我有基于 Swing 的应用程序 每当我们在组件上移动鼠标时 它都会显示移动光标图标 并通过拖动来移动该组件 我已经为此使用了代码 mycomponent setCursor Cursor getPredefinedCursor Curso
  • Java:提取具有多个子目录的zip文件[重复]

    这个问题在这里已经有答案了 我有一个 zip Meow zip 它有多个文件和文件夹 如下所示 Meow zip 文件 txt 程序 exe Folder 资源 xml AnotherFolder OtherStuff 更多资源 xml 我
  • Java 中的原始数据类型是线程安全的吗

    原始数据类型是这样的吗int shortJava 线程安全 我执行了以下代码 有时看不到预期结果 500 public class SampleThree extends Thread static long wakeUpTime Syst
  • 格式化 XmlGregorianCalendar 时区问题

    我需要将 java XmlGregorianCalendar 格式化为 yyMMdd 字符串 我的实现 XMLGregorianCalendar date getDate getting the date if date null Simp
  • 按钮和窗口之间的空间

    我这里有这段代码 其想法是在主窗口中在文本区域旁边有两个按钮 但我尚未添加 在尝试使用 GridBagLayout 并在此过程中扯掉我的头发后 我决定不使用布局并在不可调整大小的窗口内手动放置按钮 import java awt impor
  • 良好的客户端套接字池

    我需要管理从我的 Java 应用程序到外部服务器的长时间运行的 TCP 套接字连接 我正在寻找一个好的套接字池 这样我就可以重复使用套接字 有什么建议吗 你可以看看在上面建立一个套接字池公共池 http commons apache org
  • 我需要帮助理解 java 中 Timer 类的 ScheduleAtFixedRate 方法

    作为一个粉丝番茄工作法 http www pomodorotechnique com 我正在为自己制作一个倒计时器 以保证我完成作业 然而 这个特定的项目不是家庭作业 Stack 有很多关于使用计时器来控制用户输入之前的延迟等问题 但关于独
  • 使用Optional验证输入

    我有一个 CreateOrder 实例 其中包含一些 String Integer 和 Double 状态 当我在 JUnit 测试中为 CreateOrder 创建一个对象并将其发送出去时 我可以使用可选 API 验证 String 属性
  • 在 Maven 中解决或编译循环依赖关系 [重复]

    这个问题在这里已经有答案了 我有一个有趣的问题 而不是寻找a解决方案 我正在寻找解决方案s Alice 项目有一个 pom xml 在其中 pom 说她被包装成一个罐子 虽然她是一个坚强的女人 但她依赖鲍勃 鲍勃项目是一个互补主义者 他说他
  • 从列表中删除对象的最佳方法是什么

    我有以下逻辑来删除系统中的非活动用户 因为我们在迭代列表时无法删除行 有更好的方法来处理这个问题吗 List
  • Android 设计导航抽屉 - 如何在 nav xml 中添加开关?

    我正在使用新的 Android 设计导航抽屉 我想在抽屉里加一个开关 有办法实现这个吗 这是菜单 xml menu menu
  • Java中使用final关键字会提高性能吗?

    在 Java 中 我们看到很多地方final可以使用关键字 但其使用并不常见 例如 String str abc System out println str 在上述情况下 str can be final但这通常被忽略 当一个方法永远不会
  • 从自定义类导入时,XMLBeans jar 无法签名

    在 NetBeans 中 我创建了一个 Exporter 类 该类使用 APACHE POI 将一些数据导出到 EXCEL 文件 而 APACHE POI 使用 XMLBeans 我通过下载 zip 二进制文件并手动添加 jar 来添加 A
  • 如何使用 Maven 创建新的 Eclipse RCP 项目?

    如何使用 Maven 创建新的 Eclipse RCP 项目 最好是m2eclipse http maven apache org eclipse plugin html 我读到有一个关于 Eclipse 的 Maven 插件 Maven
  • Spring:在属性文件中定义@RequestMapping值

    是否可以定义a的值 RequestMapping在 Spring 中通过在属性文件中定义注释 实际上 我做了类似的事情 Controller RequestMapping xxx public class MyController 但我想存
  • 为什么浮点数有符号零?

    为什么双打有 0也 0 其背景和意义是什么 0 通常 被视为0 当一个negative浮点数非常接近零 可以考虑0 要明确的是 我指的是算术下溢 http en wikipedia org wiki Arithmetic underflow
  • 尝试从输入流检索文本时应用程序挂起

    情况 我确实查看了您的代码 正如我怀疑的那样 您的问题与您发布的代码完全无关 您的 GUI 完全忽略 Swing 线程规则 并在主 Swing 事件线程 称为Event Dispatch T螺纹或EDT 由于该线程负责所有 Swing 绘图

随机推荐

  • Unity 手动拆分和组装模型

    第一次写博客 不足之处还望前辈指点 项目需求是需要用Unity制作船舰模型的爆炸图效果 我的思路是先把船舰上各个单元组件的位置记录下来 然后依次移动这些单元组件的位置 在复原该模型时 再把原来记录的单元组成模型位置还原出来 首先 在Hier
  • 计算机网络(五)——应用层HTTP协议

    HTTP 文章目录 HTTP 1 HTTP协议是什么 2 HTTP协议格式 2 1请求包含信息 2 2响应包含信息 2 3请求响应格式 2 4模拟发送请求打印响应结果 2 5请求响应头中的Content 2 6模拟响应服务器 3 HTTP优
  • 2018年第九届蓝桥杯C/C++A组省赛 题面&部分题解

    首先 原题 链接 https pan baidu com s 1UzRN6Mf2Dwp0263F MMESg 密码 2ryh 第一题 标题 分数 1 1 1 2 1 4 1 8 1 16 每项是前一项的一半 如果一共有20项 求这个和是多少
  • Windows7 64bit VS2013 Caffe test MNIST操作步骤

    在http blog csdn net fengbingchun article details 49849225中用Caffe对MNIST数据库进行训练 产生了model 下面介绍下如何将产生的model应用在实际的数字图像识别中 用到的
  • 29、es6 中的class类的深入理解_JavaScript中的类、原型、原型链、继承

    前言 JavaScript在ES6之前严格意义上是没有像JAVA C 这种语言中类的概念的 ES6添加了class 但其实这个class也只是ES6以前的构造函数和原型的语法糖而已 要想真正了解JavaScript中最复杂的部分 就得从最初
  • pat 乙级 1015. 德才论 (25) c++

    http 39 106 25 239 个人网站 欢迎访问 交流 1015 德才论 25 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN Li 宋代史学家司马光在 资
  • AFNetwork 作用和使用方法具体解释

    转自 http www maxiaoguo com clothes 269 html AFNetworking是一个轻量级的iOS网络通信类库 它建立在NSURLConnection和NSOperation等类库的基础上 让非常多网络通信功
  • Android:通用的ListView数据适配器

    在写Android程序时 经常会用到ListView控件进行数据展示 使用时 需要定义一个ListView并创建其Item布局 然后对ListView设置一个适配器adapter 一般继承自BaseAdapter 同时需要定义一个ViewH
  • 如何消除@Autowired报Field injection is not recommended的警告

    对于一些强迫者来说 代码中有一些警告 就看起来很不爽 今天笔者我也遇到了这种问题 在SpringBoot中 使用 Autowired的时候 警告Field injection is not recommended 如下图 Spring Te
  • electron安装过程中遇到的问题

    安装总结 项目本身安装是用的npm 这个在我们这里 不翻墙是大概率用不了的 所以必须修改镜像源或者用cnpm 一开始的尝试是用 cnpm 但是到后面安装脚手架的时候 脚手架里封装的方法是npm 这时候 脚手架的安装就会有问题 综上 还是需要
  • STM32 USART通信协议详细讲解—小白入门

    文章目录 一 串口通信协议简介 二 物理层 2 1 电平标准 2 2 RS 232 信号线 三 协议层 3 1 波特率 3 2 通讯的起始和停止信号 3 3 有效数据 3 4 有效检验 四 STM32 的 USART 简介 4 1 USAR
  • SQL语句关键字大全

    SQL语句的整理以及总结 目录 SQL语句的整理以及总结 目录 SQL语句的基本类型 S Q L 语
  • 【智慧医疗】Springboot+Vue+Element-UI前后端分离的医疗管理平台

    目录 需求分析 系统概要 技术选型 功能模块 后端逻辑 需求分析 随着第五代移动通信技术 5G 高速发展 推动新一代信息技术与各个行业的融合发展 各行各业都在积极融合智能现代化概念 努力把互联网技术运用到其中 在我国目前人口基数大 对医疗服
  • 【C++笔记】NULL、0、nullptr区别分析

    一 C的NULL 在C语言中 我们一般使NULL表示空指针 即 int i NULL foo t f NULL 但是 实际上在C语言中 NULL通常被定义为 define NULL void 0 也就是说NULL实际上是一个void 的指针
  • C++中的友元分析

    友元函数 class stu public friend int ret stu my stu int a 10 this gt a a private int a int b int ret stu my return my a 定义友元
  • c#的dllimport使用方法详解

    DllImport是System Runtime InteropServices命名空间下的一个属性类 其功能是提供从非托管DLL 托管 非托管是微软的 net framework中特有的概念 其中 非托管代码也叫本地 native 代码
  • 手机游戏软件开发的前景 The future of development of game software on mobiles

    一 课题名称 手机游戏软件开发的前景 The future of development of game software on mobiles 二 课题分析 计算机领域的方向很多 我对手机游戏的开发比较感兴趣 而且3G手机的时代即将到来
  • 编写一个Book类,该类至少有name和price两个属性。该类要实现Comparable接口,在接口的compareTo()方法中规定两个Book类实例的大小关系为二者的price属性的大小关系。在

    编写一个Book类 该类至少有name和price两个属性 该类要实现Comparable接口 在接口的compareTo 方法中规定两个Book类实例的大小关系为二者的price属性的大小关系 在主函数中 选择合适的集合类型存放Book类
  • pc 后台管理系统总结

    人力资源后台管理系统 hrsaas 1 项目介绍 hrsaas是一款对公司员工管理的后台管理系统 主要实现功能 公司组织架构的增删改查 公司角色的增删改查以及公司信息内容展示 员工信息的查阅 员工在公司的工作状态 是否转正 离职 调岗 担任
  • Java基础之String类型详解

    目录 1 简介 2 字符串的比较 3 String的实例化方式 1 直接赋值方式 2 构造方法实例化 4 String对象 常量 池 5 字符串修改 6 String类常用方法 1 字符串查找 2 字符串替换 3 字符串拆分 4 字符串截取