栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

javaSE String类

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

javaSE String类

系列文章目录 文章目录
  • 系列文章目录
    • @[TOC](文章目录)
  • 一、String类基本用法
    • 1.1JDK中String类的声明
    • 1.2创建字符串的四种方式
    • 1.3字面量
    • 1.4字符串比较
    • equals 使用注意事项
    • 1.5字符串常量池问题
    • 1.6intern方法(面试重点)
      • 第一种情况
      • 第二种情况(易错点):
    • 1.7字符串不可变性
      • 为何字符串的对象无法修改内容而其他类的对象能修改内容?
    • 1.8如何改变字符串内容
    • 1.9StringBuffer 和 StringBuilder
    • 1.9.1 String和StringBuilder相互转换
    • 1.9.2 StringBuilder的方法
  • 二、String类的其他操作
    • 2.1字符串比较
    • 2.2字符和字符串相互转换
    • 2.3判断字符串组成
    • 2.4字符串和字节的相互转换
    • 2.5字符串查找操作
    • 2.6字符串替换操作
    • 2.7字符串拆分操作
    • 2.8字符串截取处理
    • 2.9其他操作
一、String类基本用法 1.1JDK中String类的声明


由此可以得知:final修饰类带来的好处。你的这个类不希望有别的版本,到此为止。所有使用者用的这个类完全相同,没有别的实现。

1.2创建字符串的四种方式

       String str1="hello world";
        String str2=new String("hello world");
        char[] data={'a','b'};
        String str3=new String(data);
        String str4=String.valueOf(10);
1.3字面量


内存分析:
下图表示的是str和str2引用都指向同一个对象
下图中少写了一个String str=“hello world”

下图表示str仍然指向之前的对象hello world
但是str2改变了指向,指向了一个新的对象hello,并且不影响原先和str共同的指向对象。(后续会讲到String类对象内容无法修改,无论什么情况)
(下图代码中打错了,是str2不是str1)

1.4字符串比较

注意 ==符号(比较地址)和 equals方法(比较内容)的区别
下图二者的区别在后续的字符串常量池讲解中会解析。

注意equals方法区分大小写

equals 使用注意事项

现在需要比较 str 和 “Hello” 两个字符串是否相等, 我们该如何来写呢?

String str = new String("Hello");
// 方式一
System.out.println(str.equals("Hello"));
// 方式二
System.out.println("Hello".equals(str));

我们更推荐使用 “方式二”. 一旦 str 是 null, 方式一的代码会抛出异常, 而方式二不会.

也可以使用不区分大小的方法

javaWeb开发里的小技巧

1.5字符串常量池问题

这三个引用指向了相同的内存

相等的原因:
在JVM底层实际上会自动维护一个对象池(字符串常量池)
如果现在采用了直接赋值的模式进行String类的对象实例化操作,那么该实例化对象(字符串内容)将自动保存到这个对象池之中.
如果下次继续使用直接赋值的模式声明String类对象,此时对象池之中如若有指定内容,将直接进行引用
如若没有,则开辟新的字符串对象而后将其保存在对象池之中以供下次使用

new关键字产生对象

不相等的原因:

1.6intern方法(面试重点)

第一种情况

解析:因为当第一次出现hello时先把hello放入堆中常量池,同时产生一个新hello对象并且指向这个对象,(此时已经产生两个对象)但是intern方法是有返回值的,并且在new的时候已经产生了对象,所以此事不再产生新对象,str1.intern只是调用了这个方法,并没有接收返回值。str2会直接复用常量池的hello

内存分析:

解决方法:str1接收一下返回值就可以了。str1接收常量池的地址。

第二种情况(易错点):

解析:一开始new的是数组,没有对象,常量池为空!第二行new新的对象时,此时指向的仍然是str1指向的普通对象abc,常量池中还是空,但是此时使用str1.intern方法并没有赋值,就是下图所说的b情况,直接把这个普通对象挪入常量池,str1指向跟随对象进入常量池。

1.7字符串不可变性


为何字符串的对象无法修改内容而其他类的对象能修改内容?
  1. 方便实现字符串对象池. 如果 String 可变, 那么对象池就需要考虑何时深拷贝字符串的问题了.
  2. 不可变对象是线程安全的.
  3. 不可变对象更方便缓存 hash code, 作为 key 时可以更高效的保存到 HashMap 中
    jdk源码

    value这个数组是私有权限,字符串外部根本取不到value的值
1.8如何改变字符串内容

