Javase.String类的课后作业

news2025/1/20 1:15:09

String类的课后作业

  • 1.题目1
  • 2.题目2
  • 3.题目3
  • 4.选择题1
  • 5.选择题2
  • 6.选择题3
  • 7.编程题1
  • 8.编程题2

1.题目1

指出下列程序运行的结果为:

public class Example {
    String str = new String("good");
    char[] ch = {'a', 'b', 'c'};

    public static void main(String args[]) {
        Example ex = new Example();
        ex.change(ex.str, ex.ch);
        System.out.print(ex.str + " and ");
        System.out.print(ex.ch);
    }

    public void change(String str, char ch[]) {
        str = "test ok";
        ch[0] = 'g';
    }
}

解释:

这段Java代码定义了一个Example类,并在其中声明了一个字符串str和一个字符数组ch。main方法中创建了Example类的一个实例,并调用了change方法来尝试修改这两个成员变量。然后,它打印出这两个变量的值。

关键点: 理解Java中对象引用和原始数据类型(如字符数组中的元素)的传递方式。

  • 对于String str:在Java中,字符串是不可变的,且String类型的变量传递的是引用的拷贝。在change方法中,str引用被重新指向了一个新的字符串对象"test ok",但这并不影响原始对象str的引用,因为Java是值传递,这里的“值”是引用的拷贝。所以,str的值在change方法之外保持不变。
  • 对于char ch[]:字符数组是引用类型,但在change方法中,我们没有改变ch数组的引用,而是修改了数组的内容(即ch[0]的值被改变为’g’)。这种修改是反映在原始数组上的,因为数组的内容是共享的。

因此,输出将会是原始字符串"good"(因为str的引用没有被改变)和修改后的字符数组(因为数组内容被修改了)。所以,输出结果是:

good and gbc

这里,gbc是字符数组ch的新内容,其中第一个元素被change方法修改为’g’,而其余元素保持不变(‘b’和’c’)。

图文解析:
在这里插入图片描述
在这里插入图片描述

2.题目2

指出下列程序运行的结果为:

public class SystemUtil {
    public static boolean isAdmin(String userId) {
        return userId.toLowerCase() == "admin";
    }

    public static void main(String[] args) {
        System.out.println(isAdmin("Admin"));
    }
}

解释:

  • isAdmin 方法接受一个 userId 字符串参数,并将其转换为小写。
  • 然后,它尝试通过 == 运算符来比较转换后的小写字符串是否等于 “admin”。
  • 在 Java 中,使用 == 运算符比较字符串对象时,实际上是在比较对象的引用,而不是内容。
  • 因此,即使两个字符串的内容相同,如果它们不是同一个对象,== 运算符也会返回 false。
  • 在 isAdmin 方法中,“admin” 是一个字符串字面量,它在字符串常量池中创建一个对象。而 userId.toLowerCase() 创建了一个新的字符串对象(即使内容相同),这个新对象与字符串常量池中的 “admin” 对象不是同一个对象。
  • 因此,userId.toLowerCase() == “admin” 的结果为 false。
  • 在 main 方法中,调用 isAdmin(“Admin”) 会传入字符串 “Admin”,然后转换为小写并与 “admin” 进行比较。

由于上述原因,比较结果为 false,所以,输出结果是:

false

3.题目3

指出下列程序运行的结果为:

public class Test {
	public static void main(String[] args) {
        String s1 = "abc" + "def";
        String s2 = new String(s1);
        if (s1.equals(s2))
            System.out.println(".equals succeeded");
        if (s1 == s2)
            System.out.println("==succeeded");
    }
}

这段代码会输出:

.equals succeeded

