Java-String 类·下

news2024/11/18 0:47:34

Java-String 类·下

  • 5. 字符, 字节与字符串
    • 5.1 字符与字符串
    • 5.2 字节与字符串
    • 5.3 小结
  • 6.字符串常见操作
    • 6.1 字符串比较
    • 6.2 字符串查找
    • 6.3 字符串替换
    • 6.4 字符串拆分
    • 6.5 字符串截取
    • 6.6 其他操作方法
  • 7. `StringBuffer` 和 `StringBuilder`
  • 补充

大家好,我是晓星航。今天为大家带来的也是Java String字符串的讲解!😀

5. 字符, 字节与字符串

5.1 字符与字符串

字符串内部包含一个字符数组,String 可以和 char[] 相互转换.

1.字符数组变为字符串:

    public static void main(String[] args) {
        char[] val = {'a','b','c','d','e'};
        String str = new String(val);
        System.out.println(str);
    }

2.指定字符数组变为字符串:

   public static void main(String[] args) {
        char[] val = {'a','b','c','d','e'};
        String str = new String(val,1,3);//第一个参数是开始变得字符下标  第二个参数是要变的字符个数
        System.out.println(str);
    }

3.获取指定位置的字符:

    public static void main(String[] args) {
        String str = "hello" ;
        System.out.println(str.charAt(0)); // 下标从 0 开始
    }
public static void main(String[] args) {
    String str = "hello" ;
    System.out.println(str.charAt(10));
}

4.将字符串变为字符数组:

public static void main(String[] args) {
    String str = "helloworld" ;
    char[] chars =str.toCharArray();//把str指向的字符串对象变为字符数组
    System.out.println(Arrays.toString(chars));
}

代码示例: 给定字符串一个字符串, 判断其是否全部由数字所组成.

思路: 将字符串变为字符数组而后判断每一位字符是否是" 0 “~”‘9’"之间的内容,如果是则为数字.

public static boolean isNumber(String str) {
    char[] array = str.toCharArray();
    for (int i = 0; i < array.length; i++) {
        if (array[i] < '0' || array[i] > '9') {
            return false;
        }
    }
    return true;
}
public static void main(String[] args) {
    String str = "12a34567";
    System.out.println(isNumber(str));
}

5.2 字节与字符串

字节常用于数据传输以及编码转换的处理之中,String 也能方便的和 byte[] 相互转换.

1.将字节数组变为字符串:

public static void main(String[] args) {
    byte[] bytes = {97,98,99,100};
    String str = new String(bytes);
    System.out.println(str);
}

2.将部分字节数组中的内容变为字符串:

public static void main(String[] args) {
    byte[] bytes = {97,98,99,100,101,102};
    String str = new String(bytes,1,4);//第一个参数是开始变得字符下标  第二个参数是要变的字符个数
    System.out.println(str);
}

3.将字符串以字节数组的形式返回:

public static void main(String[] args) {
    String str = "abcd";
    byte[] bytes = str.getBytes();
    System.out.println(Arrays.toString(bytes));
}

4.编码转换处理:

public static void main(String[] args) throws UnsupportedEncodingException {
    String str = "abcd";
    byte[] bytes = str.getBytes("GBK");
    System.out.println(Arrays.toString(bytes));
}

5.3 小结

那么何时使用 byte[], 何时使用 char[] 呢?

  • byte[] 是把 String 按照一个字节一个字节的方式处理, 这种适合在网络传输, 数据存储这样的场景下使用. 更适合针对二进制数据来操作.
  • char[] 是吧 String 按照一个字符一个字符的方式处理, 更适合针对文本数据来操作, 尤其是包含中文的时候.

回忆概念: 文本数据 vs 二进制数据

一个简单粗暴的区分方式就是用记事本打开能不能看懂里面的内容.

如果看的懂, 就是文本数据(例如 .java 文件), 如果看不懂, 就是二进制数据(例如 .class 文件).

6.字符串常见操作

6.1 字符串比较

上面使用过String类提供的equals()方法,该方法本身是可以进行区分大小写的相等判断。除了这个方法之外,String类还提供有如下的比较操作:

代码示例: 不区分大小写比较

String str1 = "hello" ;
String str2 = "Hello" ;
System.out.println(str1.equals(str2)); // false 
System.out.println(str1.equalsIgnoreCase(str2)); // true 

注意:equalsIgnoreCase是忽略大小写的意思。

