第十三章 常用类(包装类和 String 相关类)

news2024/11/20 11:44:11

一、包装类

1. 包装类的分类

(1)针对八种基本数据类型相应的引用类型—包装类

(2)有了类的特点,就可以调用类中的方法。

2. 包装类和基本数据类型的转换

(1)jdk5 前的手动装箱和拆箱方式

public class Test {

    public static void main(String[] args) {

        int n1 = 100;
        //jdk5 前的手动装箱和拆箱方式
        //装箱
        Integer integer = new Integer(n1);
        Integer integer1 = Integer.valueOf(n1);

        //拆箱
        int i = integer.intValue();
    }
}

(2)jdk5 及以后的自动装箱和拆箱方式

public class Test {

    public static void main(String[] args) {

        int n1 = 100;
        //jdk5 及以后的自动装箱和拆箱方式
        //装箱
        Integer integer = n1;// 底层是 Integer.valueOf()

        //拆箱
        int i = integer;// 底层是 intValue()
    }
}

3. 包装类和 String 类型的相互转换

public class Test {

    public static void main(String[] args) {

        //包装类(Integer)->String
        Integer i = 100;//自动装箱
        //方式 1
        String str1 = i + "";
        //方式 2
        String str2 = i.toString();
        //方式 3
        String str3 = String.valueOf(i);

        //String -> 包装类(Integer)
        String str4 = "12345";
        //方式 1
        Integer i2 = Integer.parseInt(str4);//使用到自动装箱
        //方式 2
        Integer i3 = new Integer(str4);//构造器
    }
}

4. Integer 类和 Character 类的常用方法

public class Test {

    public static void main(String[] args) {

        System.out.println(Integer.MIN_VALUE); //返回最小值
        System.out.println(Integer.MAX_VALUE);//返回最大值
        System.out.println(Character.isDigit('a'));//判断是不是数字
        System.out.println(Character.isLetter('a'));//判断是不是字母
        System.out.println(Character.isUpperCase('a'));//判断是不是大写
        System.out.println(Character.isLowerCase('a'));//判断是不是小写
        System.out.println(Character.isWhitespace('a'));//判断是不是空格
        System.out.println(Character.toUpperCase('a'));//转成大写
        System.out.println(Character.toLowerCase('A'));//转成小写
    }
}

二、String 类(P466)

1. String 类的理解和创建对象

(1)String对象 用于保存字符串,也就是一组字符序列。

(2)字符串常量对象是用双引号括起的字符序列。

(3)字符串的字符使用 Unicode 字符编码,一个字符(不区分字母还是汉字)占两个字节。

(4)String类 实现了接口 Serializable【String 可以串行化:可以在网络传输】。

(5)String类 实现了接口 Comparable 【String 对象可以比较大小】。

(6)String 是 final 类,不能被其他的类继承。

(7)String 有属性 private final char value[]:用于存放字符串内容。

(8)一定要注意:value 是一个 final 类型,不可以修改【即 value 不能指向新的地址,但是单个字符内容是可以变化】。

(9)字符串常用构造器

public class Test {

    public static void main(String[] args) {

        String s1 = new String();

        //public String(String original)
        String s2 = new String("字符串");

        //public String(char value[])
        char[] data = {'a','b','c'};
        String s3 = new String(data);

        //public String(char value[], int offset, int count) 
        String s4 = new String(data,1,2);

    }
}

2. 两种创建 String 对象的区别

方式一:直接赋值 String s= "hsp" ; 
方式二:调用构造器 String s2 = new String("hsp");
(1)方式一:先从常量池查看是否有 “hsp” 数据空间,如果有,直接指向;如果没有则重新创建,然后指向。s 最终指向的是常量池的空间地址。
(2)方式二:先在堆中创建空间,里面维护了 value 属性,指向常量池的 hsp 空间。如果常量池没有“hsp”,重新创建,如果有,直接通过 value 指向。最终指向的是堆中的空间地址。
(3)画出两种方式的内存分布图

3. 字符串的特性

(1)String 是一个 final 类,代表不可变的字符序列。

(2)字符串是不可变的。一个字符串对象一旦被分配,其内容是不可变的。

        // 编译器自动优化为 String str = "helloabc";
        String str = "hello" + "abc";
        String s1 = "hello";
        String s2 = "abc";
        // 1,先创建一个 StringBuilder sb = StringBuilder()
        // 2. 执行 sb.append("hello");
        // 3. sb.append("abc”);
        // 4. String str = sb.tostring()
        // 最后其实 str -> 堆中的对象(String) value[] -> 池中"helloabc"
        String str = s1 + s2;

        String s3 = "helloabc"; // s3 -> 池中"helloabc"
        System.out.println(str == s3); // false

