1.String的基本概念

package com.yl.pdfdemo.day08.p1;import org.junit.Test;/*** @Author wfj* @Date 2021/5/8* @Description String的使用* @Version 1.0*/public class StringTest {/*** String:字符串,使用一对""引起来表示* 1.String声明为final,表明为不可被继承的* 2.String实现了Serializable,表示字符串是支持序列化的*          实现了Comparable接口,表示字符串可以比较大小* 3.String内部定义了final char[] value 用于存储字符串数据* 4.String代表不可变的字符序列,简称不可变性*  体现: 当对字符串重新赋值时,需要新指定内存区域赋值,不能使用原有的value进行赋值*        当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值*        当调用String的replace()方法修改指定的字符或者字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值* 5.通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中* 6.字符串常量池中是不会存储相同内容的字符串的** 面试题:String s = new String("abc")创建了几个对象**  两个,一个是堆空间new的结构,另一个是char[]对应的常量池中的数据"abc"*/@Testpublic void test1() {String s1 = "abc";//字面量String s2 = "abc";s1 = "hello";String s3 = "abc";System.out.println(s1);//helloSystem.out.println(s2);//abcSystem.out.println(s2 == s3);//trueString s4 = "abc";s4 += "def";System.out.println(s2 == s4);//falseString s5 = "abc";String s6 = s5.replace('a', 'g');System.out.println(s5);//abcSystem.out.println(s6);//gbc}/*** String的实例化方式:* 方式一:通过字面量定义的方式* 方式二:通过new + 构造器的方式*/@Testpublic void test2() {//此时s1与s2的数据"vue"声明在方法区的字符串常量中String s1 = "vue";String s2 = "vue";System.out.println(s1 == s2);//true//此时s3何s4的地址值是保存在堆空间中String s3 = new String("java");String s4 = new String("java");System.out.println(s3 == s4);//falsePerson p1 = new Person("tom",18);Person p2 = new Person("tom",18);/*** 注意 String name;* name 存到是一个地址值,指向字符串常量池,tom,jerry这些数据是存在字符串常量池里的。*/System.out.println(p1 == p2);//falseSystem.out.println(p1.name.equals(p2.name));//trueSystem.out.println(p1.name == p2.name);//truep1.name = "jerry";System.out.println(p2.name);//tomSystem.out.println(p1.name == p2.name);//false}@Testpublic void test3() {/*** 结论:* 1.常量与常量的拼接结果在常量池中,且常量池中不会存在相同的常量* 2.值要其中有一个是变量,结果就在堆中* 3.如果拼接的结果调用intern()方法,返回值就会在常量池中**/String s1 = "java";String s2 = "vue";String s3 = "javavue";String s4 = "java" + "vue";String s5 = s1 + "vue";String s6 = "java" + s2;String s7 = s1 + s2;System.out.println(s3 == s4);//trueSystem.out.println(s3 == s5);//falseSystem.out.println(s3 == s6);//falseSystem.out.println(s5 == s6);//falseSystem.out.println(s5 == s7);//falseSystem.out.println(s6 == s7);//falseString s8 = s5.intern();System.out.println(s3 == s8);//true//返回值得到的s8使用常量池中已经存在的"javavue"}
}class Person {String name;int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}
}

2.String的相关方法

