Java题集练习2

news2024/10/23 20:29:05

Java题集练习2

1.String直接赋值和new的对象个数,内存

String直接赋值会在字符串常量池中创建一个字符串,而使用new创建对象会储存在堆内存中,每使用new关键字就可以创建一个对象,但如果是String直接赋值同一个字符串第二次至多次时,由于第一次赋值该字符串已存在于字符串常量池中,所以不会创建新的对象,都使用常量池中的同一对象。

2.为什么字符串类型数据输出的时候,输出结果是字符串的值而不是字符串对象的地址(NEW出来的字符串对象)

因为字符串类型重写了Object类中的toString()方法,可以直接打印字符串的值而不是字符串对象的地址。

3.+连接String的对象个数

在java中,连接字符串的对象个数是基于所使用的连接方式而不同的。常见的连接方式包括使用“+”运算符,‘String.concat()’方法,以及‘StringBuilder’或‘StringBuffer’

  • 使用“+”运算符

    • Java中每次使用“+”连接字符串时,都会创建一个新的’String‘对象,因为String类型是不可变的对象

    • 编译器通常会优化一些简单的字符串连接操作。但在循环中使用“+”会生成多个中间’String‘对象

String s = "a" + "b" + "c";  // 编译器会优化成 "abc"

  • 使用 String.concat():

    • concat() 方法也会创建一个新的 String 对象,它本质上和 + 的作用类似。

    • String s = "a".concat("b").concat("c");
      
      
  • 使用 StringBuilderStringBuffer:

    • StringBuilder 是可变的,不会每次连接时创建新的对象。因此,在循环中频繁连接字符串时,StringBuilder 是最有效的方式。

    • StringBuilder sb = new StringBuilder();
      sb.append("a").append("b").append("c");
      
      

4.查找api学习split方法

我们知道,split方法常用于拆分字符串,比如字符串aa,bbb,cccc 我们想将它分为aa bbb cccc,就需要使用split方法将他们隔开,并删除逗号,以上问题可以这样来实现:

public class Split {
    public static void main(String[] args) {
        String str = "aa,bbb,cccc";
        String[] strings = str.split(",");
        for (String i :
                strings) {
            System.out.println(i);
        }
    }
}

由此一来,我们把一个字符串分为了我们需要的三个字符串,但是,split的用法并不止于此,看下面这段代码

    public class Split {
    public static void main(String[] args) {
        String str = "";
        String[] strings = str.split(",");
        System.out.println(strings.length);
    }
}

如果是一个空的字符串,我们使用split方法后打印他的长度,绝大部分人会认为长度为0,但结果为1,原因我们在后面详细说明,再来看看这段代码

public class Split {
    public static void main(String[] args) {
        String str = ",";
        String[] strings = str.split(",");
        System.out.println(strings.length);
    }
}

如果是一个只有逗号的字符串,它的长度会是几呢,有的人会认为是2,因为逗号前后都是一个空的字符串,也有人认为长度是1,只算逗号前的那个空字符串,但是结果是0,为什么是0呢?

我们先来看看split方法的源码

    public String[] split(String regex) {
        return split(regex, 0);
    }

    public String[] split(String regex, int limit) {
        具体实现...
    }

我们可以看到,split方法其实是有两个参数的,只不过我们平时使用的是他的重载方法,它默认把第二个参数limit设置为0

regex参数指的是:

1 如果表达式不匹配输入的任何内容,返回的数组只具有一个元素,即此字符串(空字符也是一个字符串)

2 可以匹配的情况下,每一个字符串都由另一个匹配给定表达式的子字符串终止,或者由此字符串末尾终止(数组中的字符串按照他们在此字符串中出现的顺序排列)

limit参数指的是:

1 limit>0:模式匹配将被最多应用n-1次,数组的长度将不会大于n,数组的最后一项将包含所有超出最后匹配的定界符的输入

