java的数据类型:引用数据类型(String、数组、枚举)

news2024/12/26 22:47:58

2.3.3 引用数据类型

引用数据类型大致包括:类、 接口、 数组、 枚举、 注解、 字符串等

它和基本数据类型的最大区别就是:

  • 基本数据类型是直接保存在栈中的
  • 引用数据类型在栈中保存的是一个地址引用,这个地址指向的是其在堆内存中的实际位置。(栈中保存的是一个地址,而实际的内容是在堆中,通过地址去找它实际存放的位置)
1、String字符串

在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串,所以String是引用数据类型。Java语言中字符串必须包含在一个 " " 中。

字符串的创建:

两种创建方式:
1String str1 = "name";    		//直接定义,在常量池中
2String str2 = new String("name");		//在常量池创建后,再在堆中创建对象
//new每次都会创建一个新的对象,而String直接创建的字符串如果值相同则每次指向的都是同一个对象
//String 类是不可改变的,所以你一旦创建了 String 对象,那它的值就无法改变了,
//重新赋值只是改变存储的数据地址
12两种创建方式的区别:
    两者都会去字符常量池中检查是否存在 "name",如果有则直接引用,没有则在常量池中创建(其实这个实例也是在堆中的,字符串常量池中是引用地址)
	但是2还会通过new在堆中创建一个同样内容的对象实例

String是最基本的实际类型吗?
不是,基本数据类型有:byte、short、int、long、float、double、Boolean、char8种
ava.lang.String类是final类型的,所以String不能继承和修改。

String、StringBuffer、StringBuilder的区别
都是用于操作字符串,但是String类是final类型,内容不可改。StringBuffer、StringBuilder类可修改。String的更改是从新创建一个对象,再指向这个新的对象,所以大量操作时速度较慢。StringBuffer、StringBuilder可直接修改值。
StringBuilder的运行效率高,但是线程不安全。如果字符串变量在方法中定义,只能有一个线程访问的情况下使用
StringBuffer是线程安全的,在类里定义成员变量,且实例对象在多线程环境中使用,则用此类

常用的方法

1、字符串的拼接:
    用'+'来拼接多個字符串
    	String a = "hello";  String b = "Java";  System.out.println(a+b);    
		結果:hello Java'+'连接字符串和其他数据类型
        String a = "3+2=";		int b = 5;    System.out.println(a+b);       
		结果:3+2=5
    str1.concat(str2):会在str1后拼接str2
        String str1 = "拼接";
        String str2 = "一起";
        System.out.println(str1.concat(str2));		//结果:拼接一起
        System.out.println(str1);					//结果:拼接
        System.out.println(str2);					//结果:一起
        
2、获取字符串长度:
    str.length();
		
3、获取字符串中的字符:
    str.charAt(i);		//i是字符串内每个字符的索引位置从0开始,length-1结束

4、比较字符串
    不忽略字母大小写:str1.equals(str2);
	忽略字母大小写:str.equalsIgnoreCase(str2);

5、获取某一字符的位置:
    查找指定字符第一次出现的位置:str.indexOf("指定的字符")
	从指定位置(int)开始查找指定字符第一次出现的位置:str.indexOf("指定的字符",int)
    查找指定字符最后一次出现的位置:str.lastIndexOf("指定的字符")
    从指定位置(int)开始往前查找指定字符第一次出现的位置:str.lastIndexOf("指定的字符",int);

6、字符串的截取:
    从指定位置截取到最后:str.subString(int)
    从指定位置截取到指定位置:str.subString(int1,int2);  区间[int1,int2)

7、去除空格:
    去除首位空格:str.trim()
    去除所有空格(将所有空格替换):str.replaceAll("//s","");

8、替换字符串中指定的字符
    将所有符合指定的字符串都替换成新字符串:str.replaceAll("原字符串","新字符串") 可使用字符串格式
    将指定字符替换换成其他字符:str.replace('原字符','新字符')	替换单个字符
    将符合指定字符串的第一个替换成新字符串,后续的不变:str.replaceFrist("原字符串","新字符串");

9、判断字符串的开头与结尾(返回的是布尔值):
    判断某字符串是否以**开头:str.startsWith("**")
    判断字符串从指定位置开始是否以**开头:str.startsWith("**",int)
    判断某字符串是否以**结尾:str.endsWith("**");

10、字符串中大小写转换:
    大写变小写:str.toLowerCase()
    小写变大写:str.toUpperCase();