在String类中compareTo()方法是一个非常重要的方法,该方法返回一个整型,该数据会根据大小关系返回三类内容:

  1. 相等:返回 0.
  2. 小于:返回内容小于 0.
  3. 大于:返回内容大于 0。

范例:观察compareTo()比较

System.out.println("A".compareTo("a")); // -32 
System.out.println("a".compareTo("A")); // 32 
System.out.println("A".compareTo("A")); // 0 
System.out.println("AB".compareTo("AC")); // -1 
System.out.println("刘".compareTo("杨"));

compareTo()是一个可以区分大小关系的方法,是String方法里是一个非常重要的方法。这里的返回值就是前面字符对应的数值减去后面的字符所对应的数值。

字符串的比较大小规则, 总结成三个字 “字典序” 相当于判定两个字符串在一本词典的前面还是后面. 先比较第一个字符的大小(根据 unicode 的值来判定), 如果不分胜负, 就依次比较后面的内容

6.2 字符串查找

从一个完整的字符串之中可以判断指定内容是否存在,对于查找方法有如下定义:

代码示例: 字符串查找,最好用最方便的就是contains() ——(类似于C语言的strstr)

String str = "helloworld" ; 
System.out.println(str.contains("world")); // true 

该判断形式是从JDK1.5之后开始追加的,在JDK1.5以前要想实现与之类似的功能,就必须借助、indexOf()方法完成。

代码示例: 使用indexOf()方法进行位置查找(找到之后返回我们查找元素的第一个位置)

String str = "helloworld" ;
System.out.println(str.indexOf("world")); // 5,w开始的索引
System.out.println(str.indexOf("bit")); // -1,没有查到
if (str.indexOf("hello") != -1) {
    System.out.println("可以查到指定字符串!");
}

现在基本都是用contains()方法完成。

使用indexOf()需要注意的是,如果内容重复,它只能返回查找的第一个位置

代码示例: 使用indexOf()的注意点

String str = "helloworld" ;
System.out.println(str.indexOf("l")); // 2 
System.out.println(str.indexOf("l",5)); // 8 
System.out.println(str.lastIndexOf("l")); // 8

在进行查找的时候往往会判断开头或结尾。

代码示例: 判断开头或结尾

String str = "**@@helloworld!!" ;
System.out.println(str.startsWith("**")); // true 
System.out.println(str.startsWith("@@",2)); // ture 
System.out.println(str.endsWith("!!")); // true

6.3 字符串替换

使用一个指定的新的字符串替换掉已有的字符串数据,可用的方法如下:

代码示例: 字符串的替换处理

String str = "helloworld" ;
System.out.println(str.replaceAll("l", "_"));
System.out.println(str.replaceFirst("l", "_"));

注意事项: 由于字符串是不可变对象 , 替换不修改当前字符串, 而是产生一个新的字符串.

6.4 字符串拆分

可以将一个完整的字符串按照指定的分隔符划分为若干个子字符串。

可用方法如下:

代码示例: 实现字符串的拆分处理

String str = "hello world hello bit" ;
String[] result = str.split(" ") ; // 按照空格拆分
for(String s: result) {
    System.out.println(s);
}

代码示例: 字符串的部分拆分

String str = "hello world hello bit" ;
String[] result = str.split(" ",2) ;
for(String s: result) {
    System.out.println(s);
}

拆分是特别常用的操作. 一定要重点掌握. 另外有些特殊字符作为分割符可能无法正确切分, 需要加上转义.

代码示例: 拆分IP地址

String str = "192.168.1.1" ;
String[] result = str.split("\\.") ;
for(String s: result) {
    System.out.println(s);
}

​ 注意事项:

  1. 字符"|“,”*“,”+“,”.“都得加上转义字符,前面加上”".
  2. 而如果是"“,那么就得写成”\\".(\等于一个,而\本身又需要一个\来进行转义)
  3. 如果一个字符串中有多个分隔符,可以用"|"作为连字符.代码示例: 多次拆分

代码示例: 多次拆分

String str = "name=zhangsan&age=18" ;
String[] result = str.split("&") ;
for (int i = 0; i < result.length; i++) {
    String[] temp = result[i].split("=") ;
    System.out.println(temp[0]+" = "+temp[1]);
}

这种代码在以后的开发之中会经常出现

6.5 字符串截取

从一个完整的字符串之中截取出部分内容。可用方法如下:

代码示例: 观察字符串截取

String str = "helloworld" ;
System.out.println(str.substring(5));//从第5个字符位置的位置开始截取到结尾
System.out.println(str.substring(0, 5));//从0位置开始截取到第5位置的元素

