字符串相关面试题

本文深入探讨Java中字符串的创建区别,String与StringBuffer的特性及应用,包括内存分配、字符串拼接、线程安全等问题。同时,解析StringBuffer的各种操作方法,如添加、删除、替换、反转和截取,以及与数组的对比,帮助读者全面理解并掌握这些核心概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

面试题1:

String s = new String("hello");和String s = "hello";的区别?
有。
前者会创建2个对象(首先看常量池有没有该字符常量:有,则创建1个对象,没有则创建2个对象)。
后者会创建1个对象(首先看常量池有没有该字符常量:有,则创建0个对象,没有则创建1个对象)。

 * 注意:
 *         字符串内容为空和字符串对象为空。
 *         String s = "";//内容为空
 *         String s= null;//对象为空

面试题2:

/*
 * 看程序写结果
 * 
 * 字符串如果是变量相加,先开空间,在拼接。
 * 字符串如果是常量相加,是先加,然后在常量池找,如果有就直接返回,否则,就创建。
 */
public class StringDemo4 {
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "world";
        String s3 = "helloworld";
        System.out.println(s3==s1+s2);//false
        System.out.println(s3.equals((s1+s2)));//true
        
        System.out.println(s3=="hello"+"world");//true
        System.out.println(s3.equals("hello"+"world"));//true
        //通过反编译看源码,我们知道这里已经做好了处理。
        // System.out.println(s3 == "helloworld");
        // System.out.println(s3.equals("helloworld"));
    }
}

练习题:

/*
 * 需求:统计一个字符串中大写字母字符,小写字母字符,数字字符出现的次数。(不考虑其他字符)
 * 举例:
 *         "Hello123World"
 * 结果:
 *         大写字符:2个
 *         小写字符:8个
 *         数字字符:3个
 * 
 * 分析:
 *         前提:字符串要存在
 *         A:定义三个统计变量
 *             bigCount=0
 *             smallCount=0
 *             numberCount=0
 *         B:遍历字符串,得到每一个字符。
 *             length()和charAt()结合
 *         C:判断该字符到底是属于那种类型的
 *             大:bigCount++
 *             小:smallCount++
 *             数字:numberCount++
 * 
 *             这道题目的难点就是如何判断某个字符是大的,还是小的,还是数字的。
 *             ASCII码表:
 *                 0    48
 *                 A    65
 *                 a    97
 *             虽然,我们按照数字的这种比较是可以的,但是想多了,有比这还简单的
 *                 char ch = s.charAt(x);
 * 
 *                 if(ch>='0' && ch<='9') numberCount++
 *                 if(ch>='a' && ch<='z') smallCount++
 *                 if(ch>='A' && ch<='Z') bigCount++
 *        D:输出结果。



StringBuffer线程安全

 * 安全:--同步--数据是安全的
 * 不安全:--不同步--效率高一些
 * 
 * 安全和效率问题是永远困扰我们的问题。
 * 安全:医院的网站,银行网站等
 * 效率:新闻网站,论坛之类的网站等
 * 
 * StringBuffer:线程安全的可变字符串
 * 

StringBuffer和String的区别?

 * 前者长度和内容可变,后者不可变。
 * 如果使用前者做字符串的拼接,不会浪费太多的资源。

StringBuffer类的构造方法

 * public StringBuffer()无参构造    其初始容量为 16 个字符。(常用)
 * public StringBuffer(String str)指定字符串内容的字符串缓冲区对象(当需要String和StringBuffer相互转换的时候使用)
 * public StringBuffer(int capacity)指定容量的字符串缓冲区对象

StringBuffer的方法:

 *  public int capacity():返回当前容量,理论值
 *  public int length():返回长度(字符数),实际值

StringBuffer类的添加功能:

 * public StringBuffer append(String str)可以把任意类型添加到字符串缓冲区里面,并返回字符串缓冲区本身。
 * public StringBuffer insert(int offset,String str)在指定经位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身。

StringBuffer类的删除功能:

 * public StringBuffer deleteChart(int index)删除指定位置的(一个)字符,并返回本身。
 * public StringBuffer delete(int start,int end)删除指定位置开始到指定位置结束的内容,并返回本身。【包左不包右】 

StringBuffer类的替换功能:

 * public StringBuffer replace(int start,int end,String str)从start开始到end用str替换【包左不包右】

StringBuffer类的反转功能:

 * public StringBuffer reverse()将StringBuffer字符串进行反转,返回其本身。

StringBuffer类的截取功能:

 * public String substring(int start)从指定位置开始截取到末尾,返回截取出来的字符串。
 * public String substring(int start,int end)从指定开始位置到指定结束位置进行截取,返回截取出来的字符串。[包左不包右]
 

StringBuffer类的三个面试题:

 * 1、String、StringBuffer、StringBuilder的区别?
 * A:    String是内容不可变的,
 *         而StringBuilder,StringBuffer都是内容可变的。
 * 
 * B:    StringBuffer是同步的,数据安全,效率低;
 *         StringBuilder是不同步的,数据不安全,效率高。

2、StringBuffer和数组的区别?

 *     二者都可以看做是一个容器,装其他的数据。
 *     但是,StringBuffer的数据最终都是一个字符串数据。
 *  而数组可以放置多种数据,但必须是同一种数据类型。

3、形似参数问题?

 *    String作为参数传递(看成是基本类型)
 *    StringBuffer作为参数传递(赋值不发生改变,调用方法发生改变)
 *
 *形式参数:
 *    基本类型:形式参数的改变不影响实际参数
 *    引用类型:形式参数的改变影响实际参数
 *
 *注意:String作为参数传递,效果和基本类型作为参数传递是一样的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值