2 limit<0: 模式匹配将应用尽可能多的次数,而且数组的长度是任何长度。

3 lilmit=0: 模式匹配将被应用尽可能多的次数,数组可以是任何长度,并且结尾空字符串将被丢弃。

讲解完参数我们知道,我们使用的split方法limit参数是默认设置为0的,这也是为什么第二种情况他的长度是1,因为它与逗号不匹配,所以返回的是空字符串,而最后一种情况长度是0,是因为

5.StringBuffer和String的相同不同

StringBuff和String的相同点:

1 都用来处理字符串

2 两个类都提供了length(),toString(),charAt(),subString()方法,而且在两个类中的用法完全相同

3 字符在字符串中的位置都是从0索引处开始的

不同点:

1 String是不可变类,StringBuffer是可变类

2 String类覆盖了Object类中的equals方法,而StringBuffer并没有覆盖

3 两个类都覆盖了Object类中的toString方法,但是各自实现的方式是不一样的,String类会返回当前String实例本身的引用,而StringBuffer返回一个以当前StringBuffer缓冲区中的所有字符为内容的新的String对象的引用

6 8种基本数据类型的数据 存放在哪个区

8中基本数据类型的数据都存放在栈内存中,而引用类型的数据存放在堆内存中

7 String,基本类型,包装类的转换,并写出案例

代码实现

public class StringTransformNormal {
    public static void main(String[] args) {
        String intString = "123";
        char c = 'a';
        //String类型转换为基本数据类型的包装类
        Integer integer = Integer.parseInt(intString);
        System.out.println(integer * 10);
        //基本数据类型转换为String类型
        String cString = Character.toString(c);
        System.out.println(cString);
    }
}

8 不变模式,如果String不是不变模式会出现什么问题

不变模式,就是为了尽可能的去除并行中的同步操作,提高并行程序的性能,可以使用一种不可改变的对象,依靠对象的不变性,可以确保其在没有同步操作的多线程环境中依然始终保持内部状态的一致性和正确性。并且,不变模式通过回避问题而不是解决问题的态度来处理多线程并发访问控制。

不变模式的主要使用场景

1 当对象被创建后,其内部状态和数据不再发生变化

2 当对象需要被共享,被多线程频繁访问

实现方法

  1. 去除setter方法以及所有修改自身属性的方法。
  2. 将所有属性设置为私有,并用final标记,确保不能被修改
  3. 确保没有子类可以重载
  4. 有一个可以创建完整对象的构造函数

关于String中的不变模式

在JDK中,不变模式有很多应用,如Integer,Long等所有元数据类的包装类,当然,最典型的就是String类了。

对于String类而言,内部是这样定义的:public final class String  是一个被final关键字修饰的类,我们来看看上面说到final关键字的作用,这就意味着:

  1. String中的数据只能在String对象被构建时赋值,之后就永远不能改变
  2. String类不会有子类重载它的方法,也确保了String类生成的对象就是String对象,而不可能是其他类的对象

String如果不是不变模式会存在的问题

1 安全问题:

String基本约定中有一个最重要的条例是immutable,意思为不可被复写,由于String几乎是每个类都会使用的类,所以保护他的不变模式是非常重要的,如果没有声明为final,String的子类就可能被复写,复写后的String有非常大的风险,例如会破坏HashMap键值的唯一性

2 性能问题:

String类在堆中还维护着一个字符串常量池中,每个字符串的值其实都指向同一个内存地址,所以在大量使用字符串的情况下,使用不变模式可以节省内存空间,提高效率

9 .equals和= = 的对比,String类和其他类 举例

在比较八种基本数据类型时,类型之间的比较只能使用==,因为.euqals方法是String类重写了Object类中的equals方法,用于与其他数据比较,比如,我想比较int和long类型数据,代码如下

public static void main(String[] args) {
        int a = 10;
        long b = 10L;
        System.out.println(a == b);
        //结果为true,因为两个类型的数据都是10,他们的值是相等的
    }

