广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java中的复合数据类型
  • 665
分享到

Java中的复合数据类型

2024-04-02 19:04:59 665人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录1、Java字符串2、Java中的包装类3、Java容器ArrayListHashSetHashMap4、工具类StackQueue1、Java字符串 在 Java 中字符串被作

1、Java字符串

在 Java 中字符串被作为 String 类型的对象处理。 String 类位于 java.lang 包中,默认情况下该包自动导入。

String对象创建后不会被修改,当我们修改某个字符串对象实际上是将原引用指向了新创建的内存空间。并且相同的字符串常量Java不会分配两个内存空间,而是将两个引用指向相同的空间。


public class MyString {
    public static void main(String[] args) {
        String s1="字符串";
        String s2="字符串";
        String s3=s1;
        System.out.println(s1==s2);     // s1、s2字符串内容相同,指向相同的内存空间,输出:true
        System.out.println(s1==s3);     // 修改之前s1与s3相同,输出:true
        s1="修改字符串";
        System.out.println(s1==s3);     // 修改之后s1指向新的内存空间,与s3不同,输出:false
    }
}

String中常用的方法:


str.length()    //返回当前字符串的长度
str.indexOf(int ch)    //查找ch字符在该字符串中第一次出现的位置,若无返回-1
str.indexOf(subStr)    //查找str子字符串在该字符串中第一次出现的位罝
str.lastIndexOf(ch)    //查找ch字符在该字符串中最后一次出现的位置
str.lastlndexOf(subStr)查找St子字符串在该字符串中最后一次出现的位置
str.substring(beginlndex)    //获取从beginlndex位置幵始到结朿的子字符串
str.substring(beginlndex, endlndex)    //获取从beginlndex位置幵始到endlndex位M的子字符串
str.trim()        //返回去除了前后空格的字符串
str.equals(obj)        //将该字符串与指定对象比较,返回true或false
str.toLowerCase()        //将字符串转换为小写
str.toUpperCase()        //将字符串转换为大写
str.charAt(int index)    //获取字符串中指定位置的字符
str.setCharAt(i,c)    //设置某个位置的字符串
str.split(String regex, int limit)        //将字符串分割为子字符串,返回字符串数组
str.concat(str2)        //将str2拼接到末尾
str.getBytes()        /将该字符串转换为byte数组
str.toCharArray()        //转化为字符数组

如果需要使用经常修改的字符串,可以用StringBuilder类来保存,可以通过append、replace等方法对字符串进行修改,修改之后仍然指向同一块内存地址


public class MyString {
    public static void main(String[] args) {
        StringBuilder s4=new StringBuilder("初始字符串");
        StringBuilder s5=s4;
        s4.replace(0,10,"修改后的字符串");
        System.out.println(s4);
        System.out.println(s4==s5);     // 修改后仍然指向同一块内存,因此输出:true
    }
}

通过String.valueOf()可以将其他类型数据转化为字符串。


char[] arr={'a', 'd', 'e'};
String s=String.valueOf(arr);

2、Java中的包装类

Java中的基本数据类型如int、double等都不具有对象的特性,为了像其他对象一样拥有自己的方法,Java为每个基本数据类型提供了包装类,像对象那样来操作基本数据类型。包装类的基本方法用于实现类型之间的相互转换。

Java包装类可以自动装箱/拆箱,即通过=运算符自动完成基本类型和包装类之间的类型转换。


                // 定义int类型变量,值为86
		int score1 = 86;       
		// 使用int创建Integer包装类对象,手动装箱
		Integer score2=new Integer(score1);  
                Integer score2=score1;    //自动装箱      
		// 将Integer包装类转换为double类型
		double score3=score2.doubleValue();        
		// 将Integer包装类转换为float类型
		float score4=score2.floatValue();        
		// 将Integer包装类转换为int类型,手动拆箱
		int score5 =score2.intValue();	
                int score5 = score2        // 自动拆箱	
		// 将字符串转为int
		int score6 = Integer.parseInt("666");