11、分割字符串:
    以指定字符分割:str.split('分隔符')
    以指定字符分割指定次数:str.split('分隔符',int);

12、判断是否为空字符串:
    str.isEmpty();

13、字符串的格式化:
    String str = String.formart("",);	//和格式化打印类似

+可以用来连接字符串,也可以进行运算,所以在使用时需要注意:

image-20230119135528165
2、数组

数组是固定长度、存储相同数据类型的一种数据结构,在内存中的体现是一个连续的内存空间。有索引值,可通过索引快速快速查询、修改相应元素。

image-20220411172839071

基本特点:

1、数组的长度定义后不可更改,数组是有界限的[0,length-1],所以在使用过程中经常会遇到数组下标越界的异常
2、一个数组的类型定义后不可改,内部保存的元素必须是相同的
3、数组可定义为任意数据类型类型
4、数组属于引用类型,存放在堆中,栈中的数据实际上保存的是对象在堆中的地址
5、数组的访问通过索引值
image-20210119204353513

Arrays类:

位于 java.util 包中,主要包含了操纵数组的各种方法

常用的函数:

1、打印数组元素   toString、deepToString
    Arrays.toString(数组名);			//一维数组
	Arrays.deepToString(数组名);		//多维数组
2、数组元素升序排列:sort
    Arrays.sort(数组名);	   //数值按大小排序,String类型数组按照字典顺序,数字、大写字母、小写字母汉字的顺序
3、填充值:fill
    Arrays.fill(数组名,);		//用指定的值填充数组全部的元素
	Arrays.fill(数组名,start,end,);	//数组下标为[start,end)的元素全部填充为指定值
4、比较数组:equals 
    Arrays.equals(数组1,数组2);
5、复制数组	copyOf、copyOfRange
    copyOf(数组名,复制的长度);     //超过要复制的数组长度时,整型用0,char用null,小于数组长度截取数组
    copyOfRange(数组,start,end);  //[start,end)截取数组进行复制
6、数组查询  binarySearch
	binarySearch(数组,)    //如果要搜索的值在数组内,则返回该值的索引,否则返回-1
    binarySearch(数组,start,end,)   //在[start,end)范围内搜索相应的值

冒泡排序:

最常用的数组排序算法之一,将数组元素总是将小数往前放,大数往后放。基本思想是对比相邻的元素值,按规律进行交换。

public class BubbleSort {
    public static void main(String[] args) {
        int arr[] = {26,15,29,66,99,88,36,77,111,1,6,8,8};
        for(int i=0;i < arr.length-1;i++) {//外层循环控制排序趟数
            boolean flag = false;	//通过布尔值进行判断,可减少一定的循环次数
            for(int j=0; j< arr.length-i-1;j++) {//内层循环控制每一趟排序多少次
                // 把小的值交换到前面
                if (arr[j]>arr[j+1]) {
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                    flag = true;	//如果判断过,flag就为true
                }
            }
            if(!flag){
                break;
            }
        }
        System.out.println("最终排序结果:");
        for(int a = 0; a < arr.length;a++) {
            System.out.println(arr[a] + "\t");
        }
    }
}
3、 枚举

枚举类型是Java 5中新增特性的一部分,它既是一种类(class,内部可以有方法和属性)却又比类多了些特殊的约束,但是这些约束的存在也造就了枚举类型的简洁性、安全性以及便捷性。

  • 使用的场景

    • 需要定义一组常量的时候:一年4个季节、一年12个月份、一星期7天、男女性别、支付方式等等。

    • 创建单例模式的时候,内部只有一个对象,最简单的单例模式创建的方式

  • 使用规则

    • 不能被继承
    • 不能被单独的new创建对象
    • 枚举成员是用,隔开的。

在定义枚举类型时我们使用的关键字是enum,enum 定义的枚举类默认继承了 java.lang.Enum 类,并实现了 java.lang.Serializable 和 java.lang.Comparable 两个接口。有以下方法:

  • values() 返回枚举类中所有的值。
  • ordinal()方法可以找到每个枚举常量的索引,就像数组索引一样。
  • valueOf()方法返回指定字符串值的枚举常量。
//枚举类型,使用关键字enum,定义周一到周日的常量
public enum Week {
    //不使用枚举需要定义常量
    // private final static String MONDAY = "星期一";.......
    MONDAY("星期一"), TUESDAY("星期二"), WEDNESDAY("星期三"),
    THURSDAY("星期四"), FRIDAY("星期五"), SATURDAY("星六"),
    SUNDAY("星期天");

