首页 > 其他分享 >快速掌握String类(含面试题)

快速掌握String类(含面试题)

时间:2025-01-21 17:03:37浏览次数:3  
标签:面试题 String 掌握 s1 System 字符串 println out

目录


String类是秋招面试中的重点,需重点掌握。

1. String类的基础操作

1.1 构造字符串

字符串常量没有/0标记结尾。

通过String类的源代码可知,其成员变量有value(字符数组)和hash(int,默认为0),构造字符串原理图如下(忽略字符串常量池),
在这里插入图片描述

构造字符串的方式有很多种,常用的有三种:

  1. 使用常量串
String s1 = "hello java";
System.out.println(s1); //hello java
  1. 直接new一个String对象
String s2 = new String("hello");
System.out.println(s2); //hello
  1. 使用字符数组
char[] ch = {'h','e','l','l','o','!'};
//方法一
String s3 = new String(ch);
//方法二,offset表示从下标几开始取,count表示偏移量
String str = new String(ch,1,3);
System.out.println(s3); //hello!
System.out.println(str); //ell

  1. Java中" "引起来的也是字符串对象。
System.out.println("hello".length());   
  1. String是引用类型,内部并不存储字符串内容。

  2. 区分空指针和字符串为空

//区分空指针和字符串为空
String str1 = "";                         
System.out.println(str1.length()); //0    
String str2 = null;                       
System.out.println(str2.length()); //抛异常  

1.2 String对象(字符串)的比较

对基础类型,==比较的是变量中的值。
对引用类型,==比较的是引用的地址。

【比较相等】equals方法,返回值为布尔类型

String s1 = new String("hello");         
String s2 = new String("hello");         
System.out.println(s1 == s2);            
System.out.println(s1.equals(s2));                                       

【比较大小】compareTo方法,返回值为int类型

  1. String类实现了Comparable接口,并重写了compareTo方法
  2. 忽略大小写比较,用compareToIgnoreCase()方法
  3. s1 > s2,返回正数;s1 < s2,返回负数;s1 == s2,返回0。
//比较大小                                   
String str1 = new String("abc");         
String str2 = new String("abd");         
System.out.println(str1.compareTo(str2)); //-1
System.out.println(str1.compareToIgnoreCase(str3)); //0

1.3 查找字符串

1. 通过下标找字符。charAt()方法
String str = "hello";
//通过下标找字符
System.out.println(str.charAt(2)); //l
2. 从头找:查字符(或字符串)第一次出现的下标/从指定位置开始查。indexOf()方法
String str = "hello";
//找字符/字符串第一次出现的下标
System.out.println(str.indexOf('e')); //1
System.out.println(str.indexOf("ll")); //2
//从指定下标查下标
System.out.println(str.indexOf('l', 3)); //3

3. 从尾找:查字符(或字符串)第一次出现的下标/从指定位置开始查。lastindexOf()方法
String str = "hello";
System.out.println(str.lastIndexOf("ll")); //2
System.out.println(str.lastIndexOf('o',2)); //-1

2. String类的进阶操作

对字符串的修改操作都是新形成了一个String对象,字符串具有不可修改性。

2.1 转换

1. 基本类型与字符串转换
  1. 基本类型转字符串。valueOf()方法
int a = 10;
//将整型转成字符型
String s = String.valueOf(a);
System.out.println(s); //10
  1. 字符串转基本类型。包装类.paseInt()方法
//将字符串转整型
String str = "1290";
int b = Integer.parseInt(str);
System.out.println(b); //1290
2. 大小写转换
  1. 转大写。toUpperCase()方法
String str1 = "AbC";
//转大写
String s1 = str1.toUpperCase();
System.out.println(str1); //AbC
System.out.println(s1); //ABC
  1. 转小写。toLowerCase()方法
//转小写
String str1 = "AbC";
String s2 = str1.toLowerCase();
System.out.println(str1); //AbC
System.out.println(s2); //abc
3. 字符串与数组转换
  1. 字符串转数组。toCharArray()方法
//字符串转数组
String a1 = "hello";
char[] ch = a1.toCharArray();
System.out.println(Arrays.toString(ch)); //[h, e, l, l, o]
  1. 数组转字符串。
//数组转字符串
char[] arr = {'a','b','c'};
String s3 = new String(arr);
System.out.println(s3); //abc
4. 字符串格式化
//格式化输出
System.out.println(String.format("%s,%s","My","name"));