基本类型与字符串之间的互相转换:

通过Integer.MAX_VALUE可以获得最大整数值

使用 java.util 包中的 Date 类可以创建时间对象,使用java.text 包中的 SimpleDateFORMat 类可以将时间转化为所需格式的字符串,其中 “yyyy-MM-dd HH:mm:ss” 为预定义字符串, yyyy 表示四位年, MM 表示两位月份, dd 表示两位日期, HH 表示小时(使用24小时制), mm 表示分钟, ss 表示秒,这样就指定了转换的目标格式,最后调用 format() 方法将时间对象Date转换为指定的格式的字符串,反之parse()方法可以将普通字符串转化为Date对象。

java.util.Calendar 类可以更加方便地进行时间的处理,通过调用 getInstance() 静态方法获取一个 Calendar 对象,默认代表当前时间,可以通过c.getTime()将其转化为Date对象。Calendar对象的更多方法如下

Math 类位于 java.lang 包中,包含用于执行基本数学运算的方法, Math 类的所有方法都是静态方法,所以使用该类中的方法时,可以直接使用类名.方法名,如: Math.round();


int minNum=Math.min(2, 3);    //获取最小值
int maxNum=Math.max(2, 3);    //获取最大值
 
long round=Math.round(3.1415);      //四舍五入
double floor=Math.floor(3.1415);    //向下取整
double ceil=Math.ceil(3.1415);      //向上取整
double random=Math.random();        //取[0,1)之间的随机数

3、Java容器

在各种基本数据类型的基础上,Java使用集合类当作容器来储存具有相同属性的对象。通过集合类组织数据可以实现对特定数据的快速插入、删除与查询操作。而且与数组相比,集合的长度灵活可变,而且查找方式也不只有下标一种。Java中常见的集合类分为两个接口Collection和Map,其中Collection有三个子接口链表List、队列Queue、集Set,List常见的实现类为数组序列ArrayList,Queue实现类为LinkedList称为链表,Set实现类为哈希集。Collection中按照一个一个对象来存储数据,Map中按照键值对<key,value>来存储数据。

Collection接口规定了ArrayList、Set等具体实现类的接口方法,例如它们都使用add()方法来添加元素,因此一些方法名在各个类实现中是通用的。

ArrayList

ArrayList是类似于数组的容器,将对象储存进ArrayList之中便于组织和管理。通过add()方法可以将单个对象插入列表,addAll()可以将多个对象组成的子列表插入父列表中,插入时可以指定插入的位置,可以通过Arrays.asList()将数组转化为列表,通过toArray()方法可以将列表转为Object[]数组,可以向其中传入泛型参数从而返回特定类型的数组。

需要注意的是通过Arrays.asList()转化成的List长度是固定的,不能进行add()操作,会报错;我们可以将其作为子列表添加到一个新的List列表,然后再进行插入操作。

例如向列表courseList中插入Course对象:


public void addCourse(){
    Course c1=new Course(1,"数据结构");
    Course c2=new Course(2,"操作系统");
    Course[] cArr={new Course(3,"组成原理"),new Course(4,"计算机网络")};
 
    courseList.add(c1);                         // 向数组列表中添加对象
    courseList.add(0,c2);                 // 向指定位置添加对象
    courseList.addAll(Arrays.asList(cArr));     // 向列表中添加子列表,前加数字表示插入位置
    Course tmp=(Course)courseList.get(0);       // 从列表中取出对象
    Course[] courseArr=courseList.toArray(new Course[courseList.size()]);    // 转换为特定类型的数组
}

特别地,int[]与List<Integer>之间无法直接使用asList()/toArray()方法进行互相转换,可以经过如下流操作,或者遍历int[]逐个添加到List


int[] nums=new int[]{3,1,5,8};
//arr转list
List<Integer> numList = Arrays.stream(nums).boxed().collect(Collectors.toList());
//list转arr
int[] arr = numList.stream().mapToInt(Integer::valueOf).toArray();

