Java基础学习Day09--字符串

  • 一、简介:
  • 二、String类字符串
  • 三、String字符串的存储原理
  • 四、字符串常用方法
    • 1.equals()方法
    • 2.字符串的搜索
    • 3.截取子字符串
    • 4.去除首尾空白字符串
    • 5.替换字符串
    • 6.分割字符串
    • 7.拼接字符串
    • 8.格式化字符串
    • 9.类型转换
    • 10.转换为char[]字符数组
  • 五、StringBuffer与StringBuilder
    • 1.StringBuffer对象
    • 2.StringBuilder对象
    • 3.总结

今天把昨天遗留的问题解决了
今天学习了字符串相关的内容


一、简介:

字符串(String)是用一对双引号括起来的零个或多个字符组成的有限序列。在Java中,字符串被当作对象来处理。

程序中需要用到的字符串可以分为两大类:
(1)String类:创建之后不会再做修改和变动的字符串常量;
(2)StringBuffer类:创建之后允许再做更改和变化的字符串变量。
串的两种最基本的存储方式是顺序存储方式和链接存储方式。

二、String类字符串

字符串变量必须赋值后才可以使用,这称为字符串对象初始化。

#字符串的创建和赋值的方式有三种

(1)String 字符串变量名;
字符串变量名="字符串常量";
String username="";
username="Tom"
(2)String 字符串变量名="字符串常量";
String SayHello="Hello world";
(3)String studentName=new String("周杰杰")

三、String字符串的存储原理

(1)String表示字符串类型,属于引用数据类型。
(2)在java中随便使用双引号括起来的都是String对象。
例如:“abc”, “def”, “hello world”,这是3个字符串对象。
(3)java中规定,双引号括起来的字符串,是不可改变的,final修饰的,自出生到销毁都是不可改变的。
(4)在JDK当中,双引号括起来的字符串,如:“abc”, "xyz"都是直接存储在“方法区”的“字符串常量池”当中的。
(5)为什么SUN公司把字符串存在一个“字符串常量池”当中呢?
因为字符串在实际开发中使用太过频繁,为了提高执行效率,所以把字符串放到方法区的字符串常量池当中。

样例:

public class Test01 {public static void main(String[] args) {//下面两行代码创建了3个字符串对象,都在常量池当中String s1 = "abcdef";  //在字符串常量池当中有一个"abcdef"对象String s2 = "abcdef" + "xy";  //因为已经有了"abcdef"对象,不需要再创建,而是创建"xy"对象,再拼接计算,创建"abcdefxy"对象String s3 = new String("xy");//这句代码使用了new关键字。代码中的"xy"是从哪里来的?//new关键字是实例化对象的,存在堆内存当中,而"xy"是在方法区的字符串常量池当中//所以,栈中main()方法栈帧中的局部变量s3保存的是一个堆内存对象的地址,堆中对象保存的是常量池"xy"的内存地址//凡是双引号括起来的都在常量池当中,凡是new实例化的对象都在堆内存当中}
}

总结:
(1)双引号括起来的字符串,如:“abc”, "xyz"都是直接存储在“方法区”的“字符串常量池”当中的。
(2)new关键字实例化的对象都存在堆当中。

四、字符串常用方法

1.equals()方法

常用于比较两个字符串是否相等,返回值类型是boolean,参数是Object类

public class test {public static void main(String[] args) {String n1 = "saf";String n2 = "saf";System.out.println(n1.equals(n2)); // true}
}

2.字符串的搜索

①indexOf()方法:使用indexOf方法可以从字符串的首部进行搜索,当前字符串中指定子字符串的下标位置,返回值为int类型,如果存在,则返回子字符串的下标位置。如果不存在,则返回-1。
“Hello”.indexOf(“l”); // 2
②lastIndexOf()方法:lastIndexOf()方法是从字符串的尾部进行搜索,返回值与indexOf()方法一致
“Hello”.lastIndexOf(“l”); // 3
③startsWith()方法:用于判断字符串是否以指定字符串开头,返回值为boolean类型
“Hello”.startsWith(“He”); // true
④endWith()方法:用于判断字符串是否以指定字符串结尾,返回值为boolean类型
“Hello”.endsWith(“lo”); // true
⑤contains()方法:用于查找当前字符串中是否存在指定子字符串,返回值为boolean类型
“Hello”.contains(“lo”); // true

3.截取子字符串

①substring()方法:使用substring()方法可以从当前字符串中,截取指定下标区间的子字符串,参数是int,返回值是String类型
“大漠孤烟直”.substring(2); // 孤烟直
“大漠孤烟直”.substring(0,2); // 大漠

4.去除首尾空白字符串

①trim()方法:trim()方法可以移除字符串首尾空白字符,空白字符包括空格,\t,\n,\r.无参数,返回值类型是 String。
" \tHello\r\n ".trim(); // 返回 “Hello”

5.替换字符串

①replace()方法:根据字符或字符串替换

String s = "hello";
s.replace('l', 'w'); // "hewwo",所有字符'l'被替换为'w'
s.replace("ll", "~~"); // "he~~o",所有子串"ll"被替换为"~~"

②replaceAll()方法:通过正则表达式,把匹配的子字符串统一替换

String s = "A,,B;C ,D";
s.replaceAll("[\\,\\;\\s]+", ","); // "A,B,C,D"

6.分割字符串

①split()方法:通过正则表达式传入值,参数值为字符串类型,返回值类型是字符串数组

String s = "A,B,C,D";
String[] ss = s.split("\\,"); // {"A", "B", "C", "D"}

7.拼接字符串

①join()方法:拼接字符串使用静态方法join(),他用指定的字符串连接字符串数组

String[] arr = {"A", "B", "C"};
String s = String.join("***", arr); // "A***B***C"

8.格式化字符串

①format()方法:fomat()静态方法,可以传入其他参数,替换占位符,然后生成新的字符串。参数是字符串和动态参数,返回值是字符串类型

String s = "Hi %s, your score is %d!";
System.out.println(s.format("Alice", 80)); // 字符串对象调用
System.out.println(String.format("Hi %s, your score is %.2f!", "Bob", 59.5)); // 字符串类调用

9.类型转换

①valueOf()方法:是静态方法,可以把任意基本类型或引用类型转换为字符串,这是一个重载方法,编译器会根据参数自动选择合适的方法。返回值是String类型

String.valueOf(123); // "123"
String.valueOf(45.67); // "45.67"
String.valueOf(true); // "true"
String.valueOf(new Object()); // 类似java.lang.Object@636be97c

②parseInt()方法:把字符串转为int类型,参数是String类型,返回值是int类型

int n1 = Integer.parseInt("123"); // 123
int n2 = Integer.parseInt("ff", 16); // 按十六进制转换,255

③parseBoolean()方法:把字符串转为boolean类型,参数是int类型,返回值是boolean类型

boolean b1 = Boolean.parseBoolean("true"); // true
boolean b2 = Boolean.parseBoolean("FALSE"); // false

10.转换为char[]字符数组

①String和char[]类型可以互相转化,方法是

char[] cs = "Hello".toCharArray(); // String -> char[]
String s = new String(cs); // char[] -> String

②修改char[]的时候,String里面的值不会变,因为new String() 的时候指向了一个新的内存空间

char[] cs = "Hello".toCharArray();
String s = new String(cs);
System.out.println(s);
cs[0] = 'X';

五、StringBuffer与StringBuilder

由于 String存放字符的数组是被final修饰的,只能被赋值一次,不能修改,因此String字符串在每次连接时都需要构建新的String对象,既费时又浪费空间;在需要多次进行字符串拼接时,使用 StringBuffer 或 StringBuilder 类更为合适一些;

1.StringBuffer对象

代表一个字符序列可变的字符串,当一个StringBuffer被创建以后,通过StringBuffer提供的append()、insert()、reverse()、setCharAt()、setLength()等方法可以改变这个字符串对象的字符序列。一旦通过StringBuffer生成了最终想要的字符串,就可以调用它的toString()方法将其转换为一个String对象。StringBuffer类中的方法都添加了synchronized关键字,也就是给这个方法添加了一个锁,用来保证线程安全。

2.StringBuilder对象

StringBuilder类也代表可变字符串对象。实际上,StringBuilder和StringBuffer基本相似,两个类的构造器和方法也基本相同。不同的是:StringBuffer是线程安全的,而StringBuilder则没有实现线程安全功能,所以性能略高。

3.总结

效率 :StringBuilder > StringBuffer
安全 :StringBuffer > StringBuilder
在更改次数较少时考虑使用 String;
在单线程大量操作数据时,考虑使用 StringBuilder ;
在多线程大量操作数据时,考虑使用 StringBuffer ;


明天会更好

Java基础学习Day09--字符串相关推荐

