Java基础教程(4)-Java中的操作符

简介: 【4月更文挑战第4天】Java中的String是常用类,字符串是不可变对象,用双引号表示。String对象在编译期长度受限于65535,运行期不超过Int范围。字符串方法如length()、substring()、replace()、equals()等提供了多种操作。可变字符串可使用StringBuffer或StringBuilder。String对象通过字符串池优化内存,池中已有相同内容字符串则返回其引用。

字符串String

字符串是java程序中最常用的一个类;

在Java中,字符和字符串是两个不同的类型

字符串类型 String 是引用类型,Java将字符串作为String类型对象来处理,用双引号 "…" 表示字符串。理论上一个字符串可以存储0个到任意个字符;

但实际上:字符串有长度限制,在编译期,要求字符串常量池中的常量不能超过 65535,并且在javac 执行过程中控制了最大值为 65534。在运行期,长度不能超过 Int 的范围,否则会抛异常;
<参考网上的关于JVM常量池相关的文章>

字符串是不可变的

当创建一个String对象时,被创建的字符串是不能被改变的。这也就是说一旦一个String对象被创建,将无法改变那些组成字符串的字符。

String 类的所有方法都没有改变字符串本身的值,都是返回了一个新的对象。

如果需要一个可修改的字符串,应该使用 StringBuffer 或者 StringBuilder。否则会有大量时间浪费在垃圾回收上,因为每次试图修改都有新的 string 对象被创建出来。

构造方法

默认构造函数:创建空String的构造函数

String str = new String();

String类支持多种构造函数。如下:


        String s1 = new String("ad");
        String s2 = new String(new char[]{
   
   b,c})
        System.out.println(s1);
        System.out.println(s2);

全部构造方法可以查看源码:
在这里插入图片描述

字符串的方法:

String类包括了50多个用于操作字符串的方法。大多数都会用到;如

  • 获取字符串的长度:字符串的长度是指其所包含的字符的个数。调用如下的length( )方法可以得到这个值;

    String s1 = new String("ad");
    s1.length();

  • 提取子串:substring(int start,int end) 从一个较大的字符串提前子串
    在这里插入图片描述

  • Java 中常用的替换字符的方法:replace、replaceAll 和 replaceFirst

replace(CharSequence target, CharSequence replacement) ,用replacement 替换所有的 target,两个参数都是字符串。

replaceAll(String regex, String replacement) ,用 replacement 替换所有的regex 匹配项,regex 很明显是个正则表达式,replacement是字符串。

replaceFirst(String regex, String replacement) ,基本和 replaceAll 相同,区别是只替换第一个匹配项

  • 字符串比较:equals( )和 equalsIgnoreCase( )

如果两个字符串具有相同的字符和长度,它返回true,否则返回false。这种比较是区分大小写的。为了执行忽略大小写的比较,可以调用equalsIgnoreCase( )方法。当比较两个字符串时,它会认为A-Z和a-z是一样的。

  • 搜索字符串 ·

    indexOf( ) 搜索字符或子字符串首次出现。
    lastIndexOf( ) 搜索字符或子字符串的最后一次出现。

  • 特殊的字符串操作

对于程序中的每一个字符串常量,Java会自动创建String对象。因此,可以使用字符串常量初始化String对象;

String str = "abc";

由于对应每一个字符串常量,有一String对象被创建,因此在使用字符串文字的任何地方,都可以使用String对象。

通常,Java不允许对String对象进行操作; Java的编译器对字符串做了特殊照顾,可以使用 + 连接任意字符串和其他数据类型;

字符串连接的一个实际使用是当创建一个很长的字符串时,可以将它拆开,使用+将它们连接起来,避免源代码中长字符串的换行

字符串可以和其他类型的数据连接;只要+运算符的一个运算数是字符串(String)实例,编译器就将另一个运算数转换为它的字符串形式。

