|
❤️❤️前言~🥳🎉🎉🎉 hellohello~,大家好💕💕,这里是E绵绵呀✋✋ ,如果觉得这篇文章还不错的话还请点赞❤️❤️收藏💞 💞 关注💥💥,如果发现这篇文章有问题的话,欢迎各位评论留言指正,大家一起加油!一起chinup!👍👍 💥个人主页:E绵绵的博客💥所属专栏:JAVASE题目练习 JAVASE知识点专栏 c语言知识点专栏 c语言题目练习该篇讲String主要是讲如何去使用String,所以比较简单,对于牵涉到String本质的真正很难的那部分我们到了数据结构再讲。那么开始出发吧👊👊String类的认识 ❤️❤️对于String这个类型,我们以前往往认为它是一个简单的基本类型,但我们错了,对于String,它是一个类,为引用类型。而我们的String类位于java.lang包中,java.lang包是Java的核心包,会自动导入到每个Java程序中。因此,在使用String类时,无需显式导入。❤️❤️对于String内部有两个要注意的成员变量,一个为value,一个为hash。之后很多关于String的使用都会牵扯到这两个变量的使用。其中value为字符数组。 hash为整形,默认为0. ❤️❤️那因为字符串为引用变量,当我们的println打印,应该是打印出地址呀,为什么像如下图一样打印出的是asdjj。那是因为String这个类有重写toString方法,在println中经过一系列复杂的操作导致其打印出的其实是字符串对象内部的value成员数组中的每个数组成员。如上打印出asdjj。String对象的创建 ❤️❤️String对象的创建常见有以下三种:publicstaticvoidmain(String[]args){ //使用常量串构造 Strings1="hellobit"; System.out.println(s1); //直接newString对象 Strings2=newString("hellobit"); System.out.println(s1); //使用字符数组进行构造 char[]array={'h','e','l','l','o','b','i','t'}; Strings3=newString(array); System.out.println(s1);} 所以我们现在来逐步分析下:🎯🎯使用常量串构造🎯🎯在Java中,如上,字符串可以直接赋值而不需要使用new关键字是因为Java为字符串提供了特殊的字符串常量池(StringPool)机制。当我们使用双引号括起来的字符串字面量赋值给一个字符串变量时,Java会首先检查字符串常量池中是否已经存在相同内容的字符串对象,如果存在,则直接返回常量池中的引用;如果不存在,则在常量池中创建一个新的字符串对象,并返回其引用。这种机制的好处是可以节省内存空间,避免创建大量相同内容的字符串常量对象。因为字符串在Java中是不可变的(Immutable),所以可以共享使用相同内容的字符串常量对象,提高了性能和效率。需要注意的是,使用new关键字创建的字符串对象会在堆内存中创建一个新的对象,而不会在字符串常量池中创建对象。因此,直接赋值和使用new关键字创建字符串对象是有区别的。注意字符串常量池位于java堆内存的一块特殊区域中,因为是特殊区域,所以在堆区正常创建对象不会影响字符串常量池。🎯🎯对于字符串常量,如"abcd","shdak"实则都是字符串常量对象的引用,它们指向的字符串对象都在字符串常量池中创建出来。而对于这些字符串常量对象中的value数组变量,编译器会将该字符串常量如"Hello"转换为一个包含字符如’H’、‘e’、‘l’、‘l’、'o’的char数组,并将该数组的引用赋值给字符串常量对象value属性。❤️❤️所以我们把这最重要的一点:字符串常量的细节给说完了,之后这些细节还会应用到后面的知识点中。 直接newstring对象 ❤️❤️该构造方法内部代码如下:如上两个图,”hellobit“为字符串常量,所以为String引用类型,而后将字符串常量池中的“hellobit”所指向的对象的value和hash赋值到我们在堆中创建的字符串对象中的value和hash,这样我们的String类就创建好了。使用字符数组进行构造 ❤️❤️该构造方法内部代码如下所以根据以上代码,就可以通过接收字符数组去创建字符串对象。这里就不多说了。 其他构造方法 当然除此之外还有一些其他的构造方法:1.如new String(),这里用该构造方法创建完字符串之后,该字符串内部的value指向空数组(java中数组的长度可以为0,可以存在空数组),从而打印该字符串后将只会换行,不会打印出任何一个数据2.又如String(charvalue[],intoffset,intcount)这个构造方法,它是将一个数组的部分当作参数赋值到字符串对象的value中,所以打印出的是数组的一部分成员值。这两个构造方法我们只要了解下就行,它并不像前面几个一样经常被使用格式化创建String对象 ❤️❤️我们可以通过String类的format方法去格式化创建一个String类对象。publicstaticvoidmain(String[]args){ Strings=String.format("%d-%d-%d",2019,9,14); System.out.println(s);}打印结果如下:由上可知,所以我们除了之前学的那些创建String对象的方法,还可以通过该方法去格式化创建String对象。通过分析其format内部代码可知其内部含有new,那么以上代码一切都说得通了。求字符串的长度 在String类中它含有自己的length方法,所以我们可以用该方法去求字符串长度。如下:对于isEmpty这个方法我们就无需过多了解了,充分了解下Srting中的length就可以了。注意当求数组arr长度时,我们是用arr.length.当求字符串string长度时,我们是用string.length ().String对象的比较 ❤️❤️字符串的比较是常见操作之一,我们之前就提到过一嘴,现在再次说一下比如:字符串排序。Java中总共提供了4种方式: 1.用==号进行比较❤️❤️之前就说过,注意:对于基本类型,==比较的是变量中的值;对于引用类型==比较的是引用中的地址。所以对于字符串比较切记不能用等号。 2.equals方法 ❤️❤️之前就讲过,现在重新讲一遍,String类重写了父类Object中equals方法,Object中equals默认按照==比较,String重写equals方法后,按照如下规则进行比较:publicstaticvoidmain(String[]args){ Strings1=newString("hello"); Strings2=newString("hello"); Strings3=newString("Hello"); //s1、s2、s3引用的是三个不同对象,因此==比较结果全部为false System.out.println(s1==s2); //false System.out.println(s1==s3); //false //equals比较:String对象中的逐个字符 //虽然s1与s2引用的不是同一个对象,但是两个对象中放置的内容相同,因此输出true //s1与s3引用的不是同一个对象,而且两个对象中内容也不同,因此输出false System.out.println(s1.equals(s2)); //true System.out.println(s1.equals(s3)); //false} 3.compareTo方法❤️❤️该方法我们之前就讲过,其位于comparable接口中,而在String类中实施了该接口且重写了该方法。❤️❤️ 所以由上可知其具体比较方式: s1.compareTo(s2):1.先按照字典次序大小比较,如果出现不等的字符,直接返回这两个字符的大小差值2.如果前k个字符相等(k为两个字符长度最小值),返回值为两个字符串长度差值总之s1字符串如果大于s2字符串,返回值就大于0;s1小于s2字符串,返回值小于0;相同则返回0.publicstaticvoidmain(String[]args){ Strings1=newString("abc"); Strings2=newString("ac"); Strings3=newString("abc"); Strings4=newString("abcdef"); System.out.println(s1.compareTo(s2)); //不同输出字符差值-1 System.out.println(s1.compareTo(s3)); //相同输出0 System.out.println(s1.compareTo(s4)); //前k个字符完全相同,输出长度差值-3}4. compareToIgnoreCase❤️❤️与compareTo方式相同,但是它忽略大小写比较, compare考虑大小写比较。publicstaticvoidmain(String[]args){ Strings1=newString("abc"); Strings2=newString("ac"); Strings3=newString("ABc"); Strings4=newString("abcdef"); System.out.println(s1.compareToIgnoreCase(s2)); //不同输出字符差值-1 System.out.println(s1.compareToIgnoreCase(s3)); //相同输出0 System.out.println(s1.compareToIgnoreCase(s4)); //前k个字符完全相同,输出长度差值-3}字符串查找 ❤️❤️字符串查找也是字符串中非常常见的操作,String类提供的常用查找的方法:注意其返回和输入的int值我们可以认为是String中的value数组下标。publicstaticvoidmain(String[]args){ Strings="aaabbbcccaaabbbccc"; System.out.println(s.charAt(3)); //'b' System.out.println(s.indexOf('c')); //6 System.out.println(s.indexOf('c',10)); //15 System.out.println(s.indexOf("bbb")); //3 System.out.println(s.indexOf("bbb",10)); //12 System.out.println(s.lastIndexOf('c')); //17 System.out.println(s.lastIndexOf('c',10)); //8 System.out.println(s.lastIndexOf("bbb")); //12 System.out.println(s.lastIndexOf("bbb",10)); //3字符串转化1.数值和字符串转化 ❤️❤️ 当我们将基本类型转换为字符串时,我们能用String类中的valueof去转换:publicclassMain{publicstaticvoidmain(String[]args){Strings1=String.valueOf(1234);Strings2=String.valueOf(12.34);Strings3=String.valueOf(true);System.out.println(s1);//输出1234System.out.println(s2);//输出12.34System.out.println(s3);//输出true}}❤️❤️而我们反过来将字符串反过来转换为基本类型时,我们就要用包装类型里的方法去转换了。(包装类型是类,并且这些包装类型是单独针对于一个基本类型进行操作的,如Interger,Double都是包装类型)publicclassMain{publicstaticvoidmain(String[]args){ints1=Integer.parseInt("1414");doubles2=Double.parseDouble("12.24");booleans3=Boolean.parseBoolean("false");System.out.println(s1);//输出1414System.out.println(s2);//输出12.24System.out.println(s3);//输出false这些就是我们用包装类型的方法将字符串转换为相应的类型,除了这三种方式之外还存在其他的转换方法,这里就不多展示了,你们可以自己去探究一下。还要说一点如果我们想把该字符串转换为整形,而字符串内部却是浮点型如”13.14“,那么会直接报错。所以字符串内部只能存在其想转换的类型的值,如果是其他类型的值则会报错。2.大小写转换 ❤️❤️大写转换用String类中的toUpperCase,小写转换用String类中的toLowerCasepublicstaticvoidmain(String[]args){ Strings1="hello"; Strings2="HELLO"; //小写转大写 System.out.println(s1.toUpperCase()); //大写转小写 System.out.println(s2.toLowerCase());}注意其两个方法返回值都是String类型,所以意味着实施该方法后会新创建一个字符串对象,并不会改变原本的字符串对象。3.字符串转数组 ❤️❤️我们可以通过String类中的tocharArray方法将字符串转换为字符数组。而对于字符数组转化为字符串,之前我们提的String类的第三个创建方法就是字符数组转化为字符串。使用方法如下:publicstaticvoidmain(String[]args){ Strings="hello"; //字符串转数组 char[]ch=s.toCharArray(); for(inti=0;i
|
|