# zb_java0724 **Repository Path**: climpeaker/zb_java0724 ## Basic Information - **Project Name**: zb_java0724 - **Description**: String字符串 - **Primary Language**: Java - **License**: GPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 4 - **Created**: 2018-07-24 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # zb_java0724 # 课堂笔记 ## 1 String类 ### 1.1 String类 * 1 字符串概念 String字符串:字符的集合。 语法要求,使用""引出,可以有0个,1个,多个字符,注意与字符类型的区分,单引号引出,有且只能有一个字符 * 1 字符串声明与初始化 字符串声明: String 变量名; 字符串初始化: 变量名 = "XXX"; // 常量的形式进行初始化 变量名 = new String();// 对象实例化的形式初始化 变量名 = new String("XXX"); 注意: (1)字符串类是对象类型; (2)字符串作为形参是按值传参; (3)如果使用new创建字符串,在内存中(堆中)申请了一块内存,创建了一个字符串对象【new关键字就是用来分配内存的】 (4)字符串有索引,索引从0开始;【字符串本质字符数组】 (5)字符串变量.length()方法可以获取字符串的长度; (6)字符串一旦初始化完成以后,其长度是不能再改变的; (7)字符串可以使用 + 运算符,叫做字符串的拼接运算,将两个字符串拼接在一起构成一个新的字符串; 重点掌握: 字符串类的常用的方法; 调用的形式: 字符串变量.方法名(); 代码[]: ``` /** * String类常用的方法 */ private static void test01() { // 创建一个String类型的变量 String str00 = "kjflkjdsa;fjoewroi32jrlksjkfjdslkfj;lsa"; // charAt方法 // char ch = str00[i]; //charAt方法实现此功能 char ch = str00.charAt(0); System.out.println("索引为0的字符:" + ch); System.out.println("使用for循环+chaAt方法遍历字符串中的每一个字符:"); // 使用for循环+chaAt方法遍历字符串中的每一个字符 for (int i = 0; i < str00.length(); i++) { System.out.println(" " + str00.charAt(i)); } System.out.println("======================"); boolean isIn = str00.contains("fjoewro"); System.out.println("contains用法:" + isIn); System.out.println("======================"); int iIn = str00.indexOf("fjoewro"); System.out.println("indexOf用法:" + iIn); System.out.println("======================"); String strNew = str00.replace("a;", "**"); System.out.println("str00:" + str00); System.out.println("strNew:" + strNew); System.out.println("======================"); String strSub = str00.substring(4, 8); // kjds【8-4=4】 子串的长度为:8-4 str00.substring(4); // str00.substring(4, 10000); // 越界,因为结束位置不能大于最大索引 System.out.println("strSub:" + strSub); System.out.println("隐藏手机号码的中间四位:"); String strTel = "18812345678"; String strTelNew = strTel.replace(strTel.substring(3, 7), "****"); System.out.println("strTelNew:" + strTelNew); System.out.println("====================="); String str01 = " jkljlkj jlkjlk jlkjl "; System.out.println("str01:" + str01); System.out.println("str01.trim():" + str01.trim()); // 提出前后的空白字符 // split方法应用 String[] strSubs = str00.split(";"); System.out.println("分割的结果是:"); if (strSubs != null && strSubs.length > 0) { for (int i = 0; i < strSubs.length; i++) { System.out.println(" " + strSubs[i]); } } } ``` * 2 == 和 equals方法区别 ==: 对于基本类型来说,判定的是值是否相等; 对于对象类型来说,判定是地址引用是否相同; equals方法: 对于基本类型来说,没有该方法; 对于对象类型来说,判定的是内容是否相同; 代码[]: ``` /** * ==和equals的区别 */ private static void test02() { // 变量1 String str00 = new String("小明"); String str01 = new String("小明"); String str02 = "小明"; String str03 = "小明"; System.out.println("str00 == str01:" + (str00 == str01)); // false System.out.println("str00.equals(str01):" + (str00.equals(str01)));// true System.out.println("str00 == str02:" + (str00 == str02)); // false System.out.println("str00.equals(str02):" + (str00.equals(str02)));// true System.out.println("str02 == str03:" + (str02 == str03)); // true System.out.println("str02.equals(str03):" + (str02.equals(str03)));// true } ``` * 3 字符串在内存中的存储模型 数据结构概念: 栈 堆 队列: 栈:先进后出; 队列:先进先出; 堆:树型结构; 字符串在内存中的存储模式: 字符串在内存中有两种存储方式: 一种是存储在字符串常量池中;【栈结构】 一种是存储在内存堆中; 字符串常量池: 字符创常量池中存储字符串常量,并且是过滤重复的; 字符串常量存储在字符串常量池中。【直接用""给出的字符串就是字符串常量】 存储过程: 当对一个变量进行字符串常量赋值时,现在字符i量池中查找有无该字符串, 如果有则将字符创常量池中原有的字符串赋值给该变量; 如果没有,则先在字符串常量池中创建该常量,然后再将其赋值给变量; 内存堆中: 存储在内存中,可以重复,并且每次存储都是开辟新的存储单元; 使用new关键字创建的字符串对象、以及使用 + 拼接的字符串都是存储在字符串堆中; 注意:+拼接操作有特殊情况【如果两个纯粹字符创常量直接相加,则还是字符串常量,初次以外其他情况则需要开辟堆内存;】 例如: String str0 = "小"+"名"; // 存储在常量池中 str0是存储在字符串常量池中的; String str10 = "小"; String str1 = str10+"明"; // str1在堆中 str1是存储在堆中的; 存储过程: 每次开辟一块新的存储单元,然后将其所引用的字符串常量的值复制到堆中; 代码[]: ``` private static void test02() { // 变量1 String str00 = new String("小明"); // 执行到此行,创建了2个对象 1个在字符串常量池中,1个在堆内存中 String str01 = new String("小明"); // 执行到此行,创建了3个对象 1个在字符串常量池中,2个在堆内存中 String str02 = "小明"; // 字符串常量// 执行到此行,创建了3个对象 一个在字符串常量池中,一个在堆内存中 String str03 = "小明";// 执行到此行,创建了3个对象 一个在字符串常量池中,一个在堆内存中 String str041 = "小"; String str04 = str041 + "明"; // 执行到此,创建了6个对象 3个在字符串常量池中,3个在堆内存中 // 如果两个纯粹字符创常量直接相加,则还是字符串常量,初次以外其他情况则需要开辟堆内存; // String str04 = "小" + "明"; System.out.println("str00 == str01:" + (str00 == str01)); // false System.out.println("str00.equals(str01):" + (str00.equals(str01)));// true System.out.println("str00 == str02:" + (str00 == str02)); // false System.out.println("str00.equals(str02):" + (str00.equals(str02)));// true System.out.println("str02 == str03:" + (str02 == str03)); // true System.out.println("str02.equals(str03):" + (str02.equals(str03)));// true System.out.println("str04 == str00:" + (str04 == str00)); // false System.out.println("str04.equals(str00):" + (str04.equals(str00)));// true System.out.println("str04 == str02:" + (str04 == str02)); // false System.out.println("str04.equals(str02):" + (str04.equals(str02)));// true } ``` * 3 StringBuilder和StringBuffer 因为String是固定长度,且不能动态改变; 如果进行字符串的 + 拼接运算,则需要创建新的存储空间进行 + 拼接操作;【+拼接运算的效率低】 StringBuilder类使用用于对String进行处理的类; 存储空间是可以动态增加,原始初始空间大小为16字符; StringBuilder是存储在堆中的; 掌握StringBuilder类的常用的方法; String和StringBuilder的区别: String:固定长度,不可变长;存储在字符串池或堆中;字符串拼接运算效率低; 使用原则:当不进行字符串拼接运算时; StringBuilder:动态变长,存储在堆中,字符串拼接效率高; 使用原则:频繁进行字符串拼接操作; StringBuffer类: StringBuffer用法和StringBuilder一摸一样,StringBuffer是StringBuilder的线程安全类; 使用原则: 如果不涉及多线程,优先使用StringBuilder,系统开销小; 如果涉及多线程,则使用StringBuffer,系统开销大; #### 使用说明 1. xxxx 2. xxxx 3. xxxx #### 参与贡献 1. Fork 本项目 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 码云特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. 码云官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解码云上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是码云最有价值开源项目,是码云综合评定出的优秀开源项目 5. 码云官方提供的使用手册 [http://git.mydoc.io/](http://git.mydoc.io/) 6. 码云封面人物是一档用来展示码云会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)