重要规则:

String c1 = "ab" + "cd";常量相加,看的是池。

String c2 = a +b;变量相加,是在堆中。

4. String 类的常见方法

String类 是保存字符串常量的。每次更新都需要重新开辟空间,效率较低,因此 java 设计者还提供了 SrimgBuildler 和 StringBuffer 来增强 String 的功能并提高效率。

equals        //区分大小写,判断内容是否相等
equalslgnoreCase        //忽略大小写的判断内容是否相等
length        //获取字符的个数,字符串的长度
indexOf        //获取字符在字符串中第1次出现的索引,索引从0开始,如果找不到,返回-1
lastlndexOf        //获取字符在字符串中最后1次出现的索引索引从0开始,如找不到,返回-1
substring        //截取指定范围的子串
trim        //去前后空格
charAt        //获取某索引处的字符,注意不能使用Strtindex]这种方式

toUpperCase        //字符串转换成大写

toLowerCase        //字符串转换成小写

concat        //拼接字符串

replace        //替换字符串中的字符

split        //分割字符串。对于某些特殊分割字符,我们需要转义符 \ 

toCharArray        //转换成字符数组

compareTo        //比较两个字符串的大小。从第一个字符开始比较,如果不同就相减。

        String str1 = "cbaa";
        String str2 = "cbaa";
        System.out.println(str1.compareTo(str2));// 0
        String str3 = "aba";
        System.out.println(str1.compareTo(str3));// 2 c-a
        String str4 = "cfa";
        System.out.println(str1.compareTo(str4));// -4 b-f
        String str5 = "cba";
        System.out.println(str1.compareTo(str5));// 1 str1.len - str5.len = 1

format        //格式字符串

        String name = "john";
        int age = 10;
        double score = 56.857;
        char gender = '男';

        //1. %s、%d、%.2f、%c 称为占位符
        //2. 这些占位符由后面变量来替换
        //3. %s 表示后面由 字符串来替换
        //4. %d 是整数来替换
        //5. %.2f 表示使用小数来替换,替换后,只会保留小数点两位,并且进行四舍五入的处理
        //6. %c 使用 char类型米替换
        String formatstr = "我的姓名是 %s 年龄是 %d 成绩是 %.2f 性别是 %c.希望大家喜欢我!";
        String info2 = String.format(formatstr, name, age, score, gender);
        System.out.println(info2);

三、StringBuffer 类(P475)

【java.lang.StringBuffer】代表可变的字符序列,可以对字符串内容进行增删。

很多方法与 String 相同,但 StringBuffer 是可变长度的。

StringBuffer 是一个容器。

(1)StringBuffer 的直接父类是 AbstractStringBuilder
(2)StringBuffer 实现了 Serializable,即 StringBuffer 的对象可以串行化
(3)在父类中 AbstractStringBuilder 有属性 char[] value,不是final。该 value数组 存放字符串内容,因此存放在堆中的。
(4)StringBuffer 是一个 final 类,不能被继承。

1. String VS StringBuffer

(1)String 保存的是字符串常量,里面的值不能更改。每次 String 类的更新实际上就是更改地址,效率较低。// private final char value[]
(2)StringBuffer 保存的是字符串变量,里面的值可以更改,每次 StringBuffer 的更新实际上可以更新内容,不用更新地址,效率较高。 // char value 【这个放在堆】

2. StringBuffer 构造方法

3. String 与 StringBuffer 转换

        // String -> StringBuffer
        String str = "hello";
        // 方式1
        StringBuffer sb1 = new StringBuffer(str);
        // 方式2
        StringBuffer sb2 = new StringBuffer();
        sb2.append(str);

        // StringBuffer -> String
        // 方式1
        String str1 = sb1.toString();
        // 方式2
        String str2 = new String(sb1);

4. StringBuffer类 常见方法

(1)增:append

(2)删:delete(start,end)

        // 删除索引为 >=start && <end 处的字符
        StringBuffer sb = new StringBuffer("hello,Jack.Hi");
        // 5:,
        // 9:k
        sb.delete(5,9);
        System.out.println(sb);    // hellok.Hi

