算法设计中,对字符串的操作不可谓不常见,切片,旋转,复制,连接等等,因此对字符串的一些基础知识可以适当的了解掌握。

在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。

String类是不可变类,即一旦一个String对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁。

String字符串

1.字符串常用的方法。

字符串的创建

创建字符串最简单的方式如下:

String str = "Runoob";

用构造函数创建字符串:

String str2=new String("Runoob");

String 创建的字符串存储在公共池中,而 new 创建的字符串对象在堆上:

String s1 = "Runoob";              // String 直接创建
String s2 = "Runoob";              // String 直接创建
String s3 = s1;                    // 相同引用
String s4 = new String("Runoob");   // String 对象创建
String s5 = new String("Runoob");   // String 对象创建

字符串常用方法
char charAt(int index)  //返回指定索引处的 char 值。
String concat(String str) //将指定字符串连接到此字符串的结尾。
boolean contentEquals(StringBuffer sb) //当且仅当字符串与指定的StringBuffer有相同顺序的字符时候返回真。
int indexOf(int ch) //返回指定字符在此字符串中第一次出现处的索引。
int indexOf(String str) //返回指定子字符串在此字符串中第一次出现处的索引。
int lastIndexOf(int ch) //返回指定字符在此字符串中最后一次出现处的索引。
int lastIndexOf(String str) //返回指定子字符串在此字符串中最右边出现处的索引。
int length() //返回此字符串的长度。
String replace(char oldChar, char newChar) //返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。
String substring(int beginIndex) //返回一个新的字符串,它是此字符串的一个子字符串。
char[] toCharArray() //将此字符串转换为一个新的字符数组。
String toLowerCase() //使用默认语言环境的规则将此 String 中的所有字符都转换为小写。
String toUpperCase() //使用默认语言环境的规则将此 String 中的所有字符都转换为大写。
String toString() //返回此对象本身(它已经是一个字符串!)。
String trim() //返回字符串的副本,忽略前导空白和尾部空白。
contains(CharSequence chars) //判断是否包含指定的字符系列。
isEmpty() //判断字符串是否为空。
String[] split(String regex) //根据给定正则表达式的匹配拆分此字符串。

注意:String 类是不可改变的,所以你一旦创建了 String 对象,那它的值就无法改变了(详看笔记部分解析)。

如果需要对字符串做很多修改,那么应该选择使用 StringBuffer & StringBuilder 类。

StringBuffer & StringBuilder 类

当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。

和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。

在使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,所以如果需要对字符串进行修改推荐使用 StringBuffer。

StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。

由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。

StringBuffer:StringBuffer对象则代表一个字符序列可变的字符串,当一个StringBuffer被创建以后,通过StringBuffer提供的append()、insert()、reverse()、setCharAt()、setLength()等方法可以改变这个字符串对象的字符序列。一旦通过StringBuffer生成了最终想要的字符串,就可以调用它的toString()方法将其转换为一个String对象。

StringBuilder:StringBuilder类也代表可变字符串对象。StringBuffer是线程安全的,而StringBuilder则没有实现线程安全功能,所以性能略高。

力扣关于字符串的题。

1)剑指offer58:翻转单词顺序。

题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。

解题思路:使用StringBuilder对字符串对象进行操作。利用 “字符串分割”、“列表倒序” 的内置函数 ,可简便地实现本题的字符串翻转要求。

算法代码

class Solution {public String reverseWords(String s) {s = s.trim(); //去掉两端空格String[] string = s.split(" ");StringBuilder res = new StringBuilder();for(int i=string.length-1;i>=0;i--){if(string[i].equals(" ")||string[i].equals("")){continue;}res.append(string[i]);res.append(" ");}return res.toString().trim();}
}

方法二:双指针

解题思路:

  1. 倒序遍历字符串 s ,记录单词左右索引边界 i , j ;
  2. 每确定一个单词的边界,则将其添加至单词列表 res ;
  3. 最终,将单词列表拼接为字符串,并返回即可。

算法代码:

class Solution {public String reverseWords(String s) {s = s.trim(); // 删除首尾空格int j = s.length() - 1, i = j;StringBuilder res = new StringBuilder();while(i >= 0) {while(i >= 0 && s.charAt(i) != ' ') i--; // 搜索首个空格res.append(s.substring(i + 1, j + 1) + " "); // 添加单词while(i >= 0 && s.charAt(i) == ' ') i--; // 跳过单词间空格j = i; // j 指向下个单词的尾字符}return res.toString().trim(); // 转化为字符串并返回}
}

2)剑指 Offer 58 - II. 左旋转字符串

题目:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。

解题思路:直接调java的切片函数。

算法代码:

class Solution {public String reverseLeftWords(String s, int n) { //直接调Java的字符串切片操作return s.substring(n)+s.substring(0,n);}
}

若面试不允许使用切片操作。

方法二:字符串遍历拼接

class Solution {public String reverseLeftWords(String s, int n) {String res = "";for(int i = n; i < s.length(); i++)res += s.charAt(i);for(int i = 0; i < n; i++)res += s.charAt(i);return res;}
}

利用求余计算,可以简化代码

class Solution {public String reverseLeftWords(String s, int n) {String res = "";for(int i = n; i < n + s.length(); i++)res += s.charAt(i % s.length());return res;}
}

算法(Java)——字符串String相关推荐