  1. Java 基础学习之字符串的简单操作和适配器设计模式

    一 适配器设计模式 1.适配器是什么? 适配器模式将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作.其别名为包装器(Wrapper) ...

  2. 传智黑马java基础学习——day09(面向对象、及封装)

    右键点击图片,可另存为.

  3. Java基础学习:尚硅谷项目三 开发团队调度软件

    Java基础学习:尚硅谷项目三 开发团队调度软件 一.软件功能与结构设计 1. 软件功能 该软件实现以下功能: 软件启动时,根据给定的数据创建公司部分成员列表(数组) 根据菜单提示,基于现有的公司成员 ...

  4. 尚学堂JAVA基础学习笔记_2/2

    尚学堂JAVA基础学习笔记_2/2 文章目录 尚学堂JAVA基础学习笔记_2/2 写在前面 第10章 IO技术 1. IO入门 2. IO的API 3. 装饰流 4. IO实战 5. CommonsI ...

  5. Java基础学习——第十四章 网络编程

    Java基础学习--第十四章 网络编程 一.网络编程概述 计算机网络: 把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大.功能强的网络系统,从而使众多的计算机可以方便地互相传递信 ...

  6. Java基础学习(9)

    Java基础学习 一.常用方法(API) 1.1 Math 1.2 System 1.3 Runtime 1. 4 .object 1.5 Objects 1.6 BigInteger BigInte ...

  7. Java基础学习—— IO流

    Java基础学习-- IO流 1 文件 1.1 文件的创建 1.2 文件常用的方法 2 IO流 2.1 FileInputStream 2.2 FileOutputStream 2.3 文件的拷贝 2 ...

  8. Java基础学习——第十章 枚举类注解

    Java基础学习--第十章 枚举类&注解 一.枚举类(enum) 1. 枚举类的概念 枚举类:类的对象只有有限个,确定的 线程状态:创建.就绪.运行.阻塞.死亡 当需要定义一组常量时,强烈建议 ...

  9. Java基础学习(12)

    Java基础学习 一.不可变集合 二.Stream流 2.1 Stream流数据添加 2.2 Stream流的中间方法 2.3 Stream终结方法 三. 方法引用 3.1 方法引用的基本概念 3.2 ...

最新文章

  1. Android用shareUserID实现多个Activity显示在同一界面
  2. 物理化学 热力学第一定律的概念
  3. select标签中option的显示隐藏控制(兼容IE)
  4. 机器学习的练功方式(五)——模型选择及调优
  5. Java Html转pdf实战
  6. 编译原理第一次上机作业感想
  7. C语言学习笔记---嵌套结构体
  8. mvc5 新手入门--ASP.NET MVC5中View-Controller间数据的传递
  9. 雷霄骅《最简单的视音频播放示例2:GDI播放YUV, RGB 》中YUV转RGB的过程
  10. Ubuntu 16.04 安装破解版 matlab 2017b
  11. POS系统example.launch 的位置_关于信用卡用户使用个人POS机的建议!
  12. IntelliJ IDEA 激活 破解补丁
  13. 黑客来势汹汹,受害者能以牙还牙“黑回去”吗
  14. 星际争霸2 AI 开发探索与展望
  15. debian下配置防火墙iptables
  16. 字节跳动岗位薪酬体系曝光,看完感叹:不服不行,想高薪还得是学这个。。。。
  17. 批量生成独一无二的NFT猫猫图,这项目王多鱼会投吗?
  18. 工程建设项目综合信息管理系统
  19. 关于找到pycharm中jetbrains-agent更新的打开路径的方法
  20. 2019 Multi-University Training Contest 7 部分补题

热门文章

  1. 电路板设计时的注意事项
  2. git使用遇到的问题
  3. macOS Big Sur正式版下载
  4. 公安部:不断提升我国网络安全和数据安全保护能力 保护数字经济发展
  5. 《黑客帝国》或颠倒的两面
  6. m.444lu.co show.php,vml圆角矩形最简布局_javascript技巧
  7. 使用unity实现桌面宠物
  8. C#练习题答案: 图片#1 - 重建巴别塔【难度:1级】--景越C#经典编程题库,1000道C#基础练习题等你来挑战
  9. python爬虫登录12306失败_使用python爬虫模拟12306登录方法
  10. Adobe Audition将音频转化为PCM