注意事项:

  1. 索引从0开始
  2. 注意前闭后开区间(左闭右开)的写法, substring(0, 5) 表示包含 0 号下标的字符, 不包含 5 号下标,所以下图不包含’w’字符

6.6 其他操作方法

代码示例: 观察trim()方法的使用

String str = " hello world " ;
System.out.println("["+str+"]");
System.out.println("["+str.trim()+"]");

trim 会去掉字符串开头和结尾的空白字符(空格, 换行, 制表符等).

代码示例: 大小写转换

String str = " hello%$$%@#$%world 哈哈哈 " ;
System.out.println(str.toUpperCase());
System.out.println(str.toLowerCase());

这两个函数只转换字母。

代码示例: 字符串length() —— 取得字符串长度

String str = " hello%$$%@#$%world 哈哈哈 " ;
System.out.println(str.length());

注意:数组长度使用数组名称.length属性,而String中使用的是length()方法

代码示例: 观察isEmpty()方法 —— 判断是否为空字符串(不是null,而是长度为0)

System.out.println("hello".isEmpty());
System.out.println("".isEmpty());
System.out.println(new String().isEmpty());

String类并没有提供首字母大写操作,需要自己实现.

代码示例: 首字母大写

public static void main(String[] args) {
    System.out.println(fistUpper("yuisama"));
    System.out.println(fistUpper(""));
    System.out.println(fistUpper("a"));
}
public static String fistUpper(String str) {
    if ("".equals(str)||str==null) {
        return str ;
    }
    if (str.length()>1) {
        return str.substring(0, 1).toUpperCase()+str.substring(1) ;
    }
    return str.toUpperCase() ;
}

7. StringBufferStringBuilder

首先来回顾下String类的特点:

任何的字符串常量都是String对象,而且String的常量一旦声明不可改变,如果改变对象内容,改变的是其引用的指向而已。

通常来讲String的操作比较简单,但是由于String的不可更改特性,为了方便字符串的修改,提供StringBufferStringBuilder类。

StringBufferStringBuilder 大部分功能是相同的,我们主要介绍 StringBuffer

在String中使用"+"来进行字符串连接,但是这个操作在StringBuffer类中需要更改为append()方法:

public synchronized StringBuffer append(各种数据类型 b)

范例:观察StringBuffer使用

public class Test{
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer();
        sb.append("Hello").append("World");
        fun(sb);
        System.out.println(sb);
    }
    public static void fun(StringBuffer temp) {
        temp.append("\n").append("www.bit.com.cn");
    }
}

String和StringBuffer最大的区别在于:String的内容无法修改,而**StringBuffer的内容可以修改**。频繁修改字符串的情况考虑使用StingBuffer

为了更好理解String和StringBuffer,我们来看这两个类的继承结构:

可以发现两个类都是"CharSequence"接口的子类。这个接口描述的是一系列的字符集。所以字符串是字符集的子类,如果以后看见CharSequence,最简单的联想就是字符串。

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

  • String变为StringBuffer:利用StringBuffer的构造方法或append()方法
public static void main(String[] args) {
    StringBuilder sb = new StringBuilder();
    sb.append("abcdef");
    System.out.println(sb.toString());
}
  • StringBuffer变为String:调用toString()方法。

除了append()方法外,StringBuffer也有一些String类没有的方法:

  • 字符串反转:
public synchronized StringBuffer reverse()

代码示例: 字符串反转(reverse)

StringBuffer sb = new StringBuffer("helloworld");
System.out.println(sb.reverse());

删除指定范围的数据(delete):

public synchronized StringBuffer delete(int start, int end)

代码示例: 观察删除操作( delete( , ) )

StringBuffer sb = new StringBuffer("helloworld"); 
System.out.println(sb.delete(5, 10)); 

插入数据(insert)

public synchronized StringBuffer insert(int offset, 各种数据类型 b) 

代码示例: 观察插入操作( insert( , ) )

StringBuffer sb = new StringBuffer("helloworld"); 
System.out.println(sb.delete(5, 10).insert(0, "你好")); 

synchronized关键字——保证线程安全(类似于上🔒)

面试题:请解释String、StringBufferStringBuilder的区别:

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

小结

字符串操作是我们以后工作中非常常用的操作. 使用起来都非常简单方便, 一定要使用熟练.

指的注意的点:

  1. 字符串的比较, ==, equals, compareTo 之间的区别.
  2. 了解字符串常量池, 体会 “池” 的思想.
  3. 理解字符串不可变
  4. split 的应用场景
  5. StringBufferStringBuilder 的功能.