通过size()方法可以获取列表长度,通过get()方法可以获取指定位置的对象,进而通过for循环遍历每个对象,也可以使用for each的方式遍历每个元素。还可以通过迭代器实现对每个对象的访问。值得注意的是,每个对象在列表中都是以Object对象的方式储存的,因此在取出之后需要通过强制类型转换为原来的对象类型,例如(Course)转为Course类的对象


    public void showCourse(){
        int listLength=courseList.size();           // 获取列表长度
        for (int i=0;i<listLength;i++) {
            Course c=(Course)courseList.get(i);     // 获取列表第i个元素
            System.out.println(c.name);
        }
    }
 
    public void iteratorCourse(){
        Iterator it=courseList.iterator();          // 获取迭代器
        while (it.hasNext()){                       // 如果仍有下一个元素
            Course c=(Course)it.next();             // 取出下一个元素
            System.out.println(c.name);
        }
    }

通过set()方法对列表指定位置的元素进行修改。通过remove()方法移除指定位置或者指定对象。通过removeAll()删除父列表中包含的所有子列表中的元素,通过clear()可以清空列表。


    public void modifyCourse(){
        courseList.set(2,new Course(5,"离散数学"));     // 修改2位置上的对象
    }
 
    public void removeCourse(){
        courseList.remove(3);               // 删除3位置上的对象
        Course c1= (Course) courseList.get(1);
        Course c2=(Course) courseList.get(2);
        courseList.remove(c1);                      // 删除指定对象
        Course[] cArr={c1,c2};
        courseList.removeAll(Arrays.asList(cArr));  // 删除courseList中所包含的cArr的元素
    }

通过contains()containsAll()方法判断List是否包含某个或者某几个对象,其实现原理是遍历List中的每个对象调用其equals()方法和目标对象进行比较,如果存在返回true,否则返回false。因此我们可以重写Course类的equals()方法,进而调用contains()方法判断List中是否包含指定Course对象。类似地indexOf()方法可以通过调用equals()找到元素在List中第一次出现的位置。


    // 重写Course类的equals()方法
    public boolean equals(Object o) {
        if (this == o) return true;     // 如果两个对象的地址相同,肯定相同
        if (!(o instanceof Course)) return false;
        Course course = (Course) o;
        return id == course.id &&       // 判断两个Course对象的id和name相同
                name.equals(course.name);
    }
 
    // 在CourseList中调用contains()判读是否包含某个对象
    public void containCourse(){
        Course nc=new Course(5,"数据结构");
        if(courseList.contains(nc)) {                     // 判断List中是否包含Course对象nc
            int index = courseList.indexOf(nc);           // 获取元素在List中的位置
            System.out.println("列表中包含该课程,位置:" + index);
        }
    }

之前提到集合中存放的都是对象的引用(Object),每次存入时集合会忽略对象的具体类型,有时存入其他类型对象则会在运行时出错,而且每次取出时则需要进行类型的强制转换还原回来。可以使用泛型规定某个集合只能存放特定类型或者其子类型的对象,这样就会在编译期间进行类型检查,而且在取出时可以直接返回特定类型的对象。注意泛型不能用于基本数据类型,例如List <int>会报错,而应该使用其包装类List <Integer>。


    // 创建元素类型为Course的列表
    public List<Course> courseList=new ArrayList<Course>(); 
    public void addCourse(){
        Course c=new Course(6,"数据结构");
        courseList.add(c);
//        courseList.add("字符串");    // 尝试向列表中添加非Course类型的对象,报错
        Course c2=courseList.get(0);        // 可以直接取出为Course类型对象
        System.out.println(c2.name);
    }

通过集合的工具类Collections.sort()方法可以实现对List对象的排序,其实现的原理是调用每个元素的compareTo()方法实现对象之间的比较进而排序。因此每个对象必须是可比较的类型,即必须实现了Comparable 接口的对象,如下所示首先定义可比较类Student,再定义学生列表studentLis添加学生对象后,调用Collections.sort()方法对列表进行排序,或者直接使用studentList.sort()。


