2021大数据学习之旅 JavaSE·自定义类型&ArrayList类


前言

系列文章比较适合非科班的同学, 由浅及深, 循序渐进, 从基础开始走上大数据之路

让我们一起努力, 达成目标, 实现理想

最后恳请留下你的小❤, 点赞给我一个小小的鼓励吧


一、自定义类型

1.1 引用数据类型分类

提到引用数据类型(类),之前我们就已经使用过,如Scanner类、Random类.

我们可以把类的类型为两种:

  1. Java为我们提供好的类,如Scanner类,Random类等,这些已存在的类中包含了很多的方法与属性,可供我们使用

  2. 我们自己创建的类,按照类的定义标准,可以在类中创建多个方法与属性,来供我们使用

​ 这里我们主要介绍第二种情况的简单使用


1.2 自定义数据类型概述

我们在Java中,将现实生活中的事物抽象成了代码,可以理解为将一系列事物的共同特征收集起来用一个框架来描述,例如类,大家都有姓名、年龄、国籍等等共同的属性。这时,我们可以使用自定义的数据类型(类)来描述(映射)现实生活中的事物。

,它是引用数据类型,与之前学习的所有引用数据类型相同,自定义类也是一种数据类型。只是自定义类型并非Java为我们预先提供好的类型,而是我们自己定义的一种引用数据类型用来描述一个事物。


1.3 类的定义与使用

java代码映射成现实事物的过程就是定义类的过程。

就拿一部手机进行分析,它能用来做什么呢?它可以打电话,上网,聊微信等,这些就是手机所提供的功能,也就是方法;手机也有它的特征,如颜色、尺寸大小、品牌型号等,这些就是手机的特征,也就是属性

目前,我们只关注类中的属性部分,类中的方法在面向对象部分再进行学习。


1.3.1 类的定义格式

基本格式

public class 类名{
  数据类型 属性名称1;
  数据类型 属性名称2;
  …
}

拿手机类作为例子,如下所示

public class Phone {
	/*
	 *	属性
	 */
	 String brand; //品牌
	 String color; //颜色
	 double size; //尺寸
}

上述代码,就是创建一个类的的过程,类的名称我们给起名为Phone,类中包含了三个属性(brand品牌型号、color颜色、size尺寸)

> 注意,类中定义的属性没有个数要求

1.3.2 类的使用格式

Phone类定义好后,我们就可以使用这个类了,使用方式和使用引用数据类型Scanner类相似。格式如下:

  1. 导包:将所有的类放到同一个文件夹下,可以避免导包。在不同的包下,可以使用快捷键导包
  2. 创建对象:数据类型 变量名 = new 数据类型();
  3. 调用方法:目前我们定义的自定义类不涉及方法,只有属性(面向对象部分会涉及自定义类中的方法)
  4. 访问属性:变量名.属性 (这是当前的方式,后期会采取调用方法的方式替代掉直接访问的方式来完成对属性的访问)

当有了Phone数据类型的变量后,我们就可以使用Phone类中的属性了。对属性的访问如下所示:

public class Test {
	public static void main(String[] args) {
		Phone p = new Phone(); //创建了一个Phone对象并将地址值赋值给变量p
		/*
		 * 通过p,访问Phone中的属性
		 */		
		p.brand = "华为"; //访问p中的brand品牌属性		
		p.color = "彩色"; //访问p中的color颜色属性		
		p.size = 10; //访问p中的size尺寸属性

		System.out.println("手机品牌为" + p.brand);
		System.out.println("手机颜色为" + p.color);
		System.out.println("手机尺寸为" + p.size);
	}
}

1.3.3 自定义类型注意事项与内存图

上述代码中,通过类Phone创建出来的变量p,它相当于我们生活中的盒子,里面包含了它能够使用的属性。

通过 p.属性名 就可以对属性进行操作

与引用类型数组类似,引用类型的自定义类型的变量,直接变量时,结果为对象地址值,这里可以通过内存图简单解释。

在这里插入图片描述



二、ArrayList类

2.1 引入

先前学习了数组,数组可以保存多个元素,但在某些情况下无法确定到底要保存多少个元素,此时数组将不再适用,因为数组的长度不可变。例如,要保存一个学校的学生,由于不停有新生来报道,同时也有学生毕业离开学校,这时学生的数目很难确定。为了保存这些数目不确定的元素,JDK中提供了一系列特殊的类,这些类可以存储任意类型的元素,并且长度可变,统称为 集合

ArrayList集合 是程序中最常见的一种集合,它属于引用数据类型(类)。在ArrayList内部封装了一个长度可变的数组,当存入的元素超过数组长度时,ArrayList会在内存中分配一个更大的数组来存储这些元素,因此可以将ArrayList集合看作一个长度可变的数组。


