JavaSE从基础到入门:String类的学习

news2024/11/16 1:15:49

前言

字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。

1.String类的方法

1.字符串的构造方法

使用常量串构造

String s1 = "hello world";
System.out.println(s1);

直接newString对象

String s2 = new String("hello world");
System.out.println(s2);

使用字符数组进行构造

char[] array = {'h','e','l','l','o',' ','w','o','r','l','d'};
String s3 = new String(array);
System.out.println(s3);

注意事项

  1. String是引用类型,内部并不存储字符串本身,String 创建的字符串存储在公共池中,而 new 创建的字符串对象在堆上。
String s1 = "abcdef";
String s2 = "abcdef" + "xy";
String s3 = new String("xy");

在这里插入图片描述

  1. 在Java中“”引起来的也是String类型对象。
// 打印"hello"字符串(String对象)的长度
System.out.println("hello".length());

2.字符串的比较

1. ==比较是否引用同一个对象

public class TestDemo {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        int c = 10;
        // 对于基本类型变量,==比较两个变量中存储的值是否相同
        System.out.println(a == b);
        System.out.println(a == c); 
        // 对于引用类型变量,==比较两个引用变量引用的是否为同一个对象
        String s1 = new String("hello");
        String s2 = new String("hello");
        String s3 = new String("world");
        String s4 = s1;
        System.out.println(s1 == s2); 
        System.out.println(s2 == s3);
        System.out.println(s1 == s4); 
    }
}

在这里插入图片描述

2. boolean equals(Object anObject) 方法

String类重写了父类Object中equals方法,Object中equals默认按照==比较,String重写equals方法后,按照如下规则进行比较

public boolean equals(Object anObject) {}
  1. 先检测this 和 anObject 是否为同一个对象比较,如果是返回true
  2. 检测anObject是否为String类型的对象,如果是继续比较,否则返回false
  3. this和anObject两个字符串的长度是否相同,是继续比较,否则返回false
    4.从前往后逐个字符进行比较
public class TestDemo {
    public static void main(String[] args) {
        String s1 = new String("hello");
        String s2 = new String("hello");
        String s3 = new String("Hello");
        // s1、s2、s3引用的是三个不同对象,因此==比较结果全部为false
        System.out.println(s1 == s2);
        System.out.println(s1 == s3);
        // equals比较:String对象中的逐个字符
        // 虽然s1与s2引用的不是同一个对象,但是两个对象中放置的内容相同,因此输出true
        // s1与s3引用的不是同一个对象,而且两个对象中内容也不同,因此输出false
        System.out.println(s1.equals(s2));
        System.out.println(s1.equals(s3));
    }
}

在这里插入图片描述

3. int compareTo(String s) 方法

与equals不同的是,equals返回的是boolean类型,而compareTo返回的是int类型。具体比较方式:

  1. 先按照大小比较,如果出现不等的字符,直接返回这两个字符的大小差值
  2. 如果前k个字符相等(k为两个字符长度最小值),返回值两个字符串长度差值
public class TestDemo {
    public static void main(String[] args) {
        String s1 = new String("abc");
        String s2 = new String("ac");
        String s3 = new String("abc");
        String s4 = new String("abcdef");
        System.out.println(s1.compareTo(s2));
        System.out.println(s1.compareTo(s3));
        System.out.println(s1.compareTo(s4));
    }
}

在这里插入图片描述

4. int compareToIgnoreCase(String str) 方法:与compareTo方式相同,但是忽略大小写比较

public class TestDemo {
    public static void main(String[] args) {
        String s1 = new String("abc");
        String s2 = new String("ac");
        String s3 = new String("ABc");
        String s4 = new String("abcdef");
        System.out.println(s1.compareToIgnoreCase(s2));
        System.out.println(s1.compareToIgnoreCase(s3));
        System.out.println(s1.compareToIgnoreCase(s4));
    }
}

在这里插入图片描述

3.字符串的查找

在这里插入图片描述