补充

1.什么是哈希表:数据结构–>描述和组织数据的一种方式。

12 45 2 7 15 92

问题:如何去查找到一个关键字

1、顺序查找:通过关键字的一个一个的比较,才能找到O(n)

2、排序+二分查找

哈希表时间效率非常高 效率可以高到O(1)。

2.数组的赋值 只有1次机会 就是在定义的时候

array不可以直接进行二次赋值,如下图所示:

我们在new了一个新的array后,我们就可以对array进行二次赋值了

但是我们的数组array用了final修饰后就不可以改变了

若array被final修饰后,还想修改array的值,那我们便需要通过反射修改array

感谢各位读者的阅读,本文章有任何错误都可以在评论区发表你们的意见,我会对文章进行改正的。如果本文章对你有帮助请动一动你们敏捷的小手点一点赞,你的每一次鼓励都是作者创作的动力哦!😘

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

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

相关文章

计算机网络体系结构

目录常见的计算机网络体系结构计算机网络体系结构分层的必要性计算机网络体系结构分层思想举例计算机网络体系结构中的专用术语常见的计算机网络体系结构 TCP/IP体系结构相当于将OSI体系结构的物理层和数据链路层合并为网络接口层。并去掉了会话层和表示层。 由于TCP/IP在网络…

Java爬虫 爬取某招聘网站招聘信息

Java爬虫 爬取某招聘网站招聘信息一、系统介绍二、功能展示1.需求爬取的网站内容2.实现流程2.1数据采集2.2页面解析2.3数据存储三、获取源码一、系统介绍 系统主要功能&#xff1a;本项目爬取的XX招聘网站 二、功能展示 1.需求爬取的网站内容 2.实现流程 爬虫可以分为三个模…

[Kettle] Kettle界面介绍

启动Kettle后&#xff0c;弹出Kettle的欢迎界面 有关界面的构成和说明如下所示 ①标题栏&#xff1a;显示界面标题名称 ②菜单栏&#xff1a;分别有【文件】|【编辑】|【视图】|【执行】|【工具】|【帮助】六个菜单栏 ③工具图标栏&#xff1a;显示图形化的常用和重要的菜单项…

SAP MM采购定价过程字段解析

下面我们针对每一个字段进行解释和用途分析 &#xff1a; 1、 步骤&#xff1a;代表了创建PO时&#xff0c;哪个条件类型放到前面&#xff0c;哪个放到后面&#xff0c;如果步骤号相同&#xff0c;那就以谁先选择出来谁就在前面。 2、 计数&#xff1a;没有任何实际意义&a…

DaVinci:神奇遮罩

调色页面&#xff1a;神奇遮罩Color&#xff1a;Magic Mask神奇遮罩 Magic Mask基于人工智能技术&#xff0c;在检视器中绘制一个笔画&#xff0c;就能识别出笔画所在的对象&#xff0c;并以此自动创建遮罩。先确定要对画面上的物体还是人体做遮罩。若是对人体做遮罩&#xff0…

【闲来无聊写个几个小特效——五角星,小光圈,探照灯】

五角星&#xff0c;见过吧&#xff0c;如果是你&#xff0c;你如何使用代码写一个五角星呢&#xff1f;思考一下&#xff0c;你会说&#xff0c;先这样在那样就好啦&#xff0c;可是真正上手的时候却修修改改磕磕绊绊来看一下今天的五角星如何用几行代码实现 1.绘制五角星 四行…

Pytorch进行自定义Dataset 和 Dataloader 原理

1、自定义加载数据 在pytorch中&#xff0c;数据集对象被抽象为Dataset类&#xff0c;实现自定义的数据集需要继承Dataset&#xff0c;并实现相应的方法。 在学习Pytorch的教程时&#xff0c;加载数据许多时候都是直接调用torchvision.datasets里面集成的数据集&#xff0c;直…

GO第 4 章:运算符

第 4 章 运算符 4.1 运算符的基本介绍 运算符是一种特殊的符号&#xff0c;用以表示数据的运算、赋值和比较等 运算符是一种特殊的符号&#xff0c;用以表示数据的运算、赋值和比较等 算术运算符 赋值运算符 比较运算符/关系运算符 逻辑运算符 位运算符 其它运算 4.2 …

Java开发环境安装