2.2 集合的创建

创建集合的常用格式

ArrayList<要存储元素的数据类型> 变量名 = new ArrayList<要存储元素的数据类型> ( );
java1.7.0以后可以简写后面的:
ArrayList<存储的数据类型> 变量名 = new ArrayList<> ( );

> 使用的时候需要导包:import java.util.ArrayList(IDEA提供自动导包功能)
> 创建对象:与其他普通的引用数据类型创建方式完全相同,但是要指定容器中存储的数据类型

注意:

  • 集合中存储的元素,只能为<>括号中指定的数据类型元素
  • <要存储元素的数据类型>”中的数据类型必须是引用数据类型,不能是基本数据类型

ArrayList对象不能存储基本类型,只能存储引用类型的数据。类似<int> 不能写,但是存储基本数据类型对应的包装类型是可以的。所以,想要存储基本类型数据,<>中的数据类型,必须转换后才能编写,转换写法如下:

基本类型基本类型包装类
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

举例

// import java.util.ArrayList;
ArrayList<Integer> list_01 = new ArrayList<> ();
ArrayList<Character> list_02 = new ArrayList<> ();
ArrayList<People> list_01 = new ArrayList<> (); //存储自定义人这个类

2.3 集合中常用方法

  • public boolean add(E e):将指定的元素添加到此集合的尾部。
  • public E get(int index) :返回此集合中指定位置上的元素,返回获取的元素。
  • public int size() :返回此集合中的元素个数(集合的长度)。

注意: E代表集合中存储元素的数据类型,如果集合中存的元素是字符串,E就代表字符串类型

举例

public class ArrayListDemo {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<String>();
        
        // 向集合中添加元素
        list.add("str1");
        list.add("str2");
        list.add("str3");
        list.add("str4");
        
        // 获取集合中元素的个数
        System.out.println("集合的长度:" + list.size());
        
        // 取出并打印指定位置的元素
        System.out.println("第1个元素是:" + list.get(0));
        System.out.println("第2个元素是:" + list.get(1));
        System.out.println("第3个元素是:" + list.get(2));
        System.out.println("第4个元素是:" + list.get(3));
    }
}

运行结果:
在这里插入图片描述
强调一点,ArrayList集合相当于是一个长度可变的数组,所以访问集合中的元素也是采用索引方式访问,第一个元素存储在索引0的位置,第二个元素存储在索引1的位置,依次类推。


2.4 集合的遍历

通过集合遍历,得到集合中每个元素,这是集合中最常见的操作。集合的遍历与数组的遍历很像,都是通过索引的方式,集合遍历方式如下

public class ArrayListDemo {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(10);
        list.add(15);
        list.add(20);
        list.add(25);
        
        //遍历集合,通过索引,获取到集合中每个元素
        for (int i = 0; i < list.size(); i++) {
            int n = list.get(i);
            System.out.println(n); //这里返回的是Integer的数据类型
            // 如果是引用的数据类型,返回list中的元素其实是地址值
        }
    }
}

运行结果:
在这里插入图片描述


2.5 集合中的常用方法补充

  • public void add(int index,E element):在此集合中的指定位置插入指定的元素。
  • public boolean remove(Object o):删除指定的元素,返回删除是否成功
  • public E remove(int index) :移除此集合中指定位置上的元素。返回被删除的元素。
  • public void clear() :清空集合中所有元素
  • public E set(int index,E element):修改指定索引处的元素,返回被修改的元素。

举例

import java.util.ArrayList;

public class ArrayListDemo {
    public static void main(String[] args) {
        ArrayList<String> array = new ArrayList<String>();

        array.add("张三");
        array.add("李四");
        array.add("王五");

//        public void  add(int index,E   element):在此集合中的指定位置插入指定的元素
        array.add(1, "赵六");

//        public boolean remove(Object o):删除指定的元素,返回删除是否成功
        System.out.println(array.remove("李四"));
        System.out.println(array.remove("钱七")); //false

//        public E remove(int index):删除指定索引处的元素,返回被删除的元素
        System.out.println(array.remove(1));
        System.out.println(array.remove(5)); //IndexOutOfBoundsException

//        public E set(int index,E element):修改指定索引处的元素,返回被修改的元素
        System.out.println(array.set(1, "周杰伦"));
        System.out.println(array.set(5, "周杰伦")); //IndexOutOfBoundsException
        
        //输出集合
        System.out.println("array:" + array);
        
        //清空集合
        array.clear();
    }
}

这里面有一些细节小问题:

  1. 在使用 remove() 方法时,如果是Integer类型的集合(例如 [10,20,30,40] ), 想要删除30的话,直接写array.remove(30)会报错,因为系统默认将这个30作为索引值来查找了,所以会报超出范围的错误。正确写法:array.remove (new Integer(30))
  2. 使用 clear() 方法以后,创建的array对象还是存在的,打印出来的是[],并不是一个地址值(请教如何查看集合具体地址值)

