当前位置: 首页 > news >正文

JAVA知识点全面总结3:String类的学习

三.String类学习

1.String,StringBuffer,StringBuilder的区别?

2.字符串拼接用加号的原理 ?

3.字符串常量池如何理解?

4.String的intern方法理解?

5.String的equals方法和compareTo方法的使用?

6.String常用方法?

7.String类和StringBuffer类的常用方法?

待更新

待更新

三.String类学习

1.String,StringBuffer,StringBuilder的区别?

①不可变性

  • String是不可变的,value为final且指向字面量,无修改方法
  • StringBuffer和StringBuilder是可变的,value直接保存在堆中,有修改方法

②线程安全

  • String,StringBuffer线程安全,StringBuffer解决线程安全
  • StringBuilder线程不安全,StringBuilder只是建立可变字符串

③使用流程

  • String 少量改变可以用(重新生成字面量并放入常量池)
  • StringBuilder单线程多次改变(线程不安全,但是改变字符串在堆中数组中改变)
  • StringBuffer多线程多次改变(线程安全,而且改变字符串在堆中数组中改变)

④String为什么不变呢?

  • final修饰的value数组引用为final类型(只是数组地址不变,数组内容仍然可变)
  • private修饰value数组外部无法直接访问,String类未提供修改数组元素的方法。
  • 而StringBuffer和StringBuilder都提供对value数组操作的方法

2.字符串拼接用加号的原理 ?

①str1 = str2 + str3(都为变量)

  • 实际上 str1 = (new StringBuilder()).append(str1).append(str2).toString
  • 实际上 新建了StringBuilder对象并转换为String对象

②str3 = str2.concat()

  • 实际上,产生了新的String对象,并将字符串通过新建数组的形式凭借,将数组作为new String的参数获得新的String对象
  • 即str2.concat()新建String对象,然后将
  • 注意:除非String直接赋值给字符串,否则调用函数都是生成String类的对象。
  • 代码