解释:

  • String s1=“abc”+“def”; 这一行会创建一个字符串字面量 “abcdef” 并将其引用赋值给 s1。由于字符串拼接在编译时发生,s1 实际上直接引用了拼接后的字符串 “abcdef”。
    在这里插入图片描述

  • String s2=new String(s1); 这一行通过 new 关键字创建了一个新的 String 对象,其内容复制自 s1。即使内容相同,s2 引用的是堆上新创建的对象,而不是字符串常量池中的对象。

  • if(s1.equals(s2)) 使用 .equals() 方法比较 s1 和 s2 的内容是否相同。由于两个字符串的内容都是 “abcdef”,所以 .equals() 方法返回 true,因此会执行并输出 “.equals succeeded”。

  • if(s1==s2) 使用 == 操作符比较 s1 和 s2 的引用是否相同。由于 s1 引用的是字符串常量池中的对象,而 s2 引用的是堆上的新对象,两者的引用不同,所以 s1 == s2 的结果为 false,因此不会输出 “==succeeded”。

4.选择题1

在 Java 中,直接赋值存放字符串常量的对象属于(B)类对象。

A.Character
B.String
C.StringBuffer
D.Vector

解释:

A:是char类型的包装类型,可以存储字符
B:可以直接赋值字符串常量。String str = “hello”;
C:StringBuffer不能直接赋值字符串常量。
D:Vector底层是一个动态数组,不可以直接赋值字符串常量。

5.选择题2

以下关于 Java 字符串的说法, 错误的是(D)

A.字符串常量是不可变对象, 不能修改字符串的内容
B.使用 == 比较字符串是比较对象的地址, 而不是字符串的具体内容是否相同
C.使用 contains 方法可以判定字符串中是否包含某个子字符串
D.使用 subString 方法可以截取字符串子串, 传入的参数通过前闭后闭区间的形式表示子串的范围

解释:

A:正确。

观察String源码,我们发现这样的代码:

private final char value[];

public String( String original) {
    this.value = original.value;
    this.hash = original.hash; 
}

可以看到 value 是私有的,类外获取不到,所以无法修改。

B:正确。

在Java中,== 操作符用于比较两个对象的引用是否相同,即它们是否指向内存中的同一个位置。对于字符串,如果你使用 == 来比较两个字符串对象,你实际上是在比较这两个字符串对象的内存地址,而不是它们的内容。因此,即使两个字符串的内容完全相同,如果它们是不同的对象实例,== 也会返回 false。要正确比较字符串的内容是否相同,应该使用 equals() 方法。

C:正确 。

contains就是 字符串中是否包含某个子字符串,包含返回true,不包含返回false。

D:错误。

在Java中,substring 方法用于截取字符串的子串,但是传入的参数并不是通过前闭后闭区间的形式来表示子串的范围。实际上,substring 方法有两种常见的重载形式:

  1. substring(int beginIndex): 返回一个新的字符串,它是此字符串的一个子字符串。子字符串从指定的 beginIndex 处开始,直到此字符串的末尾。
  2. substring(int beginIndex, int endIndex): 返回一个新字符串,它是此字符串的一个子字符串。子字符串从 beginIndex 处开始,直到索引 endIndex - 1 的字符;因此,子字符串的长度为 endIndex-beginIndex。

所以,substring 方法的参数表示的是子串的起始位置和结束位置(不包括结束位置的字符),这是一种前闭后开区间 [beginIndex, endIndex),而不是前闭后闭区间。

6.选择题3

以下说法错误的是:(D)

A.针对一个 String 对象频繁调用 += 是比较低效的.
B.可以使用 StringBuilder 中的 append 方法更高效完成字符串拼接
C.StringBuilder 是可变对象.
D.StringBuffer 比 StringBuilder 更高效

解释:

A:频繁的对String,使用加号进行拼接会产生大量的临时对象,如上课所说,字符串本身不可变。所以每次都会产生临时对象。
B:append方法,每次返回的仍然是当前对象,不会频繁创建临时对象。
C:如B所说,StringBuilder是可变的。
D:StringBuffer是线程安全的,相比StringBuilder来说,每次为了保证线程安全,加锁和释放锁都会消耗系统资源,从而导致效率变低。

7.编程题1

题目描述:转换成小写字母

