Java基础-字符串
- String
- String构造方法
- 代码实现
- 内存分析
- String的常用方法
- 比较
- 练习 - 遍历字符串 ( charAt(), length() )
- 练习 - 字符串拼接
- 练习 - 手机号屏蔽 ( substring() )
- 练习 - 敏感词替换 ( replace() )
- StringBuilder
- 概述
- 基本操作
- StringJoiner
- 概述
- 基本操作
- 字符串原理
- 综合练习
- 阿拉伯数字转罗马数字
- 调整字符串
- 来源
- Gitee地址
String
String构造方法
代码实现
public class StringDemo01 {public static void main(String[] args) {// 1. 使用直接赋值的方式获取一个字符串对象String s1 = "abc";System.out.println(s1); // abc// 2. 使用new的方式获取一个字符串对象// 空参构造: 可以获取一个空白的字符串对象String s2 = new String();System.out.println("@"+s2+"!"); // @!// 没啥用: 传递一个字符串, 根据传递的字符串内容再创建一个新的字符串对象String s3 = new String("abc");System.out.println(s3); // abc// 传递一个字符数组, 根据字符数组的内容再创建一个新的字符串对象char[] chs = {'a', 'b', 'c'};String s4 = new String(chs);System.out.println(s4); // abc// 需求: 修改字符串内容, abc->Qbc// abc -> {'a', 'b', 'c'} -> {'Q', 'b', 'c'} -> "Qbc"// 传递一个字节数组, 根据字节数组的内容再创建一个新的字符串对象// 应用场景: 再网络当中传输的数据其实都是字节信息// 一般要把字节信息进行转换, 转成字符串, 此时就要用到这个构造了byte[] bytes = {97, 98, 99};String s5 = new String(bytes);System.out.println(s5); // abc}
}
内存分析
当使用双引号直接赋值时, 系统会检查该字符串在串池(StringTable, jdk7之后在堆内存中)中是否存在
- 不存在: 创建新的
- 存在: 复用
String的常用方法
比较
Demo02
public class StringDemo02 {public static void main(String[] args) {String s1 = new String("abc");String s2 = "abc";String s3 = "Abc";// 1. == 比较// 基本数据类型: 比的是数据值// 引用数据类型: 比的是地址值System.out.println(s1 == s2); // false// 2. 比较字符串对象的内容是否相等boolean res1 = s1.equals(s2);System.out.println(res1); // true// 3. 比较字符串对象的内容是否相等, 忽略大小写boolean res2 = s1.equalsIgnoreCase(s3);System.out.println(res2); // true}
}
Demo03
import java.util.Scanner;public class StringDemo03 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String str1 = sc.next(); // 本质是new String(...);String str2 = "abc";System.out.println(str1 == str2); // false}
}
练习 - 遍历字符串 ( charAt(), length() )
- char charAt(int index): 根据索引返回字符
- int length(): 返回字符串的长度
public class StringDemo04 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String s1 = sc.next();for (int i = 0; i < s1.length(); i++) {System.out.println(s1.charAt(i));}}
}
练习 - 字符串拼接
package com.heima.string;public class StringDemo05 {public static void main(String[] args) {int[] arr = {1, 2, 3};System.out.println(arrToString(arr));}public static String arrToString(int[] nums){if(nums == null){return "";}if(nums.length == 0){return "[]";}String ret = "[";for (int i = 0; i < nums.length; i++) {if(i == 0) {ret += nums[i];}else{ret += ", "+nums[i];}}ret += "]";return ret;}
}
练习 - 手机号屏蔽 ( substring() )
String substring(int beginIndex, int endIndex) 截取
注意点: 区间是左闭右开 [)
String substring(int beginIndex) 截取到末尾
public class StringDemo06 {public static void main(String[] args) {String phone = "13112349468";String newPhone = phone.substring(0, 3)+"****"+phone.substring(7);System.out.println(newPhone); // 131****9468}
}
练习 - 敏感词替换 ( replace() )
String replace(CharSequence oldValue, CharSequence newValue) 替换
public class StringDemo07 {public static void main(String[] args) {String str = "TMD, MTD";System.out.println(str.replace("TMD", "***"));}
}
StringBuilder
概述
- 介绍: StringBuilder可以看成是一个容器, 创建之后里面的内容是可变的
- 作用: 提高字符串的操作效率
基本操作
public class StringBuilderDemo1 {public static void main(String[] args) {// 1. 创建对象StringBuilder sb = new StringBuilder();// 2. 添加元素sb.append(1);sb.append(2.3);sb.append(true);// System.out.println(sb); // 12.3true// 3. 反转sb.reverse();// System.out.println(sb); // eurt3.21// 4. 获取长度int len = sb.length();// System.out.println(len); // 8// 5. StringBuilder -> StringString s = sb.toString();}
}
StringJoiner
概述
- 介绍: StringJoiner和StringBuilder一样, 也可以看成是一个容器, 内容是可变的
- 作用: 提高字符串的操作效率, 代码编写很简洁
- Jdk8之后出现
基本操作
import java.util.StringJoiner;public class StringJoinerDemo01 {public static void main(String[] args) {int[] nums = {1, 2, 3};StringJoiner sj = new StringJoiner(", ", "[", "]");for (int i = 0; i < nums.length; i++) {sj.add(nums[i]+"");}System.out.println(sj);}
}
字符串原理
- 字符串存储的内存原理
- 直接赋值会复用字符串常量池中的
- new出来不会复用, 而是开辟一个新的空间
- ==号比较的是什么
- 基本数据类型比较数据值
- 引用数据类型比较地址值
- 字符串拼接的底层原理
- 如果没有变量参与, 都是字符串直接相加, 编译之后就是拼接之后的结果, 会复用串池中的字符串
- 如果有变量参与, 会创建新的字符串, 浪费内存
- StringBuilder提高效率原理
- 所有要拼接的内容都会往StringBuilder中存放, 不会创建很多无用的空间, 节约内存
- StringBuilder源码分析
- 默认创建一个长度为16的字节数组
- 添加的内容长度小于16, 直接存
- 添加的内容大于16会扩容(原来的容量*2+2)
- 如果扩容之后还不够, 以实际长度为准
综合练习
阿拉伯数字转罗马数字
import java.util.Scanner;public class Demo01 {public static void main(String[] args) {/*** 阿拉伯数字转为罗马数字* 1. 数字范围[1, 9]*/String[] vis = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};Scanner sc = new Scanner(System.in);String s = sc.next();StringBuilder ans = new StringBuilder();for (int i = 0; i < s.length(); i++) {int num = s.charAt(i) - '0';ans.append(vis[num]+" ");}System.out.println(ans);}
}
调整字符串
public class Demo02 {public static void main(String[] args) {/*** 调整字符串* 给定两个字符串A和B* A的旋转操作就是将A最左边的字符移动到最右边* 如果若干次调整后, A能变成B, 则返回true, 反之返回false*/String a = "abcde";String b = "cdeae";boolean flag = false;for (int i = 1; i < a.length(); i++) {char[] chars = a.toCharArray();char ch = chars[0];for (int j = 1; j < chars.length; j++) {chars[j-1] = chars[j];}chars[chars.length-1] = ch;a = new String(chars);if(a.equals(b)){flag = true;System.out.println("Yeah!");break;}}if(!flag){System.out.println("Noo!");}}
}
来源
黑马程序员. 阿玮Java零基础
Gitee地址
https://gitee.com/yu-ba-ba-ba/awJava