public class Student implements Comparable<Student> {   // 定义Student类实现Comparable接口
    public String name;
    public int id; 
    public Student(int id, String name) {
        this.name = name;
        this.id = id;
    }
 
    @Override
    public int compareTo(Student o) {        // 实现接口的方法,根据id大小对学生进行比较
        if (this.id>o.id){          // 如果大于o返回1
            return 1;
        }else if (this.id<o.id){    // 小于返回-1
            return -1;
        }else {                     // 等于返回0
            return 0;
        }
    }
}
 
public class ListSort {
    public List<Student> studentList=new ArrayList<Student>();    // 学生列表 
    public void sortStudent(){
        Student s1=new Student(1011,"小明");
        Student s2=new Student(1005,"小赵");
        Student s3=new Student(1021,"小钱");
        Student[] sArr={s1,s2,s3};
        studentList.addAll(Arrays.asList(sArr));
        Collections.sort(studentList);                // 调用方法对学生列表进行排序
        for (Student s:studentList) {
            System.out.println(s.id+":"+s.name);
        }
    }
}

也可以在调用sort()方法时传入一个自定义的比较器对象Comparator,通过重写compare()方法来实现两个对象的比较。这里很明显可以看到上面的Comparable接口是被比较对象自身实现的,用于自身和其他对象比较;而Comparator是第三方对象实现的接口,用于比较两个对象。


// 自定义比较器类来实现两个Student对象的比较
public class StudentComparator implements Comparator<Student> {
    @Override
    public int compare(Student o1, Student o2) {
        if (o1.id>o2.id){          // 如果大于o返回1
            return 1;
        }else if (o1.id<o2.id){    // 小于返回-1
            return -1;
        }else {                     // 等于返回0
            return 0;
        }
    }
} 
// 调用sort()方法时传入比较器
Collections.sort(studentList,new StudentComparator());

HashSet

哈希集是Set的一个实现类,与list不同,set中的元素是无序且不可以重复的。

和List一样,在Set中通过add()remove()等方法实现元素的增加删除等操作。由于Set是无序的,因此没有set()、get()方法实现在指定位置插入/获取元素,在遍历元素时通过for each、iterator来实现,而且每次遍历的结果顺序是不确定的。

注意HashSet中的contains()方法会首先调用对象的hashCode()方法比较哈希码,再调用equals()方法,两个都为true才会认为两个对象相同。

例如通过HashSet来存储学生所选课程


public class Student {
    public String name;
    public int id;
    public Set<Course> courses;     // 用set保存学生所选课程 
    public Student(int id, String name) {
        this.name = name;
        this.id = id;
        this.courses=new HashSet<Course>();     //创建Hash集
    }
 
    public static void main(String[] args){
        Course c=new Course(1,"数据结构");
        Student s=new Student(101,"小明");     
        s.courses.add(c);               // 向集中添加对象
        for (Course course:s.courses) {         // 遍历集
            System.out.println(course.name);
        }
    }
}

HashMap

Map以一一对应的键值对<key,value>的形式储存数据,通过映射关系可以实现key快速查找value,key值不能重复。Map也支持泛型Map<K,V>,注意K,V不能是Java类,而是包装类。

通过put(key,value)向Map中添加键值对,get(key)通过键获取值,remove(key)移除键。修改Map键值对也使用put()方法,新的键值对会覆盖原有的值。通过containsKey(key)方法可以返回Map中是否包含某个key值,containsValue(value)返回Map中是否包含某个值,它通过调用对象的equals()方法比较来返回是否存在。