2.2 替换字符串

  1. repalce方法。参数为CharSequence却能传String类型,是因为String源码实现了CharSequence接口。
//参数为Char
String s = "hello";
String s1 = s.replace('l','p');
System.out.println(s1); //heppo

//参数为CharSequence
String s2 = s.replace("ll","a");
System.out.println(s2);//heao
  1. replaceAll方法,支持正则表达式,除此之外和repalce方法的用法基本没区别。

  2. repalceFirst方法,只替换第一次出现的字符。

String s = "hello world";
String s3 = s.replaceFirst("l","6");
System.out.println(s3);//he6lo world

2.3 拆分字符串

spilt方法,填limit参数是表示分成几组

  1. 字符串拆分
//参数为一个
String s = "My name is Java";
String[] s1 = s.split(" ");
for (int i = 0; i < s1.length; i++) {
    System.out.println(s1[i]);
}

//运行结果
//        My
//        name
//        is
//        Java

//参数为两个
String s = "My name is Java";
String[] s1 = s.split(" ",3);
for (int i = 0; i < s1.length; i++) {
    System.out.println(s1[i]);
}

//运行结果
//        My
//        name
//        is Java  
  1. IP地址拆分
String s2 = "198.010.1.0";
String[] s3 = s2.split("\\.");
for (int i = 0; i < s3.length; i++) {
    System.out.println(s3[i]);
}

//198
//010
//1
//0
  1. 字符 “|” “*” “.” “+” 前面要加" \ \ "
  2. " \ “前面要加” \ \ \ \ "
  3. 如果要分割的字符串中有多个字符串分隔符,用按位或符号( | )连接
String s2 = "198\\019\\1\\0&limit";
String[] s3 = s2.split("\\\\|&");
for (int i = 0; i < s3.length; i++) {
    System.out.println(s3[i]);
}

//198
//019
//1
//0
//limit

2.4 截取字符串

subString方法,截取区间为左闭右开

String s = "hello";
//从截取下标到末尾
String s1 = s.substring(2);
System.out.println(s1);//llo
//指定区间截取
String s2 = s.substring(1,3);
System.out.println(s2);//el

2.5 其他操作

trim方法,去掉字符串左右的空格,中间的空格不去除

String s = "  he  llo  ";
System.out.println(s);
String s1 = s.trim();
System.out.println(s1);

//运行结果
//  he  llo  
//he  llo

2.6 修改字符串——字符串的不可修改性

下图是String的源码
在这里插入图片描述
字符串的不可修改性是private导致的,与final无关。final修饰value是不能修改value指向的数组地址(数组是引用类型),若不修改引用,只修改数组内容也不会违背final。所以不是final在起作用,而是private导致的字符串不可修改。
若想直接修改字符串,可以用StringBuffer和StringBuilder类。

3. StringBuilder和StringBuffer

由汇编语言可见,String拼接字符串时需要创建StringBulider对象,再append两次,再toString方法。而StringBuilder只需要append即可。
在这里插入图片描述
按照汇编语言编写代码,运行效果和源代码相同。再看String和StringBuilder和StringBuffer的拼接字符串的差距,如下,

public static void main(String[] args) {
        //测试String拼接100000个数字所有的时间,用结束时间-开始时间
        String s = "";
        long start = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            s = s + i;
        }
        long end = System.currentTimeMillis();
        System.out.println("String:" + (end - start));

        //测试StringBuilder拼接100000个数字所有的时间,用结束时间-开始时间
        StringBuilder stringBuilder = new StringBuilder();
        start = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            stringBuilder.append(i);
        }
        end = System.currentTimeMillis();
        System.out.println("StringBuilder:" + (end - start));

        //测试StringBuffer拼接100000个数字所有的时间,用结束时间-开始时间
        StringBuffer stringBuffer = new StringBuffer();
        start = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            stringBuffer.append(i);
        }
        end = System.currentTimeMillis();
        System.out.println("StringBuffer:" + (end - start));
    }

//运行结果
String:17571
StringBuilder:1
StringBuffer:2

* String,StringBuilder和StringBuffer区别(面试题)

  1. String的内容不可修改,StringBuffer与StringBuilder的内容可以修改。String拼接时需要耗费大量资源,StringBuilder(或StringBuffer)则基本不耗费资源。
  2. StringBuffer与StringBuilder大部分功能是相似的,StringBuffer属于线程安全操作;而StringBuilder属于线程不安全操作。