给你一个字符串 s ,将该字符串中的大写字母转换成相同的小写字母,返回新的字符串。


示例 1:

输入:s = "Hello"
输出:"hello"
示例 2:

输入:s = "here"
输出:"here"
示例 3:

输入:s = "LOVELY"
输出:"lovely"
  • 方法1: 手动实现toLowerCase()
class Solution {
    public String toLowerCase(String s) {
        /**
         public static boolean isLetter(char ch):判断指定字符是否为字母。
         public static boolean isUpperCase(char ch):判断指定字符是否为大写字母。
         */
        StringBuilder stringBuilder = new StringBuilder();
        for(int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            if(Character.isLetter(ch)) {//判断是不是字母
                if(Character.isUpperCase(ch)) {//判断是不是大写字母
                    ch = (char)(ch + 32);
                }
            }
            //字符串拼接:
            stringBuilder.append(ch);
        }
        return stringBuilder.toString();
    }
}

解释:

这段代码的目的是将一个字符串中的所有大写字母转换为小写字母,同时保留非字母字符和小写字母不变。

  1. 方法定义: 定义了一个toLowerCase方法,它接受一个字符串s作为参数,并返回一个字符串。
  2. StringBuilder初始化:为了高效地拼接字符,代码使用了StringBuilder类,并初始化了一个StringBuilder对象。
  3. 遍历字符串: 通过一个for循环,代码遍历了输入字符串s中的每一个字符。
  4. 判断与转换:
  • 使用Character.isLetter(ch)判断当前字符ch是否为字母。
  • 如果是字母,再使用Character.isUpperCase(ch)判断它是否为大写字母。
  • 如果是大写字母,就通过加上32(ASCII码中大写与小写字母之间的差值)来转换为小写字母。
  1. 字符串拼接: 无论字符是否被转换,都使用stringBuilder.append(ch)将其添加到StringBuilder对象中。
  2. 返回结果: 最后,使用stringBuilder.toString()将StringBuilder对象转换为字符串,并返回这个字符串。

简而言之,这段代码遍历输入字符串,将其中的大写字母转换为小写,然后返回转换后的字符串。

  • 方法2: 利用库方法toLowerCase
class Solution {
    public String toLowerCase(String s) {
        return s.toLowerCase();
    }
}

8.编程题2

题目描述:符串中的单词数

统计字符串中的单词个数,这里的单词指的是连续的不是空格的字符。

请注意,你可以假定字符串里不包括任何不可打印的字符。

示例:

	输入: "Hello, my name is John"
	输出: 5
	解释: 这里的单词是指连续的不是空格的字符,所以 "Hello," 算作 1 个单词。

代码展示:

class Solution {
    public int countSegments(String s) {
        if(s.length() == 0) {
            return 0;
        }
        int count = 0;
        //分割字符串,使之变成字符串数组
        String[] ss = s.split(" ");
        //假如数组中的元素(字符串)是为0长度的,就不进行计数
        for(int i = 0; i < ss.length; i++) {
            if(ss[i].length() != 0) {
                count++;
            }
        }
        return count;
    }
}

解释:

这段代码定义了一个countSegments方法,其目的是计算输入字符串s中由空格分隔的非空段(segments)的数量。

  1. 边界条件检查:首先检查输入字符串s的长度是否为0。如果是,则直接返回0,因为没有内容可以分割。
  2. 初始化计数器:设置一个计数器count为0,用于记录非空段的数量。
    分割字符串:使用split(" ")方法将输入字符串s按照空格分割成一个字符串数组ss。
  3. 遍历并计数:遍历分割后的字符串数组。如果数组中的某个元素(即某个段)的长度不为0,说明它是一个非空段,此时计数器count加1。
  4. 返回结果:最后返回计数器count的值,即非空段的数量。

简而言之,这段代码通过空格分割字符串,并计算其中非空段的数量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1847773.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

cd 命令特殊路径符 mkdir命令