2.6 ArrayList练习

对象添加到集合

创建一个存储学生对象的集合,存储3个学生对象,使用程序实现在控制台遍历该集合

public class ArrayListTest03 {
	public static void main(String[] args) {
    ArrayList<Student> list = new ArrayList<Student>();

    //创建学生对象
    Student s1 = new Student("张三",18); //调用有参构造方法
    Student s2 = new Student("李四",20);
    Student s3 = new Student("王五",25);
    
    //把学生对象作为元素添加到集合中
    list.add(s1);
    list.add(s2);
    list.add(s3);    

    //遍历集合
    for(int x = 0; x < list.size(); x++) {
      Student s = list.get(x);
      System.out.println(s.getName()+"---"+s.getAge());
    }
  }
}

public class Student{
	String name;
	int age;
	
	public Student () { //无参构造方法
	}
	public Student (String name,int age) { //有参构造方法
		this name = name;
		this age = age;
	}
}


三、随机点名器案例

3.1 案例介绍

随机点名器,即在全班同学中随机的找出一名同学,打印这名同学的个人信息。

我们来完成随机点名器,它具备以下3个内容:

  1. 存储所有同学姓名
  2. 总览全班同学姓名
  3. 随机点名其中一人,打印到控制台

3.2 案例需求分析

全班同学中随机的找出一名同学,打印这名同学的个人信息。

我们对本案例进行分析,得出如下分析结果:

  1. 存储全班同学信息(姓名、年龄)
  2. 打印全班同学每一个人的信息(姓名、年龄)
  3. 在班级总人数范围内,随机产生一个随机数,查找该随机数所对应的同学信息(姓名、年龄)

随机点名器明确地分为了三个功能。如果将多个独立功能的代码写到一起,则代码相对冗长,我们可以针对不同的功能可以将其封装到一个方法中,将完整独立的功能分离出来。

而在存储同学姓名时,如果对每一个同学都定义一个变量进行姓名存储,则会出现过多孤立的变量,很难一次性将全部数据持有。此时,我们采用ArrayList集合来解决多个学生信息的存储问题。


3.3 代码实现

每名学生都拥有多项个人信息,为了方便管理每个人的信息,我们对学生信息进行封装,编写Student.java文件

/**
 * 学生信息类
 */
public class Student {
	String name; //姓名
	int age; //年龄
}

上述代码中,对学生信息(姓名、年龄)进行了封装。这样做的好处在于,以后只要找到这名学生,就能够知道他的每项个人信息了。

接下来我们编写CallName.java文件,完成程序的编写。main方法中调用三个独立方法

public static void main(String[] args) {
		ArrayList<Student> list = new ArrayList<Student>();
		/*
		 * 1.存储全班同学信息
		 */
		addStudent(list);
		/*
		 * 2.打印全班同学每一个人的信息(姓名、年龄)
		 */
		printStudent(list);
		/*
		 * 3.随机对学生点名,打印学生信息
		 */
		randomStudent(list);
	}

存储所有学生的个人信息

/**
 * 1.存储全班同学名字
 */

// import java.util.Scanner;
public static void addStudent(ArrayList<Student> list) {
	//键盘输入多个同学名字存储到容器中
	Scanner sc = new Scanner(System.in);
	for (int i = 0; i < 3; i++) {
		//创建学生
		Student s = new Student();
		System.out.println("存储第"+i+"个学生姓名:");
		s.name = sc.next();
		System.out.println("存储第"+i+"个学生年龄:");
		s.age = sc.nextInt();
		//添加学生到集合
		list.add(s);
	}
}

打印全班同学每一个人的信息

/**
 * 2.打印全班同学每一个人的信息(姓名、年龄)
 */
public static void printStudent (ArrayList<Student> list) {
	for (int i = 0; i < list.size(); i++) {
		Student s = list.get(i);
		System.out.println("姓名:"+s.name +",年龄:"+s.age);
	}
}

随机对学生点名,打印学生信息

/**
 * 3.随机对学生点名,打印学生信息
 */
public static void randomStudent (ArrayList<Student> list) {
	//在班级总人数范围内,随机产生一个随机数
	int index = new Random().nextInt(list.size());
	//在容器(ArrayList集合)中,查找该随机数所对应的同学信息(姓名、年龄)
	Student s = list.get(index);
	System.out.println("被随机点名的同学:"+s.name + ",年龄:" + s.age);
}


总结


左上角主页里面有所有系列文章喔!

消除贫穷的最好办法就是和我一起学大数据,加油,奥利给!

看到这里点个赞吧!

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值