标签:面试题,String,掌握,s1,System,字符串,println,out
From: https://blog.csdn.net/2301_79417489/article/details/145286544

相关文章

  • 【轻松掌握数据结构与算法】动态规划
    引言在本章中,我们将尝试解决那些使用其他技术(例如分治法和贪心法)未能得到最优解的问题。动态规划(DP)是一种简单的技术,但掌握起来可能比较困难。识别和解决DP问题的一个简单方法就是尽可能多地解决各种问题。“编程”一词与编码无关,而是源自文献,意思是填充表格,类似于线性规划。......
  • IDEA中将String类型转json格式
    目录问题描述问题原因解决方案结果问题描述最近做项目需要使用Ai生成json,可生成String类型的json字符串以后,IDEA识别不了,仍然将目标json视为String类型,其中的转义字符\,全都没有识别。将变量打印出来,如下:JSONString:[\n{\"options\":[{\"value\":\"基于四大维......
  • String字符串定义、用法及不可变性
    文章目录前言一、String是什么?二、使用方法1.定义字符串代码如下(示例):2.定义字符串数组代码如下(示例):三、不可变性代码如下(示例):总结前言大家在学习Java语言时,String字符串类是一块不能缺失的学习内容,所以String是什么?该怎么用?以及它为什么是不可变的?接下来......
  • 《String类的equals()的作用和源代码解读》
    一、equals()方法的由来equals()最开始是定义在Java.lang包下的Object中的一个经行比较的方法,根据Object类的核心代码可以看出来,在Object类中equals()方法比较时使用“==”运算符来比较两者地址,但实际应用情况下,人们往往想比较两者的值是否相同,当两个相同的值存进不同内存地址时......
  • 2025年大厂AI大模型面试题精选及答案解析,非常详细!
    前言随着AI市场,人工智能的爆火,在接下来的金九银十招聘高峰期,各大科技巨头和国有企业将会对AGI人才的争夺展开一场大战,为求职市场注入了新的活力。前排提示,文末有大模型AGI-CSDN独家资料包哦!为了助力求职者在面试中展现最佳状态,深入理解行业巨头的选拔标准变得至关重要。......
  • 掌握这些技巧,让你轻松应对网站模板修改中的常见挑战
    注意事项解释遵循最佳实践始终按照官方文档推荐的方式来进行修改,避免直接编辑核心文件,以减少升级时出现问题的风险。考虑SEO影响模板中的元标签、标题标签等元素直接影响搜索引擎抓取效率,因此在修改时要格外小心,确保不会破坏原有SEO设置。维护一致性整个网站应......
  • String类的equals()的作用和源代码解读
    1. 了解equals()方法equals方法是用于比较两个对象是否相等的方法,定义在Object类中。其默认实现仅比较对象的引用地址,但可以通过重写方法实现对对象内容的比较。只有引用数据类型才可以使用equals方法,我们点进equals方法的源码:我们看代码前几行,观察到当传入进来的参数之间......
  • 剑指offer面试题3:数组中重复的数字(Python实现)
    """面试题3:数组中重复的数字在一个长度为n的数组里所有数字都在0~n-1的范围内,某些数字是重复的,找出任意一个重复的数字"""defduplicate1(numbers:list,length:int)->int:"""修改原数组"""ifnumbers==[]orlength<=0:......
  • 面试题-redis的大key与热key
    题目概览:什么是Redis的大key,多大的键值才算是大key,大key是如何产生的呢?大key会造成什么问题,如何排查以及如何优化?Redis的大Key被发现后如何删除,删除的时候会存在什么难点?说说看Redis的热key吗,热key会造成什么问题,如何解决?1、什么是Redis的大key,多大的键值才算是大key,......
  • 关键时刻不慌!掌握这10个Cisco设备排障命令,网络工程师的必备技能
    在网络工程师的职业生涯中,遇到网络故障是不可避免的一部分。为了快速定位问题并恢复服务,工程师们必须熟练掌握一系列用于诊断和解决问题的命令。特别是在思科(Cisco)设备上,有10个常用的show命令是排障、配置管理和监视网络状态的重要工具,可以这么说,但凡是对思科设备排障,这10个......