《Java小子怒闯数据结构九重天》第二重天-字符串

《Java小子怒闯数据结构九重天》第二重天-字符串

前言

自古以来数据结构界就分为九重天,据说冲破这九重天之后就可以去进攻算法界最终修炼最后成大佬,受万人敬仰。

但是这谈何容易,因为每一重天都有神兽把守,想要冲破每一重天都必须收服守护的神兽才行。

守护九重天的神兽分别是:数组、字符串、栈、队列、链表、树、散列表、堆、图。可见他们的战斗力也是逐层增强的。想只凭靠自身的能力拿下他们谈何容易。

不过大家不必惊慌,我这里有一本上古秘籍《Java小子怒闯数据结构九重天》,里面有每一重天神兽的攻略。只要修炼者仔细钻研里面的每一篇,对九重天了如指掌之后,冲破这九重天也是易如反掌的。

今天为大家带来的是第二重天的攻略!

注意:所有资料都是免费提供!大家领取之后不要做收藏党哦!,获得更多自学java咨询!

目录

  • 前言
  • 1.字符串基础知识
  • 2.StringBuilder类
  • 3.初始化String类
  • 4.String类常用API
  • 5.字符串进阶练习
  • 结语

1.字符串基础知识

串(string)是由零个或多个字符组成的有限序列,又名字符串。

我们可以从这段段基本概念中知道:

  • 零个或多个字符组成:说明字符串的内部元素类型为字符。
  • 有限:说明字符串的内容长度是有一定限制的,小于一个最大范围,但是在该范围内,实际的长度是不确定的。
  • 序列:说明字符串中的相邻字符存在前驱和后继的关系。

在Java中没有内置的字符串类型,每个用双引号括起来的字符串都是Java中String类的一个实例。

也就是说Java中String并不是数据类型,在Java中所有的字符串都是String的实例化对象。

Java中的String

Java中的String类代表字符串,Java 程序中的所有字符串文字(例如“abc”)都为此类的实例。

也就是说,Java程序中所有的双引号字符串,都是 String 类的对象。String 类在 java.lang 包下,所以使用的时候不需要导包!

在Java中String最重要的特点就是:

String 类是不可改变的,所以你一旦创建了 String 对象,那它的值就无法改变了。我们将这种特性称为String的不可变性。

字符串的不可变性

不可变性:当你给一个字符串重新赋值之后,老值并没有在内存中销毁,而是重新开辟一块空间存储新值。

也就是说一旦一个String对象在内存中创建,它将是不可改变的,所有的String类中方法并不是改变String对象自己,而是重新创建一个新的String对象。

例如:

String s=”dcm”;String s=”ddccmm”

当s的值发生改变之后,ddccmm这个值并没有覆盖dcm,只是重新开发了一个新的空间去储存ddccmm然后将s指向它。

如果我们在实际开发中对含有大量字符的字符串进行遍历赋值修改,会对内存中产生很多无法释放的字符串对象,造成内存垃圾。

正因为String对象的不可变性,如果需要对字符串进行大量的修改、添加字符、删除字符等操作尽量不要使用String对象,因为这样会频繁的创建新的对象导致程序的执行效率下降。

这时我们可以使用Java中另外一个字符串类StringBuilder。

我们在做题的时候关于字符串一般用的都是String类,但是考虑到我们有时候也会用到StringBuilder类这里我就对StringBuilder类进行稍微细致一点的讲解。

2.StringBuilder类

StringBuilder 是一个可变的字符串类,我们可以把它看成是一个容器,这里的可变指StringBuilder对象中的内容是可变的。

2.1 StringBuilder类常用的方法

可以看出来,构建一个StringBuilder的对象只能使用它的构造方法来构造,不像String一样可以直接String s= “123”来创建

因为StringBuilder类对象是可变的,所以当我们对一个字符串需要进行改变比较多的时候一般定义为StringBuilder类。

2.2 String和StringBuilder的区别

String 对象是不可改变的。每次使用String 类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。

StringBuilder对象是动态对象,允许扩充它所封装的字符串中字符的数量,但是您可以为它可容纳的最大字符数指定一个值,当修改 StringBuilder 时,在达到容量之前,它不会为其自己重新分配空间。当达到容量时,将自动分配新的空间且容量翻倍。也就是说当对字符串进行改变时,都是对当前对象的状态进行更新的。

可以使用重载的构造函数之一来指定 StringBuilder 类的容量。

2.3 String类与StringBuilder类的相互转换

String类转换为StringBuilder类

public class String{ public static void main(String[] args){ String s = “baibai”; StringBuilder s1 = new StringBuilder(s); System.out.println(s1); }}

StringBuilder类转换为String类

