网站三要素关键词 描述怎么做,企业官方网站推广,拼多多采用的是哪种网络营销方式,wordpress所有图片都裁剪Java基础之字符串操作——String字符串什么是字符串#xff1f;如果直接按照字面意思来理解就是多个字符连接起来组合成的字符序列。为了更好的理解以上的理论#xff0c;我们先来解释下字符序列#xff0c;字符序列#xff1a;把多个字符按照一定的顺序排列起来#xff1…Java基础之字符串操作——String字符串什么是字符串如果直接按照字面意思来理解就是多个字符连接起来组合成的字符序列。为了更好的理解以上的理论我们先来解释下字符序列字符序列把多个字符按照一定的顺序排列起来而字符序列就是作为字符串的内容而存在的。所以可以把字符串理解为把多个字符按照一定的顺序排列起来而构成的排列组合。如果还是不好理解没有关系我还有法宝。我们可以用烤串来比喻说明可以把字符串看作是烤串烤串上的每一块肉都相当于是一个字符。把一块块肉按照肥瘦相间的顺序排列并串起来便成了我们吃的烤串同理把多个字符按照一定的顺序“串”起来就构成了字符串。字符串的分类字符串分为可变的字符串和不可变的字符串两种这里的不可变与可变指的是字符串的对象还是不是同一个会不会因为字符串对象内容的改变而创建新的对象。不可变的字符串当字符串对象创建完毕之后该对象的内容(上述的字符序列)是不能改变的一旦内容改变就会创建一个新的字符串对象Java中的String类的对象就是不可变的。可变的字符串StringBuilder类和StringBuffer类的对象就是可变的当对象创建完毕之后该对象的内容发生改变时不会创建新的对象也就是说对象的内容可以发生改变当对象的内容发生改变时对象保持不变还是同一个。String 类String类表示不可变的字符串当前String类对象创建完毕之后该对象的内容(字符序列)是不变的因为内容一旦改变就会创建一个一个新的对象。String对象的创建:方式一通过字面量赋值创建String s1 laofu;需要注意这里是双引号区别与字符char类型的单引号方式二通过构造器创建 String s2 new String(laofu);;以上两种创建方式的对象在JVM中又是如何分布的呢? 分别有什么区别呢方式一和方式二在JVM中又是如何分布上图中的常量池用于存储常量的地方内存区域位于方法区中。常量池又分为编译常量池和运行常量池两种编译常量池当把字节码加载进JVM的时候其中存储的是字节码的相关信息(如当前执行到的字节码行号等)。运行常量池其中存储的是代码中的常量数据。方式一和方式二有何不同方式一String s1 laofu;有可能只创建一个String对象也有可能创建不创建String对象如果在常量池中已经存在laofu那么对象s1会直接引用不会创建新的String对象否则会先在常量池先创建常量laofu的内存空间然后再引用。方式二String s2 new String(laofu);最多会创建两个String对象最少创建一个String对象。可使用new关键字创建对象是会在堆空间创建内存区域这是第一个对象然后对象中的字符串字面量可能会创建第二个对象而第二个对象如方式一中所描述的那样是有可能会不被创建的所以至少创建一个String对象。字符串的本质字符串在底层其实就是char[]char表示一个字符比如String str laofu;等价于char[] cs new char[]{l,a,o,f,u};String对象的空值对象引用为空即String s1 null;此时s1没有初始化也在JVM中没有分配内存空间。对象内容为空字符串 比如String s2 ;此时对象s2已经初始化值为JVM已经为其分配内存空间。字符串的比较使用和equals会有不同效果详情在之前的文章中分享过[JAVA] 只知对象属性不知类属性就算类答应static都不答应使用号用于比较对象引用的内存地址是否相同。使用equals方法在Object类中和号相同但在自定义类中建议覆盖equals方法去实现比较自己内容的细节由于String类覆盖已经覆盖了equals方法所以其比较的是字符内容。所以可以这样来判断字符串非空对象引用不能为空s1 ! null;;字符内容不能为空字符串().equals(s1);;如果上述两个条件都满足说明字符串确实为空字符串拼接Java中的字符串可以通过是实现拼接那么代码中字符串拼接在JVM中又是如何处理的呢我们通过一个例子说明通过比较拼接字符串代码编译前后的代码来查看JVM对字符串拼接的处理。通过上述例子不难发现JVM会对字符串拼接做一些优化操作如果字符串字面量之间的拼接无论有多少个字符串JVM都会一样的处理如果是对象之间拼接或者是对象和字面量之间的拼接亦或是方法执行结果参与拼接String内部会使用StringBuilder先来获取对象的值然后使用append方法来执行拼接。由此可以总结得出使用字符串字面量创建的字符串也就是单独使用引号创建的字符串都是直接量在编译期就会将其存储到常量池中使用new String()创建的对象会存储到堆内存中在运行期才创建使用只包含直接量的字符串连接符如aa bb创建的也是直接量这样的字符串在编译期就能确定所以也会存储到常量池中使用包含String直接量的字符串表达式(如aa s1)创建的对象是运行期才创建的对象存储在堆中因为其底层是创新了StringBuilder对象来实现拼接的5. 无论是使用变量还是调用方法来连接字符串都只能在运行期才能确定变量的值和方法的返回值不存在编译优化操作。String 的常用API这里列举了一些常用String API更多的可以查阅jdk使用手册做Java一定得学会查阅jdk手册。String 的创建和转换:byte[] getBytes()把字符串转换为byte数组。char[] toCharArray()把字符串转换为char数组。String(byte[] bytes)把byte数组转换为字符串。String(char[] value)把char数组转换为字符串。获取字符串信息int length() 返回此字符串的长度。char charAt(int index) 返回指定索引处的 char值。int indexOf(String str) 返回指定字符串在此字符串中首次(从最左边算起)出现处的索引。int lastIndexOf(String str) 返回指定字符串在此字符串中最后(最右边算起)出现处的索引。字符串比较判断boolean equals(Object anObject) 将此字符串与指定的对象比较。boolean equalsIgnoreCase(String anotherString) 将此 String 与另一个 String 做忽略大小写的比较。boolean contentEquals(CharSequence cs) 将此字符串与指定的 CharSequence 比较比较的是内容psString类是现实了CharSequence(字符序列)接口的。字符串大小写转换调用方法的字符串就是当前字符串String toUpperCase() 把当前字符串转换为大写String toLowerCase() 把当前字符串转换为小写StringBuilder/StringBuffer先来分别使用String/StringBuilder/StringBuffer来拼接30000次字符串对比各自损耗的时间经过测试发现String做字符串拼接的时候耗时最高性能极低原因是String内容是不可变的每次内容改变都会在内存中创建新的对象。性能最好的是StringBuilder其次是StringBuffer最后是String。StringBuilder和StringBuffer区别并不是很大也有可能是测试次数还不够吧。感兴趣的小伙伴可以增加拼接次数来看看。代码很简单就不展示出来了。所以在开发中拼接字符串时优先使用StringBuffer/StringBuilder不到万不得已不要轻易使用String。StringBuilder以及StringBuffer的区别StringBuffer和StringBuilder都表示可变的字符串两种’的功能方法都是相同的。但唯一的区别StringBufferStringBuffer中的方法都使用了synchronized修饰符表示同步操作在多线程并发的时候可以保证线程安全但在保证线程安全的时候对其性能有一定影响会降低其性能。StringBuilderStringBuilder中的方法都没有使用了synchronized修饰符线程不安全正因为如此其性能较高。对并发安全没有很高要求的情况下建议使用StringBuilder因为其性能很高。像这样的情况会较多些。使用StringBuilder无参数的构造器在底层创建了一个长度为16的char数组此时该数组只能存储16个字符如果超过了16个字符会自动扩容(创建长度更大的数组,再把之前的数组拷贝到新数组)此时性能极低如果事先知道大概需要存储多少字符可以通过构造器来设置字符的初始值//创建一个长度为80的char数组.new StringBuilder(80);StringBuilder的常用方法append(Object val)追加任意类型数据到当前StringBuilder对象中。StringBuilder deleteCharAt(int index) 删除字符串中指定位置的字符。完结。虽然老夫不正经但老夫一身的才华