(3)改:replace(startend,string)

        // 改:替换索引6-10的字符,包含6,不包含10
        StringBuffer sb = new StringBuffer("hello,Jack.Hi");
        // 6:J
        // 10:.
        sb.replace(6,10,"Tom");
        System.out.println(sb);    // hello,Tom.Hi

(4)查:indexof【查找子字符串在字符串第一次出现的索引,如果找不到返回 -1】

(5)插:insert

        // 插:在索引6的位置,插入Tom。原来索引为6的内容自动后移
        StringBuffer sb = new StringBuffer("hello,Jack.Hi");
        // 6:J
        sb.insert(6,"Tom/");
        System.out.println(sb);    // hello,Tom/Jack.Hi

(6)length:获取长度

四、StringBuilder 类(P479)

(1)一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。(StringBuilder不是线程安全)。该类被设计用作 StringBuffer 的一个简易替换,用在字特串缓种区被单个线程使用的时候。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。

(2)在 StringBuilder 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。

(3)StringBuilder 和 StringBuffer 均代表可变的字符序列,方法是一样的,所以使用和StringBuffer 一样。

StringBuilder 的方法,没有做互斥的处理,即没有 synchronized 关键字,因此在单线程的情况下使用 StringBuilder。

1. String、StringBuffer 和 StringBuilder 的比较

(1)StringBuilder 和 StringBuffer 非常类似,均代表可变的字符序列,而且方法也一样

(2)String:不可变字符序列,效率低,但是复用率高

(3)StringBuffer:可变字符序列、效率较高(增删)、线程安全

(4)StringBuilder:可变字符序列、效率最高、线程不安全

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

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

相关文章

html面试复习

目录 网页的显示过程 浏览器的渲染引擎 不同浏览器的内核 什么是标记语言&#xff08;markup language &#xff09; 什么是超文本&#xff08; HyperText &#xff09; 完整的html结构 文档声明 html元素 head元素 body元素 html元素 img标签 a标签 锚点链接 i…

链接投票二维码制作投票的链接制作投票链接的制作

用户在使用微信投票的时候&#xff0c;需要功能齐全&#xff0c;又快捷方便的投票小程序。 而“活动星投票”这款软件使用非常的方便&#xff0c;用户可以随时使用手机微信小程序获得线上投票服务&#xff0c;很多用户都很喜欢“活动星投票”这款软件。 “活动星投票”小程序在…

ACS Cent. Sci 2018 | 数据驱动的分子连续表征的自动化学设计

原文标题&#xff1a;Automatic Chemical Design Using a Data-Driven Continuous Representation of Molecules 代码&#xff1a;https://github.com/aspuru-guzik-group/chemical_vae 原文链接&#xff1a;https://pubs.acs.org/doi/10.1021/acscentsci.7b00572 Automatic…

涨点神器:基于Yolov5/Yolov7的小目标性能提升