当Java在连接时将数据转换为其字符串形式时,它是通过调用一个由字符串(String)定义的字符串转换方法valueOf( )的重载来完成的。valueOf( )方法对所有简单的类型和类型Object重载。对于简单类型,valueOf( )方法返回一个字符串,该字符串包含了相应其被调
用的值的可读值。对于对象,valueOf( )方法调用toString( )方法。

定义字符串变量的 StringBuffer 和StringBuilder

Java 中除了定义了一个可以用来定义字符串常量的 String 类以外,还提供了可以用来定义字符串变量的 StringBuffer 类,它的对象是可以扩充和修改的。除了 StringBuffer 以外,还有一个类 StringBuilder 也可以使用,其用法和StringBuffer 类似。

StringBuffer是提供了大量的字符串功能的字符串(String)类的对等类。StringBuffer可有插入其中或追加其后的字符或子字符串。StringBuffer可以针对这些添加自动地增加空间,同时它通常还有比实际需要更多的预留字符,从而允许增加空间。

StringBuffer定义了下面三个构造函数:

  • StringBuffer( )
  • StringBuffer(int size)
  • StringBuffer(String str)

最常用的方法append()

append( )方法将任一其他类型数据的字符串形式连接到调用StringBuffer对象的后面。对所有内置的类型和Object,它都有重载形式。

  • StringBuffer append(String str)
  • StringBuffer append(int num)
  • StringBuffer append(Object obj)

每个参数调用String.valueOf( )方法获得其字符串表达式。结果追加在当前StringBuffer对象后面。对每一种append( )形式,返回缓冲区本身。

null值和空字符串
  • 引用类型的变量可以指向一个空值 null ,它表示不存在,即该变量不指向任何对象。
  • 空字符串是一个有效的字符串对象,它不等于 null

字符串池

在 JVM 中,为了减少相同的字符串的重复创建,为了达到节省内存的目的。会单独开辟一块内存,用于保存字符串常量,这个内存区域被叫做字符串常量池。

当代码中出现双引号形式(字面量)创建字符串对象时,JVM 会先对这个字符串进行检查,如果字符串常量池中存在相同内容的字符串对象的引用,则将这个引用返回;否则,创建新的字符串对象,然后将这个引用放入字符串常量池,并返回该引用。

这种机制,就是字符串驻留或池化

相关文章
|
2天前
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
|
2天前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
|
2天前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编
|
11天前
|
JSON Java Maven
实现Java Spring Boot FCM推送教程
本指南介绍了如何在Spring Boot项目中集成Firebase云消息服务(FCM),包括创建项目、添加依赖、配置服务账户密钥、编写推送服务类以及发送消息等步骤,帮助开发者快速实现推送通知功能。
25 2
|
18天前
|
Java 数据库连接 编译器
Kotlin教程笔记(29) -Kotlin 兼容 Java 遇到的最大的“坑”
Kotlin教程笔记(29) -Kotlin 兼容 Java 遇到的最大的“坑”
|
21天前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
本系列教程笔记详细讲解了Kotlin语法,适合希望深入了解Kotlin的开发者。对于需要快速学习Kotlin的小伙伴,推荐查看“简洁”系列教程。本篇笔记重点介绍了Kotlin与Java混编的技巧,包括代码转换、类调用、ProGuard问题、Android库开发建议以及相互调用时的注意事项。
22 3
|
22天前
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(2)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(2)
|
8天前
|
监控 安全 Java
在 Java 中使用线程池监控以及动态调整线程池时需要注意什么?
【10月更文挑战第22天】在进行线程池的监控和动态调整时,要综合考虑多方面的因素,谨慎操作,以确保线程池能够高效、稳定地运行,满足业务的需求。
79 38
|
5天前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?
|
7天前
|
安全 Java
在 Java 中使用实现 Runnable 接口的方式创建线程
【10月更文挑战第22天】通过以上内容的介绍,相信你已经对在 Java 中如何使用实现 Runnable 接口的方式创建线程有了更深入的了解。在实际应用中,需要根据具体的需求和场景,合理选择线程创建方式,并注意线程安全、同步、通信等相关问题,以确保程序的正确性和稳定性。