那么,String类与八种基本数据类型之间的比较是怎样表现的呢,我们看下面这段代码

 public static void main(String[] args) {
        String str = "123";
        String s = "123";
        int a = 123;
        System.out.println(str.equals(a));
        //结果为false
        System.out.println(str == s);
        //结果为true,因为两个字符串的值是相同的
        //String类型不可用于==比较八种基本数据类型
    }

我们可以看到,第一段打印的结果之所以为false,是因为equals方法内部具有两重判断,第一重判断是判断两个数据的内存地址是否相同,如果不相同则直接为false,如果相同则进行第二重判断来判断是否两个数据的值是相同的。

第二段打印我们可以看出,在八种基本数据类型和String类型之间是无法通过==进行比较的,但可以在String类型内部进行比较,也可以用于其他引用数据类型之间的比较,比较的是两个引用类型的地址,由于两个字符串的值都是“123”,所以结果为true。那么我们可以设想一下,str和s如果使用equals方法进行比较,结果会是什么呢?

  public static void main(String[] args) {
        String str = "123";
        String s = "123";
        int a = 123;
        System.out.println(str.equals(s));
        //结果为true

    }

不难看出,结果肯定是为true的,这涉及到String类型创建字符串的知识,String类型创建的对象都会存储在字符串常量池中,所以str和s代表的是同一个地址,都是已经保存在字符串常量池中的“123”。

综上所述,我总结出了equals方法与的区别,我将分别叙述与equals方法的作用来说明

==运算符

  • 在八种基本数据类型之间进行比较时,比较的是他们的值

  • 在引用数据类型之间比较时,比较的是他们在内存中的地址

equals方法

  • 第一重判断:判断两个数据的内存地址是否相同,不相同返回为false

  • 第二重判断:再判断两个数据的值是否相同,相同返回true,反之

10 源码提升:打印地址的四种方法及源码

public static void main(String[] args) {
        Print print = new Print();
        //First 直接打印
        System.out.println(print);
        //Second 使用toString方法
        System.out.println(print.toString());
        //Third 使用hashCode方法
        System.out.println(print.hashCode());
        //Forth 使用System.identityHashCode方法
        System.out.println(System.identityHashCode(print));
    }

其中,toString方法的源码中最后调用的是hashCode方法,只不过是前面进行了一个地址表示方式的转换,转换为十六进制数来表示。那么问题来了,如果重写了hashCode方法,哪一个打印方法的值会永远不变呢?显然是最后一种方法,第一种直接打印的方式也相当于是使用了hashCode方法,只有最后一种是自己创建的方法来打印地址;同时,如果重写了hashCode方法,则也需要重写equals方法,因为equals方法中也使用了hashCode方法来比较两个引用类型的地址是否相同。

11 浅拷贝和深拷贝

浅拷贝指的是复制一个对象的所有属性值,复制该对象的引用,而不是复制一个新对象出来。

深拷贝则是复制一个对象的所有数据,包括这个对象,拷贝出一个具有新地址的新对象。

简单来说,浅拷贝后的对象与他所拷贝的对象共用一个引用,即修改他们两个任意一个的属性值,另一个对象的属性值也会随之而改变;而深拷贝则是拷贝出了一个与被拷贝对象完全相同的新对象,但拷贝后改变他的属性值,原对象并不会随之而改变。

以上就是我所做的java题集练习第二章的所有内容,欢迎各位大佬纠察指正,谢谢!

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

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

相关文章

从0到1实现你自己的AI Chat应用

目标 基于大语言模型的 Chat 应用&#xff0c;是一种利用自然语言处理技术来进行对话交互的智能应用。 大语言模型通过大量数据的学习和训练&#xff0c;能够理解自然语言表达的语义&#xff0c;具备智能对话的能力。当用户向 Chat 应用提出问题时&#xff0c;Chat 应用就会利…

理解TypeScript模块-声明-配置

