学点儿Java_Day9_String、包装类

1 String

详解“==”和equals的区别
在这里插入图片描述

@Test
    public void test1() {
        //"abc"双引号括起来的字符串:字符串常量,它也是一个对象
        // 1.8之后常量池放到堆,在常量池里面找有没有这个"abc"对象,
        // 如果常量池里面没有这个字符串对象,java就帮你在常量池里面new一个"abc"字符串对象。
        // 如果常量池里面有这个字符串,就把这个字符串的地址赋给这个变量。
        String str1 = "abc";
        String str2 = new String("abc");
        String str3 = "abc";
        //------------   == 与 equals -----------------------//
        // ==: 比较的是变量指向的对象的地址值
        System.out.println(str1 == str2);//false
        System.out.println(str1 == str3);//true
        System.out.println(str2 == str3);//false

        // equals: 比较字符串的内容是不是相等
        // 比较字符串的内容是不是相等使用equals()
        // 表str1这个字符串和str2这个字符串的内容是不是相等
        System.out.println(str1.equals(str2));//true
        System.out.println(str1.equals(str3));//true
        System.out.println(str2.equals(str3));//true
    }

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

@Test
    public void test2() {
        String str = "Java AndroidA";
        System.out.println(str.length());//13
        char[] chars = str.toCharArray();
        char ch = str.charAt(5);
        System.out.println(ch);//'A'
        System.out.println(str.indexOf('A'));//5 char -> int小的自动转大的
        System.out.println(str.indexOf('X'));
        System.out.println(str.indexOf('A', 6));//12
        System.out.println(str.indexOf("And"));
        System.out.println(str.lastIndexOf('A'));//12
    }

    @Test
    public void test3() {
        String str1 = "java";
        String str2 = "Java";
        System.out.println(str1.equals(str2));//false
        System.out.println(str1.equalsIgnoreCase(str2));//true

        String str = "java AndroidA";
        System.out.println(str.contains("And"));//true
        System.out.println(str.startsWith("java"));//true
        //offset:偏移
        System.out.println(str.startsWith("And", 5));//true
        System.out.println(str.endsWith("oidA"));//true
        System.out.println(str.isEmpty());//false
        // ""空字符串,也是一个对象
        System.out.println("".isEmpty());//true
    }

    @Test
    public void test4() {
        char[] chars1 = {'j', 'a', 'v', 'a', ' ', 'A', 'n', 'd'};
        String str1 = new String(chars1);
        System.out.println(str1);
        char[] chars2 = str1.toCharArray();
        System.out.println(chars2);
        //Arrays: 操作数组的工具类
        System.out.println(Arrays.toString(chars1));//[j, a, v, a,  , A, n, d]
    }

    @Test
    public void test5() {
        String str = "java AndroidA";
        String newStr = str.replace('A', 'B');
        System.out.println(newStr);
    }

    @Test
    public void test6() {
        String str = "java android python";
        String[] array = str.split(" ");
        System.out.println(array);
        System.out.println(Arrays.toString(array));
    }

    @Test
    public void test7() {
        // subtree: 子树
        // substring:子字符串
        String str = "java AndroidA";
        System.out.println(str.substring(5));//AndroidA

        //beginIndex – the beginning index, inclusive.
        //endIndex – the ending index, exclusive.
        System.out.println(str.substring(5, 8));//Andr
    }

2 String、StringBuffer、StringBuilder异同点

相同点: 都是final类,都不能被继承。
不同点:
    ① String长度是不可改变的,StringBuffer、StringBuilder长度是可变的。
    ② StringBuffer是线程安全(需要加锁,效率低)、StringBuilder是线程不安全(没有加锁,效率高)。

银行取款业务,如果对这段代码加锁,就可以实现每次只有一个用户能进入这段代码,当执行完了之后,释放这个锁,另一个用户才能进来。

synchronized: 同步   加锁
if (money>=1000) {
     money = money - 1000;
}
String str = str1 + str2 + str3 + str4;
String str1 = "java";
str1 + "android";

常量字符串的拼接,编译器会做优化,使用String就可以:

String str = "Java" + "PHP" + "Python" + "C";
    @Test
    public void test8() {
        String str1 = "Java";
        String str2 = "PHP";
        String str3 = "Python";
        String str4 = "OpenHarmony";
        String str = str1 + str2 + str3 + str4;
        System.out.println(str);
        //执行效率非常低 String长度不可变,相加过程会new新的str,中间的还要回收

        StringBuffer buffer = new StringBuffer("C");//线程安全 效率低
//        buffer.append(str1);
//        buffer.append(str2);
//        buffer.append(str3);
//        buffer.append(str4);
        //链式编程
        buffer.append(str1).append(str2).append(str3).append(str4);
        System.out.println(buffer);

        StringBuilder builder = new StringBuilder("C");//线程安全 效率低
        builder.append(str1);
        builder.append(str2);
        builder.append(str3);
        builder.append(str4);
        //也可以链式编程
        System.out.println(builder);

        String str5 = "Java" + "PHP" + "Python" + "C";
        //字符串常量的拼接无所谓 编译器会做优化
    }

3 包装类(参考https://blog.csdn.net/weixin_37766087/article/details/93405801)

3.1 什么是包装类

    包装类(Wrapper Class): Java是一个面向对象的编程语言,但是Java中的八种基本数据类型却是不面向对象的,为了使用方便和解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八种基本数据类型对应的类统称为包装类(Wrapper Class),包装类均位于java.lang包。
    为什么不是面向对象的就会出现不足,是哪里不足??
java中的数据类型int,double等不是对象,无法通过向上转型获取到Object提供的方法,而像String却可以,只因为String是一个对象而不是一个类型。基本数据类型由于这样的特性,导致无法参与转型,泛型,反射等过程。为了弥补这个缺陷,java提供了包装类。因为8大基本数据类型不是类,所以它们也没有对应的方法和变量,也就没有各种各样的功能。更主要的一点,在一些场景当中,我们是不能使用基本数据类型只能使用对象的。比如一些容器,像是ArrayList、HashMap只能接受一个对象,再比如我们提供了一个方法,但是调用方有可能传入一个空值。如果我们使用基本数据类型,null会引发报错。
所以包装类正是为了解决这个问题而产生的。

aa
虽然基本数据类型和包装数据类型互相转换有装箱和拆箱的过程,但是我们平时使用的时候
就把包装数据类型当成基本数据类型来使用就可以。

3.2 自动装箱与自动拆箱

Talk is cheap, show me the code.

@Test
    public void test9() {
        //public static final int   MAX_VALUE = 0x7fffffff;//16进制 全1
        System.out.println(Integer.MAX_VALUE);//常量命名规则 全大写下划线连接

        //自动装箱和自动拆箱
        //'Integer(int)' is deprecated and marked for removal
        // JDK9之后deprecate 不赞成
        Integer integer1 = new Integer(3);//手动装箱
        System.out.println(integer1);
        Integer integer2 = 4;//基本数据类型--->引用数据类型   自动装箱(Java帮做new)
        System.out.println(integer2);
        //int i = integer2.intValue();//手动拆箱
        int i = integer2;//引用数据类型--->基本数据类型  自动拆箱
        Integer integer3 = Integer.valueOf(5);//手动装箱
        System.out.println(integer3);

        Integer integer4 = 3;
        int num2 = integer4 + 2;
        integer4 = integer4 + 4;
        System.out.println(integer4);
    }

Java 5 增加了自动装箱、拆箱机制,提供基本数据类型和包装类型的相互转换操作。
    自动装箱:Integer i1=8; //int 8 自动转为Integer型
    自动拆箱:int i2= i1; //将Integer型转为 基本数据类型 int
这些过程由JDK 编译器自动装箱完成的,即会自动调用 Integer.valueOf() 方法

包装数据类型最主要使用: 包装数据类型和字符串之间的转换
1、把基本数据类型转换成字符串
     (1) 基本数据类型+“” : String str = 12 + “”; // “12”
     (2) 基本数据类型的包装类.toString()
        String str1 = Integer.toString(3);
        String str2 = Double.toString(3.14);
2、把字符串转换成基本数据类型(从网页的输入框中得到的都是字符串)
     (1) Integer.parseInt(String str); // "23 " 类名.方法 ----> 静态方法
         Double.parseDouble(String str); // “3.14”
         Boolean.parseBoolean(String str);//“true”
         XXXX.parseXXXX(String str);

     (2) new对象: Integer integer = new Integer(String str);
         Integer interger = new Integer(“4”);
         int i = integer.intValue();

    @Test
    public void test10() {
        //把字符串转换成基本数据类型(从网页的输入框中得到的都是字符串)
        String str1 = "123";
        int i = Integer.parseInt(str1);
        i = i + 1;
        System.out.println(i);
        System.out.println(Double.parseDouble("6.9999"));

        //下面的不常用
        String str = "123";
        //Integer integer1 = new Integer(str);//deprecated 不赞成
        //Integer integer2 = new Integer("4");//deprecated 不赞成
        Integer integer1 = Integer.valueOf(str);
        Integer integer2 = Integer.valueOf("1");
        int j = integer1.intValue();
        int k = integer2.intValue();
        System.out.println(j);
        System.out.println(k);
    }

    @Test
    public void test11() {
        //把基本数据类型转换成字符串
        String str1 = 12 + "";
        System.out.println(str1);

        String str2 = Integer.toString(3);
        String str3 = Double.toString(3.15);
        System.out.println(str2);
        System.out.println(str3);
    }

学习参考

Java 包装类:https://blog.csdn.net/weixin_37766087/article/details/93405801
Java自动装箱和自动拆箱:https://blog.csdn.net/m0_71469414/article/details/130914789
【Java】Java 中的自动装箱和拆箱:https://blog.csdn.net/swadian2008/article/details/128290566

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

是德科技keysight N1912A双通道功率计

181/2461/8938产品概述: Keysight(原Agilent) N1912A P系列双通道功率计可提供峰值、峰均比、平均功率、上升时间、下降时间、最大功率值、最小功率值以及宽带信号的统计数据。 Keysight(原Agilent) N1912A P系列双通道功率计, 可提供峰值、峰均比、平均功率、上升…

nodejs各版本下载

https://registry.npmmirror.com/binary.html 然后进入nodejs各个版本,然后按需选择

JAVA 栈和队列总结

除了最底层下面三个是实现类,其他都是接口。 双端队列(队头队尾都可以插入和删除元素)的方法: 普通队列方法: 常用的是add(),poll(), element() 我们用Deque(双端队列)实现栈 Deque当栈用的时候的方法。 deque.push…

百度小程序入口在哪里找到怎么打开百度词令关键词口令直达小程序?

百度小程序入口在哪里找到怎么打开百度词令关键词口令直达小程序? 一、百度搜索找到百度词令小程序 打开手机百度搜索「词令」即可找到百度词令关键词口令直达小程序; 二、百度小程序中心找到百度小程序 2.1、打开手机百度,点击底部我的&a…

解决用POI库生成的word文件中的表格在python-docx无法解析的问题

问题背景 用apache-poi生成word文件中表格&#xff0c;在使用python-docx库解析时报错&#xff1a; 问题分析 1. word文档本质上是一个rar压缩包&#xff0c;用winrar解析后如下&#xff1a; 2. 查看document.xml&#xff0c;可以看到table元素下面是没有<w:tblGrid>这…

Carla 自动驾驶挑战赛 搭建环境

1. 系统设置 1.1 下载CARLA排行榜包 下载打包的CARLA 排行榜版本。 将包解压到一个文件夹中&#xff0c;例如 CARLA。 在以下命令中&#xff0c;更改${CARLA_ROOT}变量以对应于您的 CARLA 根文件夹。 为了使用 CARLA Python API&#xff0c;您需要在您喜欢的环境中安装一些…

ARM-Linux 开发板下安装编译 OpenCV 和 Dlib

安装 OpenCV 和 Dlib 不像在 x86 平台下那样简单&#xff0c;用一句命令就可以自动安装完。而在 ARM 平台中许多软件都需要自行下载编译&#xff0c;且还有许多问题&#xff0c;本篇文章就是记录在 ARM 平台下载 OpenCV 踩过的坑。 硬件环境&#xff1a; RK3568 Ubuntu20.04…

一文读懂I2C协议

一.硬件连接 I2C必须使用开漏&#xff08;或集电极开路&#xff09;的引脚&#xff0c;其引脚框图如下所示。 SCL0对应78K0的P6.0引脚&#xff0c;SDA0对应78K0的P6.1引脚。 在使用开漏引脚通信时&#xff0c;需注意如下事项&#xff1a; 1&#xff09;两条总线须外接…

jvm提供的远程调试 简单使用

JVM自带远程调试功能 JVM远程调试&#xff0c;其实是两个虚拟机之间&#xff0c;通过socket通信&#xff0c;达到远程调试的目的&#xff1b; 前提 确保本地和远程的网络是开通的&#xff1b; 本地操作 远程操作 在启动命令参数中 把上面的内容复制进去

基于CSS3制作专属可自由旋转的立方体

一、代码区域 1.1 css3代码区域 <style>* {padding: 0;margin: 0;list-style: none;}/* 1) 定义动画 */keyframes loop {0% {transform: rotateX(348deg) rotateY(67deg) rotateZ(95deg);}50% {transform: rotateX(0deg) rotateY(0deg) rotateZ(0deg);}100% {transform:…

list.sort()Collections.sort()深入理解

list.sort()&&Collections.sort() 文章目录 list.sort()&&Collections.sort()背景相关代码代码一代码二 原理举一反三 业务场景考虑 背景 业务中经常用到List的sort()方法&#xff0c;但是对于其中return的-1&#xff0c;0&#xff0c;1理解不到位&#xff0c…

(附源码)基于Spring Boot与Vue的宠物用品销售系统设计与实现

前言 &#x1f497;博主介绍&#xff1a;✌专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅&#x1f447;&#x1f3fb; 2024年Java精品实战案例《100套》 &#x1f345;文末获取源码联系&#x1f345; &#x1f31…

用BSP优化3D渲染

3D渲染引擎设计者面临的最大问题之一是可见性计算&#xff1a;只必须绘制可见的墙壁和物体&#xff0c;并且必须以正确的顺序绘制它们&#xff08;应该在远处的墙壁前面绘制近墙&#xff09; 。 更重要的是&#xff0c;对于游戏等应用程序来说&#xff0c;开发能够快速渲染场景…

vue的优缺点有那些 组件常用的有那些?

优点&#xff1a; 组件化开发&#xff0c;提升效率&#xff0c;方便复用&#xff0c;便于协同开发单页面路由易于结合其他的第三方库丰富的api方法轻量高效,虚拟DOMMVVM&#xff0c;数据驱动视图轻量级的框架 缺点&#xff1a; 缺少高阶教程和文档生态环境不如angular和re…

nuclei使用方法

nuclei使用方法 查看帮助 nuclei -h 列出所有模板 nuclei -tl 查找某种cms的相关漏洞模板&#xff0c;wordpress为例 nuclei -tl -tc "contains(name,wordpress)"便会列出内容里含有wordpress关键字的漏洞检测模板 使用与某cms相关的所有漏洞模板进行扫描&#…

MATLAB机器学习工具箱——傻瓜式操作

一、使用回归学习期预测北京二手房房价 软件&#xff1a;MATLAB R2023 a 数据&#xff1a; 第一步&#xff1a;导入原始数据和待预测数据 第二步 &#xff1a;打开工具箱中的回归学习器导入学习数据 1.新建会话 2.寻找导入learning data 3.自动锁定前7列为自变量&#xff…

课时72:流程控制_for循环_嵌套循环

1.1.1 嵌套循环 学习目标 这一节&#xff0c;我们从 基础知识、简单实践、小结 三个方面来学习。 基础知识 简介 这里的嵌套实践&#xff0c;与选择语句的嵌套实践基本一致&#xff0c;只不过组合的方式发生了一些变化。常见的组合样式如下&#xff1a;for嵌套for语句for …

网络安全知识核心之TCP与UDP区别

TCP 面向连接&#xff08;如打电话要先拨号建立连接&#xff09;提供可靠的服务;UDP 是无连接的&#xff0c;即发送数据之前不需要建立连接&#xff0c;;UDP 尽最大努力交付&#xff0c;即不保证可靠交付。&#xff08;由于 UDP 无需建立连接&#xff0c;因此 UDP 不会引入建立…

Python连接MariaDB数据库

2024软件测试面试刷题&#xff0c;这个小程序&#xff08;永久刷题&#xff09;&#xff0c;靠它快速找到工作了&#xff01;&#xff08;刷题APP的天花板&#xff09;【持续更新最新版】-CSDN博客 Python连接MariaDB数据库 一、安装mariadb库 pip install mariadb 二、连接…

解决 poi3.8版本在word中插入图片不展示的问题

解决 poi3.8版本在word中插入图片不展示的问题 1. 前言2. 问题描述3. 解决问题3.1 方案1——自定义XWPFDocument3.1.1 解决代码3.1.2 参考 3.2 方案2——使用开源框架xdocreport 4. 其他 1. 前言 本次使用的是poi3.8版本&#xff0c;引入的依赖如下&#xff1a; <dependency…
最新文章