a.在运行时通过反射破坏value数组的封装(了解,不推荐,ds部分讲反射大家就会写了,反射是所有框架的基础)相当于访问一个类的内部private权限的成员

public static void main(String[] args) throws Exception {
        String str="hello";
        Classcls=String.class;
        Field field= cls.getDeclaredField("value");
        //破坏封装
        field.setAccessible(true);
        //在String外部通过反射拿到value数组
        char[] value=(char[]) field.get(str);
        value[0]='H';
        System.out.println(str);
    }

使用StringBuilder类的拼接方法append:

常见办法: 借助原字符串, 创建新的字符串

String str = "Hello";
str = "h" + str.substring(1);
System.out.println(str);
// 执行结果
hello
1.9StringBuffer 和 StringBuilder

和String类都不是一个类!但两者使用方法都差不多

1.9.1 String和StringBuilder相互转换

1.9.2 StringBuilder的方法


delete方法删除是左闭右开,没有第十个索引就删除world这个单词

要插入的的元素的元素对应插入时设定的索引(类似链表插入)

面试常考题:

String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
StringBuffer与StringBuilder大部分功能是相似的
StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作

练习:

只产生一个对象

产生两个对象

解析:change方法中产生的新对象存放到了字符串常量池,原本在方法中的str仍然指向good,但是str=test ok是赋值产生了新对象,让方法中的str指向了字符串常量池新对象。change的ch和主方法的ch访问同一个内存空间,所以改变了char数组中的内容。change方法结束后,change里的ch和str出栈,没有了。所以str仍然指向good而char数组改变了内容。

二、String类的其他操作 2.1字符串比较

比较是否相等用一和二两种方法,要比较大小关系使用第三种方法。

System.out.println("A".compareTo("a")); // -32 
System.out.println("a".compareTo("A")); // 32 
System.out.println("A".compareTo("A")); // 0 
System.out.println("AB".compareTo("AC")); // -1

2.2字符和字符串相互转换

如何证明转换过来的是字符串:可以打印一下str.length方法

toString在类的对象里才有,字符数组不可以使用。这个ch.toString打印的是字符数组地址,而数组Arrarys.toString可以使用

只转换部分ch字符数组的内容为字符串
offset:表示要变为字符串的起始索引
count:表示要变为字符串的个数

此外还可以使用String str=String.valueOf(ch)

将字符串变为字符数组:

提示:String对象是无法改变的,所以data【0】=H后,如果打印str是不会发生任何改变hello。打印data会发生改变变成Hello。

System.out.println(str.charAt(10)); 
// 执行结果
产生 StringIndexOutOfBoundsException 异常

如果索引超过字符串长度会报错

2.3判断字符串组成


重点,必须掌握

编程思路:
上图中if循环可以使用字符类的方法代替

2.4字符串和字节的相互转换

和char[]相同,使用String类的构造方法,还有部分转换为String类


使用String类getBytes方法,再用数组打印的方法打印data

按照指定编码格式:默认是按照UTF-8格式转换
例如以后JavaWeb开发收到一串乱码多半是编码不一致

2.5字符串查找操作

第一、六、八种必须掌握,其他了解即可

2.6字符串替换操作


易错点:字符串的替代是否修改字符串的对象?
解析:不可能,以后无论什么样的问题问到会死否修改了字符串内容的相关面试问题都是一样的,不会改变。

2.7字符串拆分操作

拆分是特别常用的操作. 一定要重点掌握. 另外有些特殊字符作为分割符可能无法正确切分, 需要加上转义。

拆分IP地址
拆分后打印出空数组只存在以下两种情况


多次拆分:

2.8字符串截取处理

基本上idea中截取部分区间的操作和方法都是左闭右开,【0…5)之间,索引5的字符是取不到的,只能取到5之前。
虽然产生了新的的字符串,但str原字符串对象内容仍然不发生改变(强调n+1次了)

2.9其他操作

重点看一下第七个方法,并不是拿来判断是否为null的,而是判断字符串长度是否为0



那么何时使用 byte[], 何时使用 char[] 呢?
byte[] 是把 String 按照一个字节一个字节的方式处理, 这种适合在网络传输, 数据存储这样的场景下使用. 更适合针对二进制数据来操作.
char[] 是吧 String 按照一个字符一个字符的方式处理, 更适合针对文本数据来操作, 尤其是包含中文的时候.

小练习:写一个方法让字符串首字母是大写字符

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/870335.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号