cd 特殊路径符 cd . 表示当前目录&#xff0c;比如 cd ./Desktop表示切换到当前目录下的Desktop目录内&#xff0c;和 cd Desktop效果一致。cd … 表示上一级目录&#xff0c;比如 cd … 即可切换到上一级目录&#xff0c;cd…/…切换到上二级目录。cd ~ 表示 HOME 目录&#…

MPLS-LDP(个人学习笔记)

定义 标签分发协议LDP&#xff08;Label Distribution Protocol&#xff09;是多协议标签交换MPLS的一种控制协议&#xff0c;负责转发等价类FEC的分类、标签的分配以及标签交换路径LSP的建立和维护等操作。LDP规定了标签分发过程中的各种消息以及相关处理过程 术语 LDP会话&a…

数据采集与预处理复习资料

目录 第一章 简答 1.简述Hadoop各个组件及其功能 2.Hadoop在大数据技术体系中的地位和作用&#xff08;来自文心一言&#xff09; 3.Hadoop 启动命令&#xff0c;停止命令 4.pig 加载HDFS 数据 5.数据采集的方法&#xff08;来自ppt&#xff09; 6.数据分析过程&#xf…

chrome的插件怎么获取到安装包

问: chrome的插件怎么获取到安装包 回答: 在chrome浏览器输入: chrome://version/ 复制: 个人资料路径, 打开这个路径, 在文件中打开Extensions这个文件夹, 这个文件夹就是存放插件安装包的文件夹.

@ModelAttribute

基础知识 1.ModelAttribute注解源码&#xff0c;从中可以知道&#xff0c;该注解可以标注在参数上和方法上 2.应用场景&#xff1a;先大致有个概念&#xff0c;可以用来存储项目根路径 3.介绍&#xff1a;ModelAttribute 是 Spring 框架中的一个注解&#xff0c;用于在 Spring …

Springboot 权限认证框架 -- SA-Token 简介(一)

引言 现今的软件开发中&#xff0c;权限认证与访问控制是每一个应用都必不可少的功能。SA-Token是一个简单、安全、易用的权限认证框架&#xff0c;它主要解决登录认证、权限认证、Session会话、单点登录等功能。SA-Token以其轻量级、零学习成本的特点&#xff0c;迅速赢得了开…

Redis 7.x 系列【4】命令手册

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 说明2. 命令手册2.1 Generic2.2 数据类型2.2.1 String2.2.2 Hash2.2.3 List2.2.4 S…

生成式AI和LLM的一些基本概念和名词解释

1. Machine Learning 机器学习是人工智能&#xff08;AI&#xff09;的一个分支&#xff0c;旨在通过算法和统计模型&#xff0c;使计算机系统能够从数据中学习并自动改进。机器学习算法使用数据来构建模型&#xff0c;该模型可用于预测或决策。机器学习应用于各种领域&#x…

二本(三本)毕业、4年职场牛马----分享给计科专业男女孩或被迷茫、焦虑困扰的大学生们的一些感悟

背景 我不是一个贩卖焦虑的博主&#xff0c;博主二本&#xff08;三本升上来&#xff09;毕业&#xff0c;当年正逢2020疫情&#xff0c;一战考研失败&#xff0c;家里蹲到没有实习。靠关系进第一家公司做Python后端&#xff0c;然后第一家公司因为疫情黄了。二战考研又失败&a…

容器之滚动条窗体演示

代码; #include <gtk-2.0/gtk/gtk.h> #include <glib-2.0/glib.h> #include <gtk-2.0/gdk/gdkkeysyms.h> #include <stdio.h>int main(int argc, char *argv[]) {gtk_init(&argc, &argv);GtkWidget *window;window gtk_window_new(GTK_WINDO…

面试官:JavaScript执行机制中的闭包?

前言 JavaScript 中的闭包指的是一个函数以及其捆绑的周边环境状态的引用的组合。闭包可以让开发者从内部函数访问外部函数的作用域&#xff0c;即使外部函数已经执行完毕 今天我们通过JavaScript执行机制来聊聊闭包 正文 首先来分析这段代码的执行机制&#xff0c;这段代码…