总步骤 第一步&#xff1a;安装JDK&#xff08;Java Development Kit&#xff0c;Java软件开发工具包&#xff09; 第二步&#xff1a;安装IDEA&#xff08;是Java语言的集成开发环境&#xff09; 一、安装JDK Windows下最简单的Java环境安装指南 - 大博哥VV6 - 博客园 (cnblo…

微信小程序框架

框架 小程序开发框架的目标是通过尽可能简单、高效的方式让开发者可以在微信中开发具有原生 APP 体验的服务。 整个小程序框架系统分为两部分&#xff1a;逻辑层&#xff08;App Service&#xff09;和 视图层&#xff08;View&#xff09;。小程序提供了自己的视图层描述语言…

【Linux】进程创建、进程终止和进程等待

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《学会Linux》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;进程创建&…

力扣刷题记录——231. 2 的幂、228. 汇总区间、242. 有效的字母异位词

本专栏主要记录力扣的刷题记录&#xff0c;备战蓝桥杯&#xff0c;供复盘和优化算法使用&#xff0c;也希望给大家带来帮助&#xff0c;博主是算法小白&#xff0c;希望各位大佬不要见笑&#xff0c;今天要分享的是——《231. 2 的幂、228. 汇总区间、242. 有效的字母异位词》。…

【王道操作系统】2.2.4 作业进程调度算法(FCFS先来先服务、SJF短作业优先、HRRN高响应比优先)

作业进程调度算法(FCFS先来先服务、SJF短作业优先、HRRN高响应比优先) 文章目录作业进程调度算法(FCFS先来先服务、SJF短作业优先、HRRN高响应比优先)1.先来先服务(FCFS)2.短作业优先(SJF)3.高响应比优先(HRRN)4.三种算法的对比和总结1.先来先服务(FCFS) 先来先服务调度算法(F…

区间选点 and 最大不相交区间

区间选点 题目描述 给定 N 个闭区间 [ai,bi]&#xff0c;请你在数轴上选择尽量少的点&#xff0c;使得每个区间内至少包含一个选出的点。 输出选择的点的最小数量。 位于区间端点上的点也算作区间内。 输入输出及样例 最大不相交区间 题目描述 给定 N 个闭区间 [ai,bi]&…

ArcGIS基础实验操作100例--实验32计算栅格行列号

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验32 计算栅格行列号 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&am…

GPU存储器架构-- 全局内存 本地内存 寄存器堆 共享内存 常量内存 纹理内存

上表表述了各种存储器的各种特性。作用范围栏定义了程序的哪个部分能使用该存储器。而生存期定义了该存储器中的数据对程序可见的时间。除此之外&#xff0c;Ll和L2缓存也可以用于GPU程序以便更快地访问存储器。 总之&#xff0c;所有线程都有一个寄存器堆&#xff0c;它是最快…

【PDPTW】python调用guribo求解PDPTW问题(Li Lim‘s benchmark)之二

原文连接&#xff1a;知乎《使用Python调用Gurobi求解PDPTW问题&#xff08;Li & Lim’s benchmark&#xff09;》 分析文章&#xff1a;文章目录修改utlis.pytest.py运行DataPath"lc101.txt"修改 以及修改公示约束&#xff08;8&#xff09;与代码不符合的问题…

【QT开发笔记-基础篇】| 第五章 绘图QPainter | 5.13 抗锯齿

本节对应的视频讲解&#xff1a;B_站_视_频 https://www.bilibili.com/video/BV1YP4y1B7Ex 本节讲解抗锯齿效果 前面实现的效果中&#xff0c;仔细观看能看到明显的锯齿的效果&#xff0c;如下&#xff1a; 此时&#xff0c;可以增加抗锯齿的效果。 1. 关联信号槽 首先&…

22年12月日常实习总结

12月结束了&#xff0c;8月末开始准备的日常实习也算是告一段落了 准备了2个多月&#xff0c;面试了一个月&#xff0c;也拿了一些offer 算是小有感触&#xff0c;遂写下此文&#xff0c;供还在准备或者要准备日常实习的同学参考。 个人背景及投递的日常实录在这篇文章里 24…

RegNet——颠覆常规神经网络认知的卷积神经网络(网络结构详解+详细注释代码+核心思想讲解)——pytorch实现

RegNet的博客的准备我可谓是话费了很多的时间&#xff0c;参考了诸多大佬的资料&#xff0c;主要是网上对于这个网络的讲解有点少&#xff0c;毕竟这个网络很新。网上可以参考的资料太少&#xff0c;耗费了相当多的时间&#xff0c;不过一切都是值得的&#xff0c;毕竟学完之后…