package com.yl.pdfdemo.day08.p1;import org.junit.Test;import java.io.UnsupportedEncodingException;
import java.util.Arrays;/*** @Author wfj* @Date 2021/5/12* @Description String中的方法* @Version 1.0*/public class StringMethodTest {@Testpublic void test1() {String str = "HelloWorld";System.out.println(str.length());//返回字符串的长度System.out.println(str.charAt(0));//返回指定索引位置的字符System.out.println(str.isEmpty());//判断字符串时候为空字符串String s1 = str.toUpperCase();//转大写字母,str是不可变的,str仍为原来的内容System.out.println(s1);String s2 = str.toLowerCase();//转小写字母System.out.println(s2);String s3 = "   hello  vue    ";System.out.println("===" + s3 + "===");String s4 = s3.trim();//字符串前后去掉格,中间空格保留System.out.println(s4);String s5 = "HelloWorld";String s6 = "HELLOworld";//比较两个字符串的内容是否相等System.out.println(str.equals(s5));//true//比较两个字符串内容是否相等,忽略字母的大小写System.out.println(str.equalsIgnoreCase(s6));//trueString str1 = "vue";//拼接两个字符串,等价于"+"String s7 = str.concat(str1);//"HelloWorldvue";System.out.println(s7);String s8 = "abc";String s9 = new String("abd");//比较两个字符串大小,为正数,代表s8比s9大,为负数,代表s8比s9小,等于0代表大小相等System.out.println(s8.compareTo(s9));//-1String s10 = str.substring(2);//从索引为2开始包含索引2截取到后面的所有内容String s11 = str.substring(0,3);//相等于[0,3),从索引为0包含索引0开始截取到索引为3不包含索引3的内容System.out.println(s10);System.out.println(s11);}@Testpublic void test2() {String str = "HelloWorld";//判断字符串是否以什么内容开头或者结束System.out.println(str.endsWith("HelloWorld"));//trueSystem.out.println(str.endsWith("rld"));//trueSystem.out.println(str.startsWith("He"));//trueSystem.out.println(str.startsWith("HelloWorld"));//true//判断从第二个索引位置开始是否以ll开头System.out.println(str.startsWith("ll",2));//trueString s1 = "Wor";//判断一个字符串是否包含另一个字符串System.out.println(str.contains(s1));//true//返回lo在str中第一次出现的索引位置,从左边开始搜索System.out.println(str.indexOf("lo"));//3//从第五个索引位置开始,查找是否有lol的内容System.out.println(str.indexOf("lol",6));//-1String s2 = "Hellorvvorld";//从右边往左边开始寻找System.out.println(s2.lastIndexOf("or"));//8System.out.println(s2.lastIndexOf("or",7));//4}@Testpublic void test3() {String s1 = "java  beauty  js java";//replace(),用新字符/字符串替换字符串中的内容String s2 = s1.replace('j','h');System.out.println(s2);//hava  beauty  hs havaString s3 = s1.replace("java","vue");System.out.println(s3);//vue  beauty  js vue//把字符串中的数字替换成,如果结果中开头结尾还有,的话,去掉,String s4 = "12hello34java56mysql78vue89";String s5 = s4.replaceAll("\\d+",",").replaceAll("^,|,$","");System.out.println(s5);String s6 = "12345";System.out.println(s6.matches("\\d+"));//是否全为数字//判断是否是一个固定电话String s7 = "0571-4534567";System.out.println(s7.matches("0571-\\d{7,8}"));String s8 = "java|vue|go";String[] strs = s8.split("\\|");for (String s : strs) {System.out.println(s);}}/*** String于char[]之间的相互转换*/@Testpublic void test4() {String str = "abc123";//String =======> char[]char[] strArr = str.toCharArray();for (int i = 0; i < strArr.length; i++) {System.out.println(strArr[i]);}//char[] ======> Stringchar[] arr1 = {'j','a','v','a'};String s1 = new String(arr1);System.out.println(s1);}/*** String与byte[]的相互转换*/@Testpublic void test5() throws UnsupportedEncodingException {String str = "abc321清风";//String ===> byte[]byte[] bytes = str.getBytes();//使用默认的字符集进行转换System.out.println(Arrays.toString(bytes));//[97, 98, 99, 51, 50, 49, -26, -72, -123, -23, -93, -114]byte[] bytes1 = str.getBytes("gbk");//使用gbk字符集进行编码System.out.println(Arrays.toString(bytes1));//[97, 98, 99, 51, 50, 49, -57, -27, -73, -25]//byte ===> StringString s1 = new String(bytes);System.out.println(s1);String s3 = new String(bytes);System.out.println(s3);//出现乱码String s2 = new String(bytes1,"gbk");//以什么字符集编码,就得以什么字符集解码System.out.println(s2);}
}

3.String的面试题

package com.yl.pdfdemo.day08.p1;/*** @Author wfj* @Date 2021/5/12* @Description String面试题* @Version 1.0*/public class StringTest1 {String str = new String("java");char[] ch = new char[]{'t','e','s','t'};public void change(String str,char[] ch) {str = "test ok";ch[0] = 'b';}public static void main(String[] args) {StringTest1 test1 = new StringTest1();test1.change(test1.str,test1.ch);System.out.println(test1.str + "and");//javaandSystem.out.println(test1.ch);//best}
}

4.String的相关练习

package com.yl.pdfdemo.day08.p1;import org.junit.Test;/*** @Author wfj* @Date 2021/5/21* @Description String相关练习* @Version 1.0*/public class StringDemo {/*** 将部分字符串内容反转*/public String reverse(String str, int startIndex, int endIndex) {if (str != null && str != "") {char[] strs = str.toCharArray();for (int x = startIndex, y = endIndex; x < y; x++,y--) {char temp = strs[x];strs[x] = strs[y];strs[y] = temp;}return new String(strs);}return null;}//方式二,使用String的拼接,来解决字符串内容反转public String reverse1(String str, int startIndex, int endIndex) {if (str != null && str != "") {String s1 = str.substring(0,startIndex);for (int i = endIndex; i >= startIndex; i--) {s1 += str.charAt(i);}s1 += str.substring(endIndex+1);return s1;}return null;}//方式三:使用StringBuilder/StringBufferpublic String reverse2(String str, int startIndex, int endIndex) {if (str != null && str != "") {StringBuilder sb = new StringBuilder(str.length());//第一部分sb.append(str.substring(0,startIndex));//第二部分for (int i = endIndex; i >= startIndex; i--) {sb.append(str.charAt(i));}sb.append(str.substring(endIndex + 1));return sb.toString();}return null;}@Testpublic void testReverse() {String str = "abcdefg";
//        String reverse = reverse(str, 2, 5);
//        String reverse1 = reverse1(str, 2, 5);String reverse2 = reverse1(str, 2, 5);System.out.println(reverse2);}/*** 获取一个字符串在另外一个字符串出现的次数* @param mainStr* @param subStr* @return*/public int getCount(String mainStr, String subStr) {//s1 = "ab" s2 = "hjhjhabsdsdsdaaaabll"int mainLength = mainStr.length();int subLength = subStr.length();int count = 0;int index = 0;if (mainLength >= subLength) {//            while ((index = mainStr.indexOf(subStr)) != -1) {                count++;
                mainStr = mainStr.substring(index + subLength);
            }while ((index = mainStr.indexOf(subStr,index)) != -1) {count++;index += subLength;}return count;} else {return 0;}}@Testpublic void testCount() {String mainStr = "hjhjhabsdsdsdaaaabll";String subStr = "ab";int count = getCount(mainStr, subStr);System.out.println(count);}/*** 获取两个字符串中最大相同子字串,比如:* str1 = abcdfdfhellofdfdf,str2 = kkjhelloaa* @param str1* @param str2* @return*/public String getMaxNameString(String str1, String str2) {String maxStr = str1.length() >= str2.length() ? str1 : str2;String minStr = str1.length() < str2.length() ? str1 : str2;int length = minStr.length();for (int i = 0; i < length; i++) {for (int x = 0,y = length - i; y <= length; x++,y++) {String subStr = minStr.substring(x,y);if (maxStr.contains(subStr)) {return subStr;}}}return null;}@Testpublic void testGetMxName() {String str1 = "abcdfdfhellofdfdf";String str2 = "lkkjhelloaa";String s = getMaxNameString(str1, str2);System.out.println(s);}
}
在这里插入代码片