public class TestDemo {
    public static void main(String[] args) {
        String str1 = "abcabababccde";
        char ch = str1.charAt(1); // 获得对应位置的字符
        System.out.println(ch);

        for (int i = 0; i < str1.length(); i++) {
            System.out.print(str1.charAt(i) + " ");
        }

        System.out.println(str1.indexOf('c'));//获得()内字符第一次出现的位置
        System.out.println(str1.indexOf('c',5));//从指定位置开始找()内字符相应的位置
        //相当于从主串当中 查找子串 KMP算法
        System.out.println(str1.indexOf("ab"));//获得()内字符串第一次出现的开始位置
        System.out.println(str1.indexOf("ab",2));//从指定位置开始找()内字符串相应的开始位置*/

        System.out.println(str1.lastIndexOf('a'));//获得()内字符最后一次出现的开始位置
        System.out.println(str1.lastIndexOf('a',7));//获得fromIndex长度的字符串(abcababa),获得()内字符最后出现的位置(从后往前找)
        System.out.println(str1.lastIndexOf("ab"));//获得()内字符串最后一次出现的开始位置
        System.out.println(str1.lastIndexOf("ca",7));//获得fromIndex长度的字符串(abcababa),获得()内字符最后出现的位置(从后往前找)
    }
}

4.字符串转换

1. 数值和字符串转化

class Person {}
public class TestDemo {
    public static void main(String[] args) {
        String str2 = String.valueOf(123);
        System.out.println(str2);
        String str3 = String.valueOf(new Person());
        System.out.println(str3);
        System.out.println("===========");
        //基本类型对应的类类型 -> 基本类型也提供了面向对象的思想
        String str4 = "123";
        int data = Integer.parseInt(str4);//将字符串转换为数字
        System.out.println(data);
    }
}

在这里插入图片描述

2. 大小写转换

public class TestDemo {
    public static void main(String[] args) {
        String str1 = "abcde";
        String str2 = "ABCD";
        System.out.println(str1.toUpperCase());//小写转大写
        System.out.println(str2.toLowerCase());//大写转小写
    }
}

在这里插入图片描述

3. 字符串转数组

public class TestDemo {
    public static void main(String[] args) {
        String str1 = "abcdef";
        char[] arr = str1.toCharArray();//字符串转数组
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }
}

在这里插入图片描述

4. 格式化

public class TestDemo {
    public static void main(String[] args) {
        String s = String.format("%d-%d-%d",2023,1,3);
        System.out.println(s);
    }
}

在这里插入图片描述

5.字符串替换

public class TestDemo {
    public static void main(String[] args) {
        String str1 = "ababcabcde";
        String ret1 = str1.replace('a','t');//将字符a替换为字符tt
        System.out.println(ret1);
        String ret2 = str1.replace("ab","tt");//将字符串ab替换为字符串tt
        System.out.println(ret2);
        String ret3 = str1.replaceAll("ab","66");//将字符串中所有ab替换为字符串66
        System.out.println(ret3);
        String ret4 = str1.replaceFirst("ab","tt");//将第一个字符串ab替换为字符串tt
        System.out.println(ret4);
    }
}

在这里插入图片描述

6.字符串拆分

public class TestDemo {
    public static void main(String[] args) {
        String str1 = "hello little boy";
        String[] ret1 = str1.split(" ");//将字符串全部拆分
        for (int i = 0; i < ret1.length; i++) {
            System.out.println(ret1[i]);
        }
        System.out.println("=============");
        String[] ret2 = str1.split(" ",2);//将字符串拆分成指定部分
        for (int i = 0; i < ret2 .length; i++) {
            System.out.println(ret2[i]);
        }
    }
}

在这里插入图片描述

public class TestDemo {
    public static void main(String[] args) {
        String str1 = "123&456=789";
        String[] ret1 = str1.split("&|=");//用竖线来把分割条件整合在一起,分割多次
        for (int i = 0; i < ret1.length; i++) {
            System.out.println(ret1[i]);
        }
        String str2 = "123\\456\\789";
        String[] ret2 = str2.split("\\\\");//需要进行转义
        for (int i = 0; i < ret2.length; i++) {
            System.out.println(ret2[i]);
        }
        String str3 = "123.456.789";
        String[] ret3 = str3.split("\\.");//需要进行转义
        for (int i = 0; i < ret3.length; i++) {
            System.out.println(ret1[i]);
        }
    }
}