还可以通过keySet()、values()、entrySet()方法分别获取Map的键、值、键值对,返回的键值对Entry仍然可以定义泛型类型。


    // 创建存储学生类的哈希Map
    public Map<Integer,String> studentMap=new HashMap<Integer, String>(); 
    public void addStudent(){
        Scanner input=new Scanner(System.in);
        System.out.print("请输入学生ID:");
        int studentID=input.nextInt();
        String s=studentMap.get(studentID);        // 根据key值获取对应的value
        if (s!=null){                              // 如果s不为空说明该key已经存在
            System.out.println("该学生ID已存在!");
        }else {
            System.out.print("请输入姓名:");
            String name=input.next();
            studentMap.put(studentID,name);     // 将<ID,name>键值对添加到Map中
        }
    }
 
    public void showStudent(){            //通过foreach遍历HashMap
        // 获取Map的键值对Entry并对其泛型进行定义
        Set<Map.Entry<Integer,String>> entrySet=studentMap.entrySet();
        for(Map.Entry<Integer,String> entry:entrySet){
            int key= entry.geTKEy();                    // 从Entry中获取key
            String name=entry.getValue();               // 从Entry中获取value
            System.out.println(key+":"+name);
        }
    }
 
    public void showStudent2(){            //通过迭代器遍历HashMap
      Iterator iter = studentMap.entrySet().iterator();
      while (iter.hasNext()) {
          Map.Entry entry = (Map.Entry) iter.next();
          Int key= entry.getKey();
          String name = entry.getValue();
            System.out.println(key+":"+name);
        }
  }

4、工具类

Stack

栈的创建和简单使用如下所示


        Stack<Integer> st = new Stack<>();      //新建栈
        st.push(3);
        int peek=st.peek();     //获取栈顶元素
        System.out.println(peek);
        int pop=st.pop();       //弹出栈顶元素
        System.out.println(pop);
        System.out.println(st.empty());     //判断栈是否为空

Queue

LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。队列的使用如下


        Queue<Integer> queue = new LinkedList<>();    //创建并初始化队列
        queue.offer(1);     //元素入队
        queue.offer(3);
        queue.offer(5);
        
        for(int num:queue)      //遍历队列
            System.out.println(num);
        int pNum=queue.peek()    //获取第一个元素
        int qNum=queue.poll();  //元素出队
        System.out.println(qNum);

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: Java中的复合数据类型