    //枚举可以作为一个类,添加属性和方法
    Week(String name) {
        this.name = name;
    }
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
public static void main(String[] args) {
    Week week1 = Week.FRIDAY;
    //在switch中使用
    switch (week1){
        case MONDAY: case TUESDAY:   case WEDNESDAY:
        case THURSDAY: case FRIDAY: case SATURDAY:
        case SUNDAY:
            System.out.println(week1.getName());
            break;
        default:
            System.out.println("错误!!");
    }
    System.out.println("-----------分割线-------------");

    //迭代
    for (Week week2:Week.values()) {
        System.out.println(week2.getName());
    }
    System.out.println("-----------分割线-------------");

    //valueOf 通过指定字符串值返回枚举常量。
    Week week3 = Week.valueOf("MONDAY");
    System.out.println(week3.getName());
    System.out.println("-----------分割线-------------");

    //ordinal返回索引位置
    Week week = Week.FRIDAY;
    int ordinal = week.ordinal();
    System.out.println(ordinal);


}
image-20220228173046125

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

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

相关文章

四旋翼无人机学习第22节--padstack editor创建过孔

1 首先打开padstack editor软件。 2、选择过孔&#xff0c;注意与前面的博客不同&#xff0c;这里的单位最好使用mil。 在小马哥的教程中&#xff0c;过孔可以分为几类&#xff0c;下面主要对下图的五种过孔进行设置。 3、接着对过孔的孔径进行设置。 4、不做修改。 5、修…

网络交换机常见故障及解决方法

在日常的网络故障维护中我们接触最多的设备就是交换机&#xff0c;特别是接入层交换机&#xff0c;它是连接用户和交换路由设备的桥梁。但是交换机设备无论性能多么好&#xff0c;都会存在潜在故障问题&#xff0c;就像人一样&#xff0c;无论多么健康&#xff0c;也总会出现一…

MindMaster思维导图及亿图图示会员 优惠活动

MindMaster思维导图及亿图图示会员 超值获取途径 会员九折优惠方法分享给大家&#xff01;如果有需要&#xff0c;可以上~ 以下是食用方法&#xff1a; MindMaster 截图 亿图图示 截图 如果需要MindMaster思维导图或者亿图图示会员&#xff0c;可按照如下操作领取超值折扣优惠…

java成员变量/局部变量2023017

成员变量/局部变量 1.定义位置不同&#xff0c;成员变量定义在类里&#xff0c;局部变量定义在类的方法里。 来自网络 2.成员变量中&#xff0c;其中类变量从该类的准备阶段起开始存在&#xff0c;直到系统完全销毁这个类&#xff0c;类变量的作用域与这个类的生存范围相同&…

超市进销存之openGauss数据库的应用与实践

目录 一、背景 二、目的 三、什么是“进销存”&#xff0c;什么是超市进销存管理系统&#xff1f; 四、什么是openGauss数据库&#xff1f; 五、应用与实践&#xff08;模拟超市进销存系统&#xff09; 1、超市进销存数据库表设计 2、创建数据库表 3、手工插入数据 4、…

Python:使用xlrd过滤execl表中数据

一、写代码前需要注意事项首先我们需要注意&#xff1a;python xlrd库的新版本2.0.1版本移除了对.xlsx格式的支持&#xff0c;只支持.xls格式。报错信息如下&#xff1a;File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/xlrd/__ini…

react17+ts 学习

文章目录前言一、创建一个react项目启动项目项目打包打包命令npm run eject的作用入口文件分析react的设计理念二、创建一个reacttypescript的项目创建项目命令如何让react支持json引入不报错react为什么使用jsxjsx特点jsx命令规范jsx表示对象如何在jsx中防止注入攻击&#xff…

Spring的三种装配机制(XML、JavaConfig、自动配置)

Spring中bean有三种装配机制 一、在xml中显示装配 1. 基本类型装配 Data NoArgsConstructor AllArgsConstructor public class Student{private String name;private Address address;private String[] books;private List<String> hobbys;private Map<String Stri…

Linux常见命令 14 - 软/硬连接命令 ln

目录 1. 软连接 ln -s 2. 硬连接 ln 目前Linux中比较常用的是软连接&#xff0c;硬连接不常用&#xff0c;掌握基本的软连接常识即可 1. 软连接 ln -s 语法&#xff1a;ln -s [源文件] [目标文件] liuSLR:/hd1/Dling/lane/Wmq/test$ ln -s hello.txt hello.txt.soft liuS…

28. 实战:基于selenium实现12306自动购票

目录 前言 目的 思路 代码实现 1. 进入登录界面&#xff0c;输入账号密码 2. 点击登录按钮&#xff0c;完成滑块验证 3. 在个人中心点击购票&#xff0c;跳转 4. 输入出发地、目的地&#xff0c;从控制台输入得到 5. 文本框输入出发日 6. 若是学生票则切换票型 7. 点…

离线增量文章画像计算

2.5 离线增量文章画像计算 学习目标 目标 了解增量更新代码过程应用 无 2.5.1 离线文章画像更新需求 文章画像&#xff0c;就是给每篇文章定义一些词。 关键词&#xff1a;TEXTRANK IDF共同的词 主题词&#xff1a;TEXTRANK ITFDF共同的词 更新文章时间&#xff1a; 1、…

10.1002.1:VectorDraw Web /VectorDraw Developer Crack

VectorDraw 网络库 VectorDraw Web Library 是一个矢量图形库&#xff0c;旨在不仅可以打开 CAD 绘图&#xff0c;还可以在任何支持 HTML 5 标准的平台&#xff08;例如 Windows、Android、IOS 和 Linux&#xff09;上显示通用矢量对象。它可以在支持使用 canvas 和 Javascript…

DW动手学数据分析Task3:数据重构)

目录1 数据的合并1.1合并方法一&#xff1a;用concat函数1.2 合并方法二&#xff1a;使用DataFrame自带的方法join方法和append1.3 合并方法三&#xff1a;使用Panads的merge方法和DataFrame的append方法2 换一种角度看数据3 数据聚合与运算3.1 groupby机制3.2 数据运算1 数据的…

论文浅尝 | 利用常识知识图增强零样本和少样本立场检测

笔记整理&#xff1a;张嘉芮&#xff0c;天津大学硕士链接&#xff1a;https://aclanthology.org/2021.findings-acl.278.pd动机传统的数据驱动方法不适用于零样本和少样本的场景。对于人类来说&#xff0c;常识知识是理解和推理的关键因素。在没有标注数据和用户立场的隐晦表达…

2022最新MySQL高频面试题汇总

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点&#xff0c;欢迎star~ Github地址&#xff1a;https://github.com/…

【C进阶】通讯录1.0(文末附原码)

⭐博客主页&#xff1a;️CS semi主页 ⭐欢迎关注&#xff1a;点赞收藏留言 ⭐系列专栏&#xff1a;C语言进阶 ⭐代码仓库&#xff1a;C Advanced 家人们更新不易&#xff0c;你们的点赞和关注对我而言十分重要&#xff0c;友友们麻烦多多点赞&#xff0b;关注&#xff0c;你们…

数据结构进阶 unordered_set unordered_map的使用

作者&#xff1a;小萌新 专栏&#xff1a;数据结构进阶 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;介绍高阶数据结构 unorder_set unorder_map的使用 unorder_set unorder_mapunordered系列关联式容器unordered_set介绍unordere…

微信小程序流量主提升ecpm的一些方法

本篇文章主要讲解:微信小程序流量主提升ecpm的一些方法 日期:2023年1月19日 作者:任聪聪 一、对ecpm的疑问和科普 什么是ecpm ecpm就是千次广告曝光收入,是一个预估的价格,而不是额定的,他是随着曝光度,用户点击度,页面访问数来决定的。 ecpm为什么会低? 微信官方…

KaiwuDB 数据服务平台 1.0 产品详解

大家好&#xff0c;今天我分享的是 KaiwuDB 数据服务平台&#xff08;KDP&#xff09;&#xff0c;一款由我们独立自主研发&#xff0c;以 KaiwuDB 为核心的数据服务产品。KDP 产品建设目标是实现数据的云边端的一体化治理&#xff0c;提供一套完整的全生命周期服务。接下来我将…

2.5、线程概念和多线程模型

整体框架 1、什么是线程&#xff0c;为什么要引入线程&#xff1f; 还没有引入进程之前&#xff0c;各个程序只能串行执行 进程是程序的一次执行过程&#xff0c;但这些功能显然不可能是由一个程序顺序处理就能实现的 有的进程可能需要 “同时” 做很多事&#xff0c;而传统的…