目录 模块化内置类型导入命名空间类型查找内置类型外部定义声明第三方库自定义声明 tsconfig.json文件在Vue项目中应用在React项目中应用 模块化 在TypeScript中最主要使用的模块化方案就是ES Module&#xff0c;先理解 TypeScript 认为什么是一个模块&#xff1a; JavaScript…

如何利用 Python抓取网页数据 其他方式抓取网页数据列举

在 Python 中可以使用多种方法抓取网页数据&#xff0c;以下是一种常见的方法&#xff0c;使用requests和BeautifulSoup库。 一、安装所需库 在命令提示符或终端中执行以下命令安装requests和BeautifulSoup库&#xff1a; pip install requests pip install beautifulsoup4二…

Spring Boot论坛网站开发:最佳实践指南

3系统分析 3.1可行性分析 通过对本论坛网站实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本论坛网站采用SSM框架&#xff0c;JAVA作为开发语言&#xff0c;是…

使用 Cursor 和 Devbox 快速开发并上线 Gin 项目

作为开发者&#xff0c;最让我们头疼的事情是什么&#xff1f;那必须是环境配置、版本控制以及各种部署配置等等繁琐的工作。 想象一下&#xff0c;如果你只需点击几下鼠标&#xff0c;就能拥有一个完全配置好的开发环境&#xff0c;支持从 Java 到 Python&#xff0c;从 Reac…

[实时计算flink]作业开发上线流程及规范

随着数据量的爆炸性增长和业务需求的日益复杂化&#xff0c;企业对实时数据处理能力的需求愈发迫切。Flink作为一种强大的流处理框架已经成为实时计算标准&#xff0c;其规范化的开发和运维流程对于企业提升数据处理效率、确保系统稳定性至关重要&#xff0c;旨在提升研发效率&…

电商大数据获取渠道分享--官方接口、爬虫、第三方如何选择?

在当今大数据驱动的商业环境中&#xff0c;电商企业越来越依赖数据分析来洞察市场、优化运营和提升竞争力。本文将分享几种常见的电商大数据获取渠道&#xff0c;帮助电商从业者更有效地收集和利用数据资源。 一、电商平台官方接口 各大电商平台如淘宝、京东、拼多多等&#…

DML语言

DML&#xff08;数据操作语言&#xff09; 用于操作数据库对象中所包含的数据 包括&#xff1a; INSERT ( 添加数据语句 ) UPDATE ( 更新数据语句 ) DELETE ( 删除数据语句 ) INSERT ( 添加数据语句 ) INSERT INTO 表名 [ ( 字段1, 字段2, 字段3, … ) ] VALUES ( 值1, 值2,…

计算机网络-RSTP工作过程与原理

前面我们已经学习了RSTP的一些基础概念以及对于STP的改进之处&#xff0c;因为RSTP兼容STP&#xff0c;所以实际上两者工作原理是一致的&#xff0c;这里只简单过一遍&#xff0c;然后进行一些基础实验即可&#xff0c;大致还是遵循选举根桥、确定端口角色与状态、全网收敛的思…

CentOS 8 Stream环境下通过yum安装Mysql

1.在Mysql下载页面MySQL :: Download MySQL Community Server页尾 点击 “MD5 checksums and GnuPG signatures” 进入下一页面 2.打开下载yum repo文件页面 (MySQL :: Download MySQL Yum Repository) 3.点击"DownLoad"按钮&#xff0c;打开下载页面&#xff0c; 4.…

GB/T28181-2022规范解读、应用场景和技术实现探究

GB/T28181-2022和GB/T28181-2016区别 GB/T28181-2022《公共安全视频监控联网系统信息传输、交换、控制技术要求》与 GB/T28181-2016 相比&#xff0c;主要有以下区别&#xff1a; 术语和定义方面&#xff1a; 术语删减&#xff1a;GB/T28181-2022 删除了 “联网系统信息”“数…