public class String { public static void main(String[] args){ StringBuilder s1 = new StringBuilder(); //连续连接 s1.append(“abc”).append(“efg”); String s = s1.toString(); System.out.println(s); }}

3.初始化String类

3.1初始化String对象的两种方法:

//方法一:直接创建String s1= “大聪明 超牛的”;//方法二:对象创建String s2 = new String(“大聪明 超牛的”); String s3 = new String();//也可以创建一个空串

虽然两种方法看起来是一样的但是本质上是不一样的。String 创建的字符串存储在公共池中,而 new 创建的字符串对象在堆上。那存放在公共池(常量池)与堆中有什么不一样吗?

我们来举个例子:

String s1 = “大聪明 超牛的”; // String 直接创建String s2 = “大聪明 超牛的”; // String 直接创建String s3 = s1; // 相同引用String s4 = new String(“大聪明 超牛的”); // String 对象创建String s5 = new String(“大聪明 超牛的”); // String 对象创建System.out.println(System.identityHashCode(s1));System.out.println(System.identityHashCode(s2));System.out.println(System.identityHashCode(s3));System.out.println(System.identityHashCode(s4));System.out.println(System.identityHashCode(s5));

输出:

可见前三个字符串的地址相同,后两个各不相同!

这是因为直接创建的字符串时,会先在公共池中找有没有这样的字符串,如果有那就将引用直接指向它,而不去开发新的空间。在这里s1,s2,s3这三个引用指向了公共池中的同一块内存。

对象创建时,每次都会在堆上开新的空间来存放字符串,也就是说s4,s5分别指向在堆上的两块不同的内存,只不过这两块内存里面都储存着相同的东西。

4.String类常用API

这里再次强调一下,我们在做题的时候遇到关于字符串相关题目我们几乎都是使用String类来解决问题,除了在字符串进行大量更改时我们可能会暂时用到StringBuilder类。

这里的暂时就是我们在对字符串更改等操作之后一般还是要把字符串转换为String类的。

所以我们要学习的API主要还是String类的API。对应刷题我StringBuilder的API我们只需要学习上面提到的两个就够了。

String 类在 java.lang 包下,所以使用的时候不需要导包!

4.1 基本数据类型转换成字符串

有三种办法:

(1)基本类型数据的值+“” (最常用,最简单);(2)使用包装类中的静态方法 static String toString(int i)返回一个表示指定整数的String 对象。如:在Integer中:Integer.toString(6);(3)使用String类中的静态方法 static String valueOf(int i) 返回int 参数的字符串表示形式。如:String.valueOf(6);

String 类别中已经提供了将基本数据型态转换成 String 的 static 方法也就是 String.valueOf() 这个参数多载的方法 :

String.valueOf(boolean b) //将 boolean 变量 b 转换成字符串 String.valueOf(char c) //将 char 变量 c 转换成字符串 String.valueOf(char[] data)//将 char 数组 data 转换成字符串 String.valueOf(char[] data, int offset, int count)//将char数组data中由data[offset]开始取 count个元素转换成字符串 String.valueOf(double d)//将 double 变量 d 转换成字符串 String.valueOf(float f)//将 float 变量 f 转换成字符串 String.valueOf(int i)//将 int 变量 i 转换成字符串 String.valueOf(long l)//将 long 变量 l 转换成字符串 String.valueOf(Object obj)//将 obj 对象转换成 字符串, 等于 obj.toString()

因为是静态方法所以不需要实例化。

4.2 字符串转换为基本数据类型

一般使用包装类的静态方法parseXX(“字符串”)

要将 String 转换成基本数据类型大多需要使用基本数据型态的包装类别,如:String 转换成 byte可以使用 Byte.parseByte(String s)

Byte.parseByte(String s)//将 s 转换成 byte Byte.parseByte(String s, int radix)//以 radix 为基底 将 s 转换为 byteDouble.parseDouble(String s)//将 s 转换成 double Float.parseFloat(String s)//将 s 转换成 float Integer.parseInt(String s)//将 s 转换成 int Long.parseLong(String s)//将 s 转换成 long

注意这里也是静态方法,只不过都是对应包装类的静态方法

4.3 使用length()得到一个字符串的字符个数

int len = String.length();

4.4 使用toCharArray() 将一个字符串转换成字符数组

Char[] arr = String.toCharArray();

4.5 判断两个字符串的内容是否相等返回true/false

String1.equals(String2);//区分大小写String1.equalsIgnoreCase(String2);//不区分大小写

4.6 与位置相关的字符串

charAt(int)//得到指定下标位置对应的字符indexOf(String)//得到指定内容第一次出现的下标lastIndexOf(String)//得到指定内容最后一次出现的下标

4.7 将一个字符串按照指定内容劈开split(String) ,返回字符串数组。

String s = “wa,dcm,nb!”;String[] str = s.split(“,”);//返回结果中str[1]=dcm

4.8 contains(String) 判断一个字符串里面是否包含指定的内容,返回true/false

Boolean a = String1.contains(String2)

4.9 使用substring()截取字符串,返回子串

String.substring(int)//从指定下标开始一直截取到字符串的最后String.substring(int,int)//从下标x截取到下标y-1对应的元素

4.10 字符串大小写转换

String.toUpperCase()//将一个字符串全部转换成大写String.toLowerCase()//将一个字符串全部转换成小写

4.11 使用replace()进行字符串内容替换

String.replace(String,String)//将某个内容全部替换成指定内容String.replaceAll(String,String)//将某个内容全部替换成指定内容,支持正则String.repalceFirst(String,String)//将第一次出现的某个内容替换成指定的内容

5.字符串进阶练习

387. 字符串中的第一个唯一字符

题解:

把字符串的单个字符转化为对应数组下标,遍历一遍字符串获得26个字母分别出现几次。然后在遍历一遍字符串看哪个字符先出现次数为1,就输出对应下标。

class Solution { public int firstUniqChar(String s) { int len = s.length(); int[] vis = new int[26]; int temp = -1; for(int i = 0; i < len; i ++) { vis[s.charAt(i) – 'a'] ++; } for(int i = 0; i < len; i ++) { if(vis[s.charAt(i) – 'a'] == 1) { return i; } } return -1; }}

或者我们也可以把字符串先转换为字符数组来解题,原理都是一样的!

class Solution { public int firstUniqChar(String s) { int[] arr = new int[26]; char[] chars = s.toCharArray(); for (int i = 0; i < chars.length; i++) { arr[chars[i] – 'a']++; } for (int i = 0; i < chars.length; i++) { if (arr[chars[i] – 'a'] == 1) { return i; } } return -1; }}

结语

恭喜你修炼到这里,你已经基本有了收服神兽字符串的能力。神兽字符串是我们到进攻算法界最基础的能力之一。大家不可懈怠。

感兴趣的修炼者可以关注下面公众号,会持续推送最新更新的!

持续更新中…

原文链接:https://mp.weixin.qq.com/s/5-uS4SGYLzqilLX8HkXBqw

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
用户投稿
上一篇 2022年6月20日 06:09
下一篇 2022年6月20日 06:09

相关推荐