本文链接: https://www.lsjlt.com/news/155594.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java中的复合数据类型
    目录1、Java字符串2、Java中的包装类3、Java容器ArrayListHashSetHashMap4、工具类StackQueue1、Java字符串 在 Java 中字符串被作...
    99+
    2022-11-12
  • Java中复合数据类型怎么用
    这篇文章主要为大家展示了“Java中复合数据类型怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java中复合数据类型怎么用”这篇文章吧。1、Java字符串在 Java 中字符串被作为 St...
    99+
    2023-06-25
  • oracle中的复合数据类型
    1)显示定义记录类型;  declare  --显示定义一个record类型myrec     type myrec is RECORD ...
    99+
    2022-10-18
  • java复合数据类型有哪些
    java中的复合数据类型有:1.Array,数组;2.Object,所有类的父类;java中的复合数据类型有以下两种Arrayjava中Array是指数组,数组元素必须具有相同的数据类型,且数组元素的类型是唯一的,一个数组只能存储一种数据类...
    99+
    2022-10-12
  • Oracle中PL/SQL复合数据类型
    一、PL/SQL记录:一条记录 可简化单行多列的数据的处理。当使用pl/sql记录时,应用开发人员即可以自定义记录类型和记录变量,也可以使用%rowtype属性直接定义记录变量。 1...
    99+
    2022-11-13
  • 10.PL_SQL——PL_SQL中的复合数据类型之RECORDS
    一、记录和集合概述         目前为止所介绍的变量的数据类型都属于scalar,即标量,如×××,字符串,日期等等。任何...
    99+
    2022-10-18
  • javascript复合数据类型有哪些
    javascript中的复合数据类型有:1.Object,对象;2.Array,数组;3.Function,函数;javascript中的复合数据类型有以下几种Objectjavascript中Object是指对象,对象由花括号分隔,且对象...
    99+
    2022-10-07
  • javascript的复合数据类型有哪些呢
    本篇文章给大家分享的是有关javascript的复合数据类型有哪些呢,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。javascript复合数据...
    99+
    2022-10-19
  • PHP中array复合数据类型如何使用
    PHP中array复合数据类型如何使用,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。(1), array(数组) :PHP 中的数组实际上是把一个优化过的有序图类型当成数组来使...
    99+
    2023-06-17
  • 你需要知道的 Go 数据类型:从基本类型到复合类型
    Go 语言是一门静态类型语言,与其他语言相比,它的类型系统非常简洁和直观。在本文中,我们将介绍 Go 语言中的数据类型,包括基本类型和复合类型,并提供相应的演示代码。 一、基本类型 Go 语言中的基本类型包括 bool、string、int...
    99+
    2023-09-03
    数据类型 npm ide
  • 【java的类型数据】——八大类型数据
    文章目录 前言字面常量字面常量的分类: 数据类型和变量变量的包装类和范围范围整型变量byteintshortlong 浮点型变量双精度浮点型double单精度浮点型float 字符型变量char布尔型变量 boole...
    99+
    2023-08-16
    java 开发语言 类型数据 学习
  • 数据类型(集合)
    集合特点: 数据不重复  无序创建集合有两种方法 第一种: s = {1,2,3,4} 第二种: s = set(['1','2','3','4'])添加数据 l.add('5') # 添加单个数据 ...
    99+
    2023-01-30
    数据类型
  • Apache Cassandra 中的集合数据类型
    Apache Cassandra 中的集合数据类型包括:1. 列表(List):有序的元素集合,可以包含重复的元素。2. 集合(Se...
    99+
    2023-10-12
    Apache
  • Java中如何使用复杂数据类型
    本篇文章为大家展示了Java中如何使用复杂数据类型,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java复杂数据类型用法 (转)[@more@]同简单数据类型的定义一样,Java虚拟机(JVM)还定...
    99+
    2023-06-03
  • Java的数据类型
      在Java中,一共有8种基本类型——4种整型、2种浮点类型、1种字符类型char、1种boolean类型。 1. 整型 整型用于标识没有小数部分的数,可以是负数。Java提供了4种整型,如下: Java 整型类型存储需求取值范围int...
    99+
    2023-08-31
    java 开发语言
  • 比较Java和JavaScript中的数据类型:哪种更适合处理大型数据?
    Java和JavaScript都是广泛使用的编程语言,它们的数据类型在处理大型数据时具有不同的优势和劣势。在本文中,我们将比较Java和JavaScript中的数据类型,并讨论哪种更适合处理大型数据。 Java和JavaScript中的数据...
    99+
    2023-08-26
    javascript 数据类型 关键字
  • MySQL数据类型对应Java数据类型
    ### 数值类型 - TINYINT:大小(1byte),范围(有符号为-128到127,无符号为0到255),用于小整数值,对应于java中的Byte类型; - SMALLINT:大小(2byte),范围(有符号为-32768到3276...
    99+
    2023-09-07
    mysql java 数据库
  • oracle中的数据类型和java中的数据类型的对应关系
    oracle中的数据类型和java中的数据类型的对应关系 oracle 中Number 分为两种 1.Number 2.Number(10,2)第一种对应的是java中的整形 int l...
    99+
    2023-09-11
    java oracle 数据库
  • Java中有哪些数据类型适合异步编程?
    异步编程是现代计算机程序中不可或缺的一部分,它使得程序能够同时执行多个任务,提高了程序的性能和响应速度。在Java中,有多种数据类型适合异步编程,本文将逐一介绍。 CompletableFuture CompletableFuture...
    99+
    2023-09-16
    数据类型 linux 异步编程
  • Java中哪些数据类型最适合框架开发?
    Java作为一种广泛使用的编程语言,其数据类型的选择对于框架开发至关重要。在Java中,有各种不同类型的数据可以用来表示不同的数据结构和算法。在本文中,我们将探讨哪些数据类型最适合框架开发,并提供一些演示代码来说明它们的用法。 List ...
    99+
    2023-08-04
    数据类型 框架 同步
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作