1.小目标介绍 目标检测近十年涌现了一大批如Faster R-CNN、RetinaNet、YOLO等可以在工业界实用的目标检测方法,但小目标检测性能差的问题至今也没有被完全解决。因为Swin Transformer的提出,COCO test-dev上的 AP 已经刷到64 ,但小目标检测性能(即APS )和大目标检测性能(…

什么是MQTT?mqtt协议和http协议区别

摘要&#xff1a; 什么是MQTT&#xff1f;MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;译为&#xff1a;消息队列遥测传输&#xff0c;是一种轻量级的通讯协议&#xff0c;用于在网络上传输消息。MQTT 最初由 IBM 发布&#xff0c;后来成为 OASIS&#xf…

图解LeetCode——138. 复制带随机指针的链表

一、题目 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都设为其对应的原节点的值。…

研报精选230525

目录 【行业230525中泰证券】半导体行业深度报告&#xff1a;解析英伟达成长的核心战略&#xff1a;研发为底、生态为径、AI为翼 【行业230525西南证券】医药行业周报&#xff1a;行情回暖&#xff0c;持续精选个股 【行业230525国元证券】2023年中期军工行业投资策略&#xff…

2023最系统的网络安全学习路线

什么是网络安全 网络安全是指保护计算机网络及其系统和应用程序的安全性和完整性&#xff0c;防止未经授权的访问、攻击、病毒、恶意软件和其他安全威胁。它是通过技术、管理和教育等综合手段来确保网络信息安全。网络安全包括网络防火墙、入侵检测系统、数据加密、网络访问控…

STM8、STM8S003F3P6 双机串口通信(片上串口)

背景 这里为什么要写串口通信&#xff0c;因为实际项目上使用了串口&#xff0c;STM8S003F3P6的串口简单啊&#xff0c;不值得一提。本文写的串口确实简单&#xff0c;因为这里我想先从简单的写起来&#xff0c;慢慢的把难的引出来。这里呢&#xff0c;做个提纲说明&#xff0…

基于SSM+HTML5的网上跳蚤市场系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;HTML 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 前言…

数据结构-查找(顺序查找与二分查找的讲解与代码实现)

顺序查找概念&#xff1a;从表的另一端开始&#xff0c;一次将记录的关键字和给定值进行比较&#xff0c;若某个记录的关键字和给定的值相等&#xff0c;则查找成功&#xff0c;反之则查找失败。 ASL:平均查找长度 pi查找概率&#xff0c;ci查找次数 eg&#xff1a;序列1&…

kubelet源码分析 status_manager状态管理器篇

kubelet源码分析 status_manager状态管理器篇 右上方的statusManager就是本篇要介绍的内容。上一篇kubelet的sync同步函数也介绍过&#xff0c;这篇内容详细介绍状态管理器的作用。 一、简介 status_manager&#xff08;状态管理器&#xff09;是 Kubernetes 中的一个组件&am…

【ONE·C++ || 哈希(二)】

总言 主要介绍哈希运用于unordered系列的上层封装框架与相关运用&#xff1a;位图、布隆过滤器、哈希切割。 文章目录 总言0、思维导图3、封装3.1、基础封装3.1.1、框架结构3.1.2、Inset 1.0 3.2、引入迭代器3.2.1、在迭代器中3.2.2、在哈希表中3.2.3、在unordered上层3.2.4、…

springBoot搭建

这里写目录标题 一、在学习spring Boot之前我们来回顾一下Spring二、Spring Boot介绍 三、Spring Boot开发环境搭配四、Spring Boot核心五、Spring Boot添加模块六、Spring Boot新注解介绍 一、在学习spring Boot之前我们来回顾一下Spring 首先说一下spring的优点: spring是轻…

Wireshark 解密https 数据

默认情况下 wireshark 抓到的https 数据包都是加密后的&#xff0c;无法展示明文内容 方式一 -SSLKEYLOGFILE 变量方式 【推荐&#xff0c;适用各种情况】 配置环境变量 浏览器在访问https 站点的时候会检测这个SSLKEYLOGFILE 变量&#xff0c;如果存在&#xff0c;则将https…

SpringCloud Nacos实战应用

目录 1 Nacos安装1.1 Nacos概要1.2 Nacos架构1.3 Nacos安装1.3.1 Nacos Derby安装1.3.2 Nacos MySQL版安装1.3.3 Docker 安装Nacos 2 Nacos功能应用2.1 Nacos服务注册与发现2.2 负载均衡2.3 配置中心2.4 灰度发布 3 Nacos集群3.1 集群架构3.2 Nacos集群部署3.3 客户端接入Nacos…

c# 依赖注入

依赖注入 文章目录 依赖注入一、.net core主要提供了三种依赖注入的方式二、权重三、如果我们需要注入的对象很多怎么办 一、.net core主要提供了三种依赖注入的方式 AddTransient瞬时模式&#xff1a; 每次请求&#xff0c;都获取一个新的实例。即使同一个请求获取多次也会是…

2022年度互联网平均薪资出炉!高到离谱!

近期&#xff0c;国家统计局发布2022年平均工资数据&#xff0c;互联网行业薪资再次成为大家关注的焦点。 在2022年分行业门类分岗位就业人员年平均工资中&#xff0c;信息传输、软件和信息技术服务业的薪资遥遥领先其他行业&#xff0c;为全国平均薪资水平的 1.78 倍&#xf…

devfreq

devfreq 是指频率电源可以动态调节的设备&#xff0c;可以添加不同设备及不同govvernor ; devfreq 框架和opp(operating performance point) 频率电源对 devices driver 通过 devfreq profile 交互 devfreq_dev_profile include/linux/devfreq.h devfreq_governor 与 dev…

如何用二极管实现不同电压的输出?

利用二极管的单向导电性可以设计出好玩、实用的电路。本文分析限幅电路和钳位电路&#xff0c;是如何用二极管来实现的。 限幅电路 如下图所示&#xff0c;当在正半周期&#xff0c;并且VIN大于等于0.7V&#xff0c;二极管正向导通。此时&#xff0c;VOUT会被钳位在0.7V上。 …