大模型LLM学习路线图2024年最新版!全面掌握学习路径,非常详细,零基础想学大模型收藏这一篇就够了

ChatGPT的出现在全球掀起了AI大模型的浪潮&#xff0c;2023年可以被称为AI元年&#xff0c;AI大模型以一种野蛮的方式&#xff0c;闯入你我的生活之中。 从问答对话到辅助编程&#xff0c;从图画解析到自主创作&#xff0c;AI所展现出来的能力&#xff0c;超出了多数人的预料&…

【redis】redis的多线程和IO多路复用

【redis】redis的多线程和IO多路复用 【一】前言【二】Redis单线程和多线程问题的背景【1】Redis的单线程【2】Redis为什么选择单线程&#xff1f;【3】Redis为什么开始利用多核&#xff1f;【4】Redis当前的性能瓶颈【5】Redis的主线程如何和IO线程协同 【三】IO多路复用的理解…

【Trick】IOS系统解决“未受信任的企业级开发者”问题

问题&#xff1a; 本人通过扫码下载了一个软件&#xff0c;下载完毕后出现以下提示&#xff1a; 解决方法&#xff1a; 这个主要是操作系统的问题&#xff0c;需要在设置里面更改&#xff0c;具体步骤如下&#xff1a; 【1】打开设置&#xff0c;选择【通用】 【2】选择【VP…

千鹿 AI ——AI一键生成模特上身图,零成本制作服装电商图片,AI换模特/背景/批量抠图,一个网站就够了!

前言 在电商行业&#xff0c;卖产品主要是卖图片。拍一套产品图加上美工费用&#xff0c;基本要大几百上千&#xff0c;对新手卖家是不小的支出。服装类目的 SKU 很多&#xff0c;一个链接下有几十个款式很常见。 AI 出现对跨境电商有好处是大家都知道的。现在看看电商领域的…

rust aarch64开发-编译

1. 实验代码下载 本实验基于github或gitee上的开源实现。 // 无法访问github可以通过如下地址下载 git clone https://gitee.com/yang_jun_yi/armv8-rust-hypervisor.git // github下载 git clone https://github.com/Comet959/armv8-rust-hypervisor.git2. 编译 make start…

PG实践|数学函数及其操作(一)

文章目录 引言1.1 ABS() - 取绝对值1.2 CEIL() 或 CEILING() - 向上取整1.3 FLOOR() - 向下取整1.4 ROUND() - 四舍五入1.5 TRUNC() - 截断/截取小数总结 &#x1f4eb; 作者简介&#xff1a;「六月暴雪飞梨花」&#xff0c;专注于研究Java&#xff0c;就职于科技型公司后端工程…

Spring配置/管理bean-IOC(控制反转) 非常详细!基于XML及其注解!案例分析! 建议复习收藏!

目录 1.Spring配置/管理bean介绍 2.基于XML配置bean 2.1基于id来获取bean对象 2.2基于类型获取bean对象 2.3通过指定构造器配置bean对象 2.4通过p名称空间配置bean 2.5通过ref配置bean(实现依赖注入) 2.6注入内部Bean对象&#xff0c;依赖注入另一种方式 2.7 注入集合…

AWD的复现

学习awd的相关资料&#xff1a;速成AWD并获奖的学习方法和思考记录- Track 知识社区 - 掌控安全在线教育 - Powered by 掌控者&#xff08;包含使用脚本去批量修改密码&#xff09; 在复现之前去了解了以下AWD的相关脚本 资料&#xff1a;AWD批量攻击脚本使用教程-CSDN博客 …

网络安全有关法律法规

1. 前言 在当今数字化高速发展的时代&#xff0c;网络安全已成为关乎国家、企业和个人的重要议题。为了应对日益复杂的网络安全挑战&#xff0c;一系列网络安全法律法规应运而生&#xff0c;它们如同坚实的盾牌&#xff0c;守护着我们的数字世界。现在是2024年10月&#xff0c…