5.StringBuilder和StringBuffer(重点)

package com.yl.pdfdemo.day08.p1;import org.junit.Test;/*** @Author wfj* @Date 2021/5/12* @Description 关于StringBuffer和StringBuilder* @Version 1.0*/public class StringBufferBuilder {/*** String、StringBuffer、StringBuilder的异同* String:jdk1.0 不可变的字符序列,底层使用char[]存储数据* StringBuffer:jdk1.0,可变的字符序列,线程安全的,效率低下,底层使用char[]存储数据* StringBuilder:jdk.15,可变的字符序列,线程不安全的,效率高,底层使用char[]存储数据* 效率: StringBuilder > StringBuffer > String** 分析:* String s1 = new String();//char[] value = new char[0]* String s2 = new String("abc")//char[] value = new char[]{'a','b','c'}* StringBuffer sb = new StringBuffer()//char[] value = new char[16] 底层创建了一个容量为16的字符数组* System.out.println(sb.length())  ==> 0  这个长度只是取数组里元素有多少个,而不是取数组的长度* sb.append('a')//value[0] = 'a'* sb.append('b')//value[1] = 'b'** StringBuffer sb1 = new StringBuffer("qq");//char[] value = new cha["abc".length() + 16]* System.out.println(sb1.length) //2**  扩容问题:*      如果要添加的数据底层数组装不下了,那就需要扩容底层的数组,默认情况下扩容为原来容量的2倍+2,同时将原来数组的元素赋值到新的数组**   所以开发中,如果没有涉及到线程安全问题,就用StringBuilder*   如果涉及到线程安全问题,就用StringBuffer*   最好都指定容量大小 new StringBuffer(int capacity)*/@Testpublic void test1() {StringBuffer sb1 = new StringBuffer("abc");sb1.setCharAt(0,'g');System.out.println(sb1);//gbc}//StringBuffer中常用的方法@Testpublic void test2() {StringBuffer sb = new StringBuffer("abc");//append,添加元素sb.append(1);sb.append("e");sb.append('f');System.out.println(sb);//abc1ef//delete,删除指定索引范围内的元素[int start,int end)
//        sb.delete(2,4);
//        System.out.println(sb);//abef//replace,[int start,int end),替换开始索引到结束索引位置的内容sb.replace(2,4,"java");System.out.println(sb);//abjavaef//insert,在第二个索引的位置插入内容,原来的内容往后挪sb.insert(2,"vue");System.out.println(sb);//abvuejavaef//reverse() 反转sb.reverse();System.out.println(sb);//feavajeuvbaSystem.out.println(sb.length());//11//截取元素[0,2)String s = sb.substring(0, 2);System.out.println(s);//获取索引0的元素System.out.println(sb.charAt(0));//setCharAt更换某个位置的元素sb.setCharAt(0,'p');System.out.println(sb);}
}

java-String笔记相关推荐

  1. `java`学习笔记(十二)`Java`--`String``StringBuffer``StringBuilder`

    Java–String&&StringBuffer&&StringBuilder 文章目录 `Java`--`String`&&`StringBuffe ...

  2. java string 对象地址_Java中String对象的存储位置(学习笔记)

    packagetest.string.equal;public classMain {/*** 创建了三个对象,"helloworld对象创建在常量池中",每次new String ...

  3. Java String类源码阅读笔记

    文章目录 一.前置 二.String类源码解析 1.String类继承关系 2.成员变量 3.构造方法 4.长度/判空 5.取字符 6.比较 7.包含 8.hashCode 9.查询索引 10.获取子 ...

  4. java学习笔记11--Annotation

    java学习笔记11--Annotation Annotation:在JDK1.5之后增加的一个新特性,这种特性被称为元数据特性,在JDK1.5之后称为注释,即:使用注释的方式加入一些程序的信息. j ...

  5. java学习笔记13--反射机制与动态代理

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note13.html,转载请注明源地址. Java的反射机制 在Java运行时环境中,对于任意 ...

  6. JAVA自学笔记07

    JAVA自学笔记07 1.构造方法 1) 例如:Student s = new Student();//构造方法 System.out.println(s);// Student@e5bbd6 2)功 ...

  7. Java学习笔记--StringTokenizer的使用

    2019独角兽企业重金招聘Python工程师标准>>> Java Tips: 使用Pattern.split替代String.split String.split方法很常用,用于切割 ...

  8. [Java入门笔记] 面向对象编程基础(二):方法详解

    2019独角兽企业重金招聘Python工程师标准>>> 什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能 ...

  9. java学习笔记12--异常处理

    java学习笔记系列: java学习笔记11--集合总结 java学习笔记10--泛型总结 java学习笔记9--内部类总结 java学习笔记8--接口总结 java学习笔记7--抽象类与抽象方法 j ...

  10. Java系列笔记(1) - Java 类加载与初始化

    2019独角兽企业重金招聘Python工程师标准>>> 目录 类加载器 动态加载 链接 初始化 示例 类加载器 在了解Java的机制之前,需要先了解类在JVM(Java虚拟机)中是如 ...

最新文章

  1. C#操作XML总结1
  2. 【bzoj2693】jzptab 莫比乌斯反演+线性筛
  3. A Simple Problem with Integers POJ - 3468 (线段树)
  4. 单例模式双重校验锁_滴滴面试官:如何实现一个线程安全的单例模式
  5. python人脸关键点识别_用Face++实现人脸关键点检测
  6. 对钱没兴趣的马云又爆10个金句
  7. table表格某一td内容太多导致样式混乱的解决方案
  8. HDU2077 汉诺塔IV【递推+打表】
  9. Pandas DataFrame loc []访问一组行和列
  10. C语言把输入值放入数组,//从键盘上输入若干整数,并将其存入数组中,并统计输入数据的个...
  11. Flink SQL 实战:HBase 的结合应用
  12. 文件异步加载读取 php,js文件的异步加载的方法总结(附代码)
  13. 学习信号与系统的看过来~~
  14. gps数据处理 java_GPS数据读取与处理
  15. socket服务器主动下发消息,socket服务器主动发送消息给客户端
  16. 树莓派安装LibreELEC并配置红外遥控
  17. Maya vray 3S皮肤材质球设置与材质节点连接
  18. 微信小程序 虚拟现实_开发虚拟现实应用程序的重要性
  19. EFM32G232F64时钟树
  20. 高效开发,项目中是否有聚合服务接口

热门文章

  1. [2023] NAND闪存及控制器的市场趋势
  2. C++实现Huffman编码
  3. vtkIntersectionPolyDataFilter两多边形数据集的交线
  4. 美股课堂:美国银行开户亲历记
  5. ExtJS EditorGridPanel 控制每一个单元格是否可以编辑
  6. 有道难题——2010网易编程挑战赛
  7. android极光聊天界面,极光聊天室原生插件
  8. 荟萃英才教育,职业教育,大有可为
  9. 凸优化——详解对偶和鞍点
  10. python set 交集、并集、差集