  • 分享4条发微商朋友圈的方法(微商朋友圈应该怎么发)

    对于微商朋友来说,朋友圈的重要性不言而喻了。 那么微商的朋友圈到底该怎么发呢? 为什么同样是经营一个朋友圈,有的微商看起来逼格满满,实际效果也不错;而有的却动都不动就被屏蔽甚至拉黑…

    2022年11月27日
  • 短视频策划内容的3个要点(短视频策划内容怎么做)

    短视频在制作时,内容框架非常重要。如果直奔主题,然后结束,聚卓告诉你,这样的短视频已经过时了。现在的短视频需要框架的,但不是任何框架,它需要一种易于理解和消化的框架。而且,现在大多…

    2022年11月27日
  • 笔记本最好配置(目前笔记本最好的配置)

    本文主要讲的是笔记本最好配置,以及和目前笔记本最好的配置相关的知识,如果觉得本文对您有所帮助,不要忘了将本文分享给朋友。 笔记本电脑什么配置好? 01 CPU:这个主要取决于频率和…

    2022年11月26日
  • 存储过程语法(sql server存储过程语法)

    今天小编给各位分享存储过程语法的知识,其中也会对sql server存储过程语法进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧! oracle存储过程基本语法…

    2022年11月26日
  • 《宝可梦朱紫》梦特性怎么获得?隐藏特性获取方法推荐

    宝可梦朱紫里有很多宝可梦都是拥有梦特性会变强的宝可梦,很多玩家不知道梦特性怎么获得,下面就给大家带来宝可梦朱紫隐藏特性获取方法推荐,感兴趣的小伙伴一起来看看吧,希望能帮助到大家。 …

    2022年11月25日
  • 《宝可梦朱紫》奇鲁莉安怎么进化?奇鲁莉安进化方法分享

    宝可梦朱紫中的奇鲁莉安要怎么进化呢?很多玩家都不知道,下面就给大家带来宝可梦朱紫奇鲁莉安进化方法分享,感兴趣的小伙伴一起来看看吧,希望能帮助到大家。 奇鲁莉安进化方法分享 奇鲁莉安…

    2022年11月25日
  • 小红书平台的一些机制及玩法详解(小红书玩法有哪些)

    关于小红书 一:小红书平台的一些机制 1. 笔记内容的CES评分机制 2. 笔记流量入口与长尾效应 二:小红书优质笔记的特点(分维度、类型分析) 1.笔记的本身架构组成 维度 2.…

    2022年11月25日
  • 博客营销的3大优势解析(博客营销怎么做)

    不知不觉已经写了24篇文章,加上这篇是第25篇了,都是自己这几年来用过的营销方法,如果遇到有些不懂的,我会咨询我的朋友和同事帮忙,尽量让每一篇有价值,哪怕是对大家有一点点帮助也行,…

    2022年11月25日
  • 什么是内容营销策略如何策划一套成功的内容营销策略

    很多时候,营销人员会在创作营销内容时感到沮丧,这也是很多企业至今没用好数字化营销工具的重要原因之一。 举个例子,您可能会花上数小时期待制作一些令人惊叹的东西,实际却是得到很少的受众…

    2022年11月25日
  • 直播带货详细脚本(直播文案策划怎么写)

    短视频运营策划方案怎么写?涉及哪几个方面? 我在网上看到好多千篇一律的文章,关于【短视频运营策划方案】这一块,基本都是在讲账号的内容本身。 你内容做得再好,却不掌握算法的规律,能有…

    2022年11月25日

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息