<Rust><iced><resvg>基于rust使用iced构建GUI实例:使用resvg库实现svg转png

前言 本文是使用rust库resvg来将svg图片转为png图片。 环境配置 系统&#xff1a;windows 平台&#xff1a;visual studio code 语言&#xff1a;rust 库&#xff1a;resvg 代码分析 resvg是一个基于rust的svg渲染库&#xff0c;其官方地址&#xff1a; An SVG rendering li…

2024会展行业发展趋势预测

在当今这个数字化浪潮汹涌的时代&#xff0c;会展行业也迎来了自己的变革时刻。 根据《2023中国会展主办机构数字化调研报告》&#xff0c;我们可以清晰地看到几个显著的趋势&#xff1a; 首先&#xff0c;数字化转型已经不再是一道选择题&#xff0c;而是必答题。 超过90%的…

深入探索C++中的AVL树

引言 在数据结构和算法的世界里&#xff0c;平衡二叉搜索树&#xff08;Balanced Binary Search Tree, BST&#xff09;是一种非常重要的数据结构。AVL树&#xff08;Adelson-Velsky和Landis发明的树&#xff09;就是平衡二叉搜索树的一种&#xff0c;它通过自平衡来维护其性质…

噪声-降噪引脚如何提高系统性能

由于LDO是电子器件&#xff0c;因此它们会自行产生一定量的噪声。选择低噪声LDO并采取措施来降低内部噪声对于生成不会影响系统性能的清洁电源轨而言不可或缺。 识别噪声 理想的 LDO 会生成没有交流元件的电压轨。遗憾的是&#xff0c;LDO 会像其他电子器件一样自行产生噪声。…

【C++】关于代码编译自动更新版本的问题

在写代码的时候&#xff0c;总是需要添加一个版本号&#xff0c;用于后续的版本管理 我常遇到的一个问题是&#xff0c;开发过程中&#xff0c;不一定会记得这件事情&#xff0c;导致有时候会出现同样的版本 于是希望有一个方式&#xff0c;能在编译代码的时候自动生成一个版…

价值驱动型PMO如何实现项目战略目标?

近期&#xff0c;看到一个帖子&#xff0c;一位PMO&#xff08;小刘&#xff09;吐槽自己就是一个无情的项目推动机器&#xff0c;但还总被领导diss&#xff0c;他不知道问题出在哪了。评论区也有很多项目管理人吐槽自己也踩过类似的坑&#xff0c;那么本期就围绕这个案例展开相…

后端程序员的Linux命令指南

后端程序员的终极命令指南&#xff1a;考考自己是不是真正掌握Linux的使用 欢迎各位穿着格子衬衫&#xff0c;常年抱着键盘睡觉的后端小伙伴们&#x1f44b;&#x1f44b;&#x1f44b;&#xff01;今天&#xff0c;考考你们是不是掌握以下让你们在日后在服务器上叱咤风云的命令…

【环境变量问题:计算机删除环境变量的恢复方法;此环境变量太大。此对话框允许将值设置为最长2047个字符】

不小心误删了win10系统环境变量可以试试下文方法恢复。 本方法针对修改环境变量未重启的用户可以使用&#xff0c;如果修改环境变量&#xff0c;然后还重启了&#xff0c;只能说重新来。 方法一&#xff1a;使用命令提示符恢复 被修改的系统Path只是同步到了注册表中&#x…

天津这场智博会,成了智能时代的风向标

毫无疑问&#xff0c;这是一场智能产业的盛宴。 2024年6月20日至23日&#xff0c;国家会展中心&#xff08;天津&#xff09;迎来了一场智能科技领域的盛会——世界智能产业博览会&#xff1a;这场以“智行天下、能动未来”为主题的博览会&#xff0c;汇聚了全球49个国家和地区…