  1. java字符串String

    前言 String类代表字符串. Java程序中的所有字符串文字(例如"abc" )都被实现为此类的实例. 字符串不变; 它们的值在创建后不能被更改. 字符串缓冲区支持可变字符串. ...

  2. Java字符串String比较不要用==原因

    简述 其实Java的String不是 char [],而是char *. 这么说来,如果使用 ==来做比较,其实是比较两个指针的值.而我们清楚指针的值就是表示对应的数据的逻辑地址.那么这里的相等的含义 ...

  3. 老司机也晕车--java字符串String晕车之旅

    首先声明,有晕车经历的司机请自备药物,String也可能让你怀疑人生! 第一道 开胃菜 请听题!第一道题: String hello="hello world!";String h ...

  4. Java字符串String相关

    String常用 1. char charAt(int index) 返回给定位置的字符 2. int indexOf(String str) 返回给定字符串的位置 3. int length() 返 ...

  5. Java 字符串 String 与整数型 int 之间的转换

    1.如何将字串 String 转换成整数 int?   A. 有两个方法:   1). int i = Integer.parseInt([String]); 或   i = Integer.pars ...

  6. Java字符串String相关2

    先在定义字符串: 1 String str="字符串常量"; 2 String str1=new String("字符串常量"); 3 String str2= ...

  7. 算法--java字符串之金额转换

    如例 输入  2135 ,==>输出 零佰零拾零万贰仟壹佰叁拾伍元 输入 789 ,==>输出 零佰零拾零万零仟柒佰捌拾玖元 分析 1.当输入2135时,我们可以先将其数字全部转换为大写 ...

  8. java字符串string_Java字符串String方法总结

    Java字符串创建与初始化实例.Java字符串String方法总结,包括字符串的大小写替转换,获取字符串长度的方法.截取字符串,去除字符串中的空格.StringBuffer类转换成String类等: ...

  9. Java中String接受的最大字符串的长度

    java字符串String的最大长度,要分两个阶段,编译阶段及运行时阶段 编译阶段: 我们在编写源代码的时候,如果使用 Sting str = "aaaa";的形式定义一个字符串, ...

  10. JAVA 实现字符串(String)的模糊查找

    花了点时间,实现JAVA 字符串(String)的模糊查找: 目的:实现用户输入关键字,查找含有该关键字的字符串,如: 输入: I love Java 返回: My name is GG, i lov ...

最新文章

  1. 这么全的数组去重,你怕不怕?
  2. SpringBoot+Vue+HIKVSION实现摄像头多选并多窗口预览(插件版)
  3. ORACLE:Health Monitor
  4. 交换机开发(四)—— ARP 基础知识解析
  5. mysql 关联查询慢_mysql慢查询语句分析总结
  6. mysql查找表shoe table,mysql命令行常用命令
  7. Linux(debian7)操作基础(十二)之文件加密使用指南
  8. html最小化位置不变,实现DIV相对于浏览器固定位置不变
  9. 欢迎界面java_Linux命令行欢迎界面美化
  10. java 深入io_Java高级编程-IO操作深入
  11. 《Hack与HHVM权威指南》——1.5.1 使用超级全局变量
  12. 电脑维修之——启动错误时的解决办法
  13. BAT文件中如何注释:
  14. 设计模式-23种设计模式
  15. zk-ui 安装部署
  16. 【QUARTUSII】数字电路设计仿真实验
  17. 趋势科技专访:让员工选我所爱,爱我所选
  18. 用Python求解拿鸡蛋问题
  19. 京东登录页面html代码_如何制作一个简单的HTML登录页面(附代码)
  20. 解决 Macbook 连接蓝牙鼠标卡顿问题

热门文章

  1. fastq质量值_FASTQ格式解释和质量评估
  2. 彻底弄懂 ASCII 码的所有符号
  3. 安装ngtpy踩坑记录(C++打包Python的一些小坑)
  4. PHP 模板引擎SMARTY 原理
  5. apt update和apt upgrade命令 - 有什么区别?
  6. 电脑管家让电脑性能直线下降的可能原因
  7. 大学四年自学走来,这些私藏的【实用工具/学习网站】我贡献出来了
  8. i.MX6ULL终结者Linux异步通知实验编写实验程序
  9. 用scratch编程画心形线
  10. 计算机主板上实时时钟晶振频率为,电脑主板晶振的识别及测量方法介绍