package stringtest;public class StrinParaTest {public static void main(String[] args) {char[] a = new char[]{'a','b','c'};String b = new String(a);System.out.println(b);//abcString d1 = b.concat("d");//concat实际上最后以new String(新数组)System.out.println(d1);//abcdString s = a.toString();//a.toString实际上是以字符串类型返回的地址,也就是字符串 只不过是地址的字符串System.out.println(s);//C@1540e19d//故新建String对象由于String对象重写了toString方法,故打印的为字符串//而cahr[]类型的数组并未重写toString,故其toString返回的是地址(字符串类型)}
}

③使用

  • 多次拼接用StringBuilder,因为用String也会产生很多的StringBuilder对象,而直接用StringBuilder只用产生一个

3.字符串常量池如何理解?

①方法区中有专门存放字符串的常量池

②String a = “abc”

  • 在常量池中生成了abc字符串,然后引用变量a直接赋值为常量池中的地址

②String b = new String(“abc”)

  • 若常量池已有abc,在堆中生成String对象,然后value指向常量池
  • 若常量池没有abc,则先在常量池生成abc,再最后用value指向常量池

4.String的intern方法理解?

①String a = “a” + “b”

  • 编译期常量会直接合并,故a指向常量池

②String b = “a” + a

  • 生成StringBuilder对象后生成String对象,value指向常量池

③String c = (“abc” + a).intern()

  • 此时c由value指向常量池直接转化c直接指向常量池

④代码解析

package stringtest;public class StringDiffTest {public static void main(String[] args) {String a = "a" + "b";String temp = "b";String b = "a" + temp;String c =("a" + temp).intern();System.out.println(a==b);//falseSystem.out.println(b==c);//falseSystem.out.println(a==c);//true//此时intern可以让引用直接指向常量池地址,故a=c,但是利用StringBuilder方法生成的String仍然还是指向堆中对象}
}

5.String的equals方法和compareTo方法的使用?

①String的equals方法重写

  • 即比较字符串

②String的compareTo方法

  • 实现Comparable接口
  • 重写CompareTo方法

6.String常用方法?

①字符串是否回文

  • String转换为char类型数组循环
  • StringBuilder和StringBuffer通过reverse + toString + equals来实现
    注意:因为StringBuilder和StringBuffer并未重写equals,故需要先转化

②字符串大写小写

  • String类型的 toUpperCase toLowerCase

③比较字符串

  • compareTo 和 compareToIgnore

④String ->char

  • char[] chars = str.tocharArray();
  • String str = new String(chars);

⑤String->byte

  • byte[] bytes = str.getBytes()
  • String str = new String(bytes)

⑥String->StringBuffer

  • String s = StringBuffer.toString()
  • String s = StringBuffer + “”
  • StringBuffer s = (new StringBuffer()).append(s)

7.String类和StringBuffer类的常用方法?

①String常用方法

  • length charAt concat equals getBytes toCharArrays toUpperCase toLowerCase

②StringBuffer常用方法

  • 增 append insert 删 delete 改 replace reverse 查 substring

③示例代码

package stringtest;public class StringTest {public static void main(String[] args) {//判断回文//1.String转化数组String a = "abcba";char[] chars = a.toCharArray();int t = 0;for(int i = 0;i<a.length()/2;i++){if(chars[i] == chars[a.length()-i-1]){t++;}}if(t==a.length()/2){System.out.println("是回文");}//2.String转化StringBuilderStringBuilder stringBuilder = (new StringBuilder()).append(a);String s = stringBuilder.reverse().toString();System.out.println("回文数:"+(s.equals(a)));//3.对String方法的使用String p = "likejin";//String重写了equals,toString,实现了compareToSystem.out.println(p.length());System.out.println(p.equals(p));System.out.println(p.toString());System.out.println(p.compareTo(p));//String和字节数组,char数组,StringBuffer的转换byte[] bytes = p.getBytes();String q = new String(bytes);char[] chars1 = p.toCharArray();String m = new String(chars);String s1 = new StringBuilder().append(p).toString();String n = s1.toString();//4.对StringBuilder方法的使用StringBuilder a1 = new StringBuilder("likejin");//增删改查a1.append("like");a1.insert(11,"changyu");a1.delete(0,2);a1.replace(9,14,"");a1.substring(0);System.out.println(a1);}
}

未更新

未更新

http://www.lryc.cn/news/29083.html

相关文章:

  • Eureka注册中心和Nacos注册中心详解以及Nacos与Eureka有什么区别?
  • Web3D发展趋势以及Web3D应用场景
  • 2023-3-4 刷题情况
  • 前端面试总结
  • Geospatial Data Science (6): Spatial clustering
  • 蚁群算法优化问题
  • 为啥一个 main 方法就能启动项目
  • 洛谷:P1554 梦中的统计 JAVA
  • C++初学笔记整理
  • 记录--在Vue3这样子写页面更快更高效
  • 【程序设计与算法(三)】测验和作业题部分答案汇总(面向对象篇)
  • LeetCode 349. 两个数组的交集和 692. 前K个高频单词
  • SpringCloud的五大组件功能
  • 剑指 Offer II 016. 不含重复字符的最长子字符串
  • HBase读取流程详解
  • Redis学习(一):NoSQL概述
  • ESP32设备驱动-MCP23017并行IO扩展驱动
  • RabbitMQ简介
  • 【项目设计】高并发内存池(五)[释放内存流程及调通]
  • Git标签与版本发布
  • Python面向对象编程
  • 【什么情况会导致 MySQL 索引失效?】
  • Java核心知识点整理之小碎片--每天一点点(坚持呀)--自问自答系列版本
  • js中new Map()的使用方法
  • synchronized从入门到踹门
  • ubuntu-8-安装nfs服务共享目录
  • 算法练习(特辑)设计算法的常用思想
  • 哈希->模拟实现+位图应用
  • 苹果手机想要传输数据到电脑怎么传输呢?
  • Linux 练习四 (目录操作 + 文件操作)