在这里插入图片描述
注意事项

  1. 字符"|“,”*“,”+"都得加上转义字符,前面加上 “\” .
  2. 而如果是 “” ,那么就得写成 “\\” .
  3. 如果一个字符串中有多个分隔符,可以用"|"作为连字符.

7.字符串截取

public class TestDemo {
    public static void main(String[] args) {
        String str = "abcdefgh";
        //从2位置开始截取所有的字符
        String s1 = str.substring(2);
        System.out.println(s1);
        //从2位置开始截取到4的字符 [2,5)
        String s2 = str.substring(2, 5);
        System.out.println(s2);
    }
}

在这里插入图片描述
注意事项:

  1. 索引从0开始。

  2. 注意前闭后开区间的写法, substring(0, 5) 表示包含 0 号下标的字符, 不包含 5 号下标。

8.其余操作方法

在这里插入图片描述

2.字符串的不可变性

字符串的不可变性是指字符串一旦被创建,就会在堆上生成这个字符串的实例,并且不可被改变,任何方法都不会改变字符串本身,而只会创建一个新的字符串。

String s = "abcd";
s = s.concat("ef");

如上的代码,在内存中,就会出现 2 个字符串对象。
在这里插入图片描述
String类在设计时就是不可改变的,String类实现描述中已经说明了。

String类中的字符实际保存在内部维护的value字符数组中。

  1. String类被final修饰,表明该类不能被继承。
  2. value被修饰被final修饰,表明value自身的值不能改变,即不能引用其它字符数组,但是其引用空间中的内容可以修改。

所有涉及到可能修改字符串内容的操作都是创建一个新对象,改变的是新对象

final修饰类表明该类不想被继承,final修饰引用类型表明该引用变量不能引用其他对象,但是其引用对象中的内容是可以修改的。

3.字符串的修改

尽量避免直接对String类型对象进行修改,因为String类是不能修改的,所有的修改都会创建新对象,效率非常低下,所以通常我们 借助StringBuffer 和 StringBuilder来修改

在这里插入图片描述

public class TestDemo {
    public static void main(String[] args) {
        StringBuilder sb1 = new StringBuilder("hello");
        StringBuilder sb2 = sb1;
        sb1.append(' '); // hello
        sb1.append("world"); // hello world
        sb1.append(123); // hello world123
        System.out.println(sb1); // hello world123
        System.out.println(sb1 == sb2); // true
        System.out.println(sb1.charAt(0)); // 获取0号位上的字符 h
        System.out.println(sb1.length()); // 获取字符串的有效长度14
        System.out.println(sb1.capacity()); // 获取底层数组的总大小
        sb1.setCharAt(0, 'H'); // 设置任意位置的字符 Hello world123
        sb1.insert(0, "Hello world!!!"); // Hello world!!!Hello world123
        System.out.println(sb1);
        System.out.println(sb1.indexOf("Hello")); // 获取Hello第一次出现的位置
        System.out.println(sb1.lastIndexOf("hello")); // 获取hello最后一次出现的位置
        sb1.deleteCharAt(0); // 删除首字符
        sb1.delete(0,5); // 删除[0, 5)范围内的字符
        String str = sb1.substring(0, 5); // 截取[0, 5)区间中的字符以String的方式返回
        System.out.println(str);
        sb1.reverse(); // 字符串逆转
        str = sb1.toString(); // 将StringBuffer以String的方式返回
        System.out.println(str);
    }
}

在这里插入图片描述

从上述例子可以看出:String和StringBuilder最大的区别在于String的内容无法修改,而StringBuilder的内容可以修改。频繁修改字符串的情况考虑使用StringBuilder。

注意:String和StringBuilder类不能直接转换。如果要想互相转换,可以采用如下原则:

  1. String变为StringBuilder: 利用StringBuilder的构造方法或append()方法。

  2. StringBuilder变为String: 调用toString()方法。

4.String、StringBuffer、StringBuilder的区别

  1. String的内容不可修改,StringBuffer与StringBuilder的内容可以修改。
  2. StringBuffer与StringBuilder大部分功能是相似的。
  3. StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/136939.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】Linux基本权限

作者&#xff1a;一个喜欢猫咪的的程序员 专栏&#xff1a;《Linux》 喜欢的话&#xff1a;世间因为少年的挺身而出&#xff0c;而更加瑰丽。 ——《人民日报》 目录 1.shell命令以及运行原理 2.Linux权限 2.1Linux权限的概念 2.2Linux上用户…

DALLE2-文本图像生成

文章目录摘要算法解码器prior图像处理变体插值文本差异限制论文&#xff1a; 《Hierarchical Text-Conditional Image Generation with CLIP Latents》github&#xff1a; https://github.com/lucidrains/DALLE2-pytorchhttps://github.com/LAION-AI/dalle2-laion摘要 CLIP已经…

window环境安装mysql8.0.12版本的安装、配置(详细步骤图解)

目录一、mysql官网下载网址二、下载步骤三、安装步骤四、测试链接一、mysql官网下载网址 mysql官网下载网址 https://www.mysql.com/ 二、下载步骤 浏览器输入https://www.mysql.com/网址&#xff0c;点击【DownLoads】&#xff0c;如下图&#xff1a; 向下滑动网页&#x…

软件测试面试注意事项汇总

面对最近的复工热潮&#xff0c;不少求职者也开始蠢蠢欲动准备找工作了。相信大家都知道疫情下面试求职的压力是有史以来最大的&#xff0c;我们唯一能做好的只有积极的准备面试&#xff0c;让自己可以更加从容的面对的面试官的提问。下面小编为大家汇总了软件测试面试过程中的…

CSDN官方猿如意工具体验

2022年注定是不平凡的一年&#xff0c;2022再见&#xff0c;2023你好&#xff01; 2023愿我们发财&#xff0c;被爱&#xff0c;一路好运常在&#xff01;愿所念之人平安喜乐&#xff0c;所想之事顺心如意&#xff0c;岁岁常欢喜&#xff0c;万事皆胜意&#xff01; 猿如意工具…

中间件:Win10安装运行Kafka

一、JDK环境安装配置 可参考&#xff1a;百度安全验证 二、Zookeeper安装配置 1、下载 &#xff1a; Index of /dist/zookeeper/zookeeper-3.4.9 2、解压到本地&#xff0c;目录不要带中文符号&#xff0c;保证纯英文 3、zoo.cfg修改 4、cmd运行&#xff0c;使用命令zkServe…

ConcurrentHashMap 线程安全

JDK1.7 结构 数据结构是数组segment对象&#xff0c;采用segment分段锁和CAS保证并发。 加锁 JDK1.7中的ConcurrentHashMap是由 segment数组结构和 HashEntry 数组结构组成&#xff0c;即 ConcurrentHashMap把哈希桶切分成小数组(Segment )&#xff0c;每个Segment 有n个 Hash…

终于!Linaro 加盟 Zephyr 项目

导读为物联网构建实时操作系统的开源协作项目 Zephyr 项目宣布&#xff0c;Linaro 有限责任公司以白金会员的身份加盟该项目。Linaro是一家为 ARM 架构开发开源软件的协作工程组织&#xff0c;也是全球性机构&#xff0c;其 35 个成员中不乏来自多个行业部门的龙头企业。Linaro…

嵌入式实时操作系统的设计与开发(一)

以一款简单、易学的嵌入式开发平台ARM Mini2440&#xff08;CPU是三星ARM 9系列的ARM S3C2440&#xff09;为例&#xff0c;通过具体代码实现&#xff0c;介绍如何从裸板入手设计简单的轮询系统、前后台系统&#xff0c;以及如何一步一步在ARM Mini2440上编写RTOS内核&#xff…

Spring之配置非自定义Bean

目录 一&#xff1a;概述 二&#xff1a;代码演示 1)配置Druid数据源交由Spring管理 一&#xff1a;概述 以上在xml中配置的Bean都是自己定义的&#xff0c; 例如&#xff1a;UserDaolmpl&#xff0c; UserServicelmpl。但是&#xff0c; 在实际开发中有些 功能类并不是我们…

包装器和绑定器std::bind和std::function的回调技术

回调函数 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针&#xff08;地址&#xff09;作为参数传递给另一个函数&#xff0c;当这个指针被用来调用其所指向的函数时&#xff0c;我们就说这是回调函数。回调函数不是由该函数的实现方直接调用&#xff0c;而是在…

低代码搭建门店管理之收发货管理系统

随着电商的深入&#xff0c;不少门店都开始采用线上模式进行销售了&#xff0c;并且有的门店线上销售更是比线下销售更加火爆。因此&#xff0c;线上销售务必会涉及到收发货这个步骤。以前线上销售刚兴起的时候收发货只靠人工纸质化登记就能搞定&#xff0c;但是随着线上销售的…

盘点这些年稚晖君的DIY项目,看看他的技术栈有多强

近日&#xff0c;知名极客稚晖君在个人微博发文称自己将离职创业&#xff0c;开启一段新的旅程&#xff0c;“天才少年”将在机器人领域继续发光发热。 自2020年初发布第一个出圈视频《技术宅UP耗时三个月&#xff0c;自制B站最强小电视&#xff01;》以来&#xff0c;稚晖君共…

Vue实例的基本属性,computed计算属性,watch监听属性以及过滤器filters

目录 一、Vue实例的属性 二、Vue实例的计算属性&#xff1a;computed。计算属性结果会被缓存起来&#xff0c;当依赖的响应式属性发生变化时&#xff0c;才会重新计算&#xff0c;返回最终结果。 三、Vue实例的状态监听属性&#xff1a;watch&#xff0c;可以对元素的值的变…

JVM垃圾回收相关算法-垃圾标记阶段

文章目录学习资料垃圾回收概念概述垃圾回收相关算法垃圾标记阶段&#xff1a;对象存活判断引用计数算法可达性分析算法&#xff08;或根搜索算法、追踪性垃圾收集&#xff09;【Java使用算法】基本思路GC Roots对象的finalization机制对象处于三种可能的状态具体过程学习资料 …

WebDAV之葫芦儿·派盘+WebDAV Nav Lite

WebDAV Nav Lite 支持WebDAV方式连接葫芦儿派盘。 支持连接所有WebDAV服务器、云存储、NAS设备的管理工具,并可以直接管理设备内的文件?那快来试下WebDAV Nav Lite自动同步与管理工具吧。 WebDAV Nav Lite允许您

【Bootstrap】CSS全局样式

目录 一、HTML5文档类型 二、移动设备优先 三、禁用移动设备上的缩放功能 四、布局容器 1. container 类 ​2. container-fluid 类 五、标题 六、页面主体 七、文本 1. 内联文本元素 2. 文本对齐 ​3. 改变大小写 八、列表 1. 无序列表 2. 有序列表 3. 无样式列…

Hadoop数据仓库有哪些特征?

数据仓库(英语&#xff1a;Data Warehouse&#xff0c;简称数仓、DW),是一个用于存储、分析、报告的数据系统。数据仓库的目的是构建面向分析的集成化数据环境&#xff0c;分析结果为企业提供决策支持(Decision Support)。 数据仓库本身并不“生产”任何数据&#xff0c;其数据…

(1分钟)速通BA优化--光束法平差

SLAM中的BA优化&#xff0c;先根据相机模型和A,B图像特征匹配好的像素坐标&#xff0c;求出A图像上的像素坐标对应的归一化的空间点坐标&#xff0c;然后根据该空间点的坐标计算重投影到B图像上的像素坐标&#xff0c;重投影的像素坐标(估计值)与匹配好的B图像上的像素坐标(测量…

java流程控制的三种类型

1. 简介 在Java项目中&#xff0c;大多数的代码都是编写在一个个的类里面。每个类中还有很多个语句&#xff0c;并且会以英文的分号;来表示语句的结束。有些小白会很好奇&#xff0c;这一行行的代码语句是按照什么顺序执行的呢&#xff1f;是按照我们看到的从上到下的顺序执行…