-
2020-06-11 23:51:51
返回本章节
返回作业目录
需求说明:
- 设计一个类似于ArrayList的集合类ListArray。
- ListArray类模拟实现动态数组,在该类定义一个方法用于实现元素的添加功能,以及用于获取ListArray动态数组中所有元素的总个数。
- 在ListArray类中定义一个用于迭代动态数组所有元素的方法。
实现思路:
定义迭代接口Foreach,在该接口中定义两个方法,分别是判断迭代器中是否还有下一个元素的方法,以及获取迭代器中下一个元素的next()方法。
public interface Foreach { //判断迭代器中是否还有元素 public boolean hasNext(); //获取迭代器中的下一个元素 public Object next(); }
创建自定义模拟实现动态数组的集合类ListArry,在该类中定义int类型属性capacity,表示该类中封装的动态数组的容量。
在ListArray类中定义Object[]类型属性data,该属性用于保存添加到ListArray类中的元素。
在ListArray类中定义int类型属性index,该属性作为计数器,既可以表示当前数组已经添加到第几个元素,又可以表示当前ListArray存储元素的总个数。
ListArray类中定义一个带有int类型形参的构造方法,在构造方法中实现对data数组的初始化。
在ListArray类中定义addElement(Object ele)方法,该方法用于实现数据的添加功能。
在添加元素每次调用adeElement()方法时,index计数器需要自增1,当index的值大于等于data数组的容量时,需要重新创建一个原数组长度2加1大小的新数组的实例,并将该实例赋值于data变量。在此过程中,还需要将老数组的数组保存于新数组对应下标位置的元素中。
public void addElement(Object ele){ if(data.length>=this.capacity){ this.capacity=this.capacity*2+1; Object[] oldData=data; data=new Object[this.capacity]; for(int i=0;i<oldData.length;i++){ data[i]=oldData[i]; } } data[index++]=ele; }
在ListArray类中定义size()方法,该方法返回当前ListArray集合中保存元素的总个数。
在ListArray类中,定义返回Foreach接口实例的foreacher()方法。
public Foreach forecher(){ return new ListArrayForeach(); }
在ListArray类中创建私有内部类ListArrayForeach,该类实现Foreach接口,通过该类实现对ListArry集合类的迭代输出的功能。
private class ListArrayForeach implements Foreach{ private int counter;//计数器 public boolean hasNext() { return counter<index?true:false; } public Object next() { if(counter<index) return data[counter++]; else throw new RuntimeException("No Such Element Exception"); } }
实现代码:
更多相关内容 -
Java集合系列(一):集合的定义及分类
2021-02-12 11:08:32定义:集合是一个存放对象的引用的容器。在Java中,集合位于java.util包下。2. 集合和数组的区别(面试常问)提到容器,就会想起数组,那么集合和数组的区别是什么呢?(这里是重点,面试可能问的比较多)数组和集合都是...1. 集合的定义
什么是集合呢?
定义:集合是一个存放对象的引用的容器。
在Java中,集合位于java.util包下。
2. 集合和数组的区别(面试常问)
提到容器,就会想起数组,那么集合和数组的区别是什么呢?(这里是重点,面试可能问的比较多)
数组和集合都是Java中的容器
数组的长度是固定的,集合的长度是可变的
数组只能存储相同数据类型的数据,这里的数据类型可以是基本数据类型,也可以是引用类型
集合可以存储不同数据类型的对象的引用(但一般情况下,我们会使用泛型来约定只使用1种数据类型),但不能存储基本数据类型
空口无凭,我们来点代码配合理解,首先,我们看下如下的数组代码:
String[] platformArray = new String[3];
platformArray[0] = "博客园";
platformArray[1] = "掘金";
platformArray[2] = "微信公众号";
platformArray[3] = "个人博客";
运行代码就会发现,platformArray[3] = "个人博客";会引发java.lang.ArrayIndexOutOfBoundsException异常。
而使用集合时就不存在这个问题,因为集合在声明时不需要指定长度并且长度会根据放入元素的多少而变化:
List platformList = new ArrayList<>();
platformList.add("博客园");
platformList.add("掘金");
platformList.add("微信公众号");
platformList.add("个人博客");
观察上面声明数组的代码,我们可以推断出下面的代码肯定是编译不通过的:
String[] platformArray = new String[3];
platformArray[0] = "博客园";
platformArray[1] = "掘金";
platformArray[2] = 1;
因为数组声明时用的是String类型,而platformArray[2] = 1;赋值时却使用了int类型。
再来看下下面的集合代码:
List intList = new ArrayList();
intList.add(1);
intList.add(2);
intList.add(3);
这段代码也是编译不通过的,在IDEA中,鼠标悬停时会提示如下的错误信息:
意思是类型参数不能是原始类型(基本数据类型),那怎么使用呢?总不能不让我使用int型的集合吧?
当然不会,Java为每种基本数据类型都提供了对应的包装类,这里修改为int类型对应的包装类Integer即可:
List intList = new ArrayList();
intList.add(1);
intList.add(2);
intList.add(3);
以下为Java的原始类型(基本数据类型)与其对应的包装类:
原始类型(基本数据类型)
包装类
byte
Byte
short
Short
int
Integer
long
Long
float
Float
double
Double
char
Character
boolean
Boolean
3. 集合的分类
在Java中,集合主要分为以下3种:
List集合
Set集合
Map集合
它们之间的继承关系可以参考下图。
从上图可以总结出如下几点:
Java集合的根接口是Collection,它又继承了迭代接口Iterable
List接口和Set接口继承了Collection接口
Map接口是独立的接口,并没有继承Collection接口 (这里是重点,面试可能问的比较多)
List接口常用的实现类有:ArrayList、LinkedList、Vector
Set接口常用的实现类有:HashSet、LinkedHashSet、TreeSet
Map接口常用的实现类有:HashMap、HashTable、TreeMap
4. List集合
List集合包括List接口以及List接口的所有实现类。List集合具有以下特点:
集合中的元素允许重复
集合中的元素是有顺序的,各元素插入的顺序就是各元素的顺序
集合中的元素可以通过索引来访问或者设置
List接口常用的实现类有:ArrayList、LinkedList、Vector。
我们先看下如下示例了解下List集合的用法:
package collection;
import java.util.*;
public class Muster {
public static void main(String[] args) {
List strList = new ArrayList<>();
strList.add("a");
strList.add("b");
strList.add("c");
int i = (int) (Math.random() * strList.size());
System.out.println("随机获取数组中的元素:" + strList.get(i));
strList.remove(2);
System.out.println("将索引为2的元素从列表移除后,数组中的元素是:");
for (int j = 0; j < strList.size(); j++) {
System.out.println(strList.get(j));
}
}
}
以上代码的输出结果为:
随机获取数组中的元素:a
将索引为2的元素从列表移除后,数组中的元素是:
a
b
关于List集合的详细用法,ArrayList、LinkedList、Vector的区别(这里是重点,面试可能问的比较多),后续会单独写文总结,敬请期待。
5. Set集合
Set集合包括Set接口以及Set接口的所有实现类。Set集合具有以下特点:
集合中不包含重复元素(你可以重复添加,但只会保留第1个)
集合中的元素不一定保证有序
Set接口常用的实现类有:HashSet、LinkedHashSet、TreeSet。
我们先看下如下示例了解下Set集合的用法:
package collection;
import java.util.*;
public class Muster {
public static void main(String[] args) {
Set platformList = new HashSet<>();
platformList.add("博客园");
platformList.add("掘金");
platformList.add("微信公众号");
platformList.add("个人博客");
// 尝试添加重复元素
platformList.add("博客园");
platformList.add("掘金");
for (String platform : platformList) {
System.out.println(platform);
}
}
}
以上代码的输出结果为:
博客园
个人博客
掘金
微信公众号
可以看出,虽然我们尝试添加了重复元素,但并没有添加成功并且输出的元素没有顺序。
因此当你的集合中不允许有重复元素并且对排序也没有要求的话,可以使用Set集合。
关于Set集合的详细用法,HashSet、LinkedHashSet、TreeSet的区别(这里是重点,面试可能问的比较多),后续会单独写文总结,敬请期待。
6. Map集合
Map集合包括Map接口以及Map接口的所有实现类。Map集合具有以下特点:
Map接口并没有继承Collection接口,提供的是key到value的映射
Map中不能包含相同的key
Map接口常用的实现类有:HashMap、HashTable、TreeMap。
我们先看下如下示例了解下Map集合的用法:
package collection;
import java.util.*;
public class Muster {
public static void main(String[] args) {
Map platformMap = new HashMap<>();
platformMap.put(1, "博客园");
platformMap.put(2, "掘金");
platformMap.put(3, "微信公众号");
platformMap.put(4, "个人博客");
// 尝试添加重复Map
platformMap.put(4, "个人博客");
// 获取所有的key
Set keys = platformMap.keySet();
for (Integer integer : keys) {
System.out.println("Key:" + integer + ",Value:" + platformMap.get(integer));
}
}
}
以上代码的输出结果为:
Key:1,Value:博客园
Key:2,Value:掘金
Key:3,Value:微信公众号
Key:4,Value:个人博客
从日志可以看出,当我们尝试重加重复Map时,并没有添加成功。
关于Map集合的详细用法,HashMap、HashTable、TreeMap的区别(这里是重点,面试可能问的比较多),后续会单独写文总结,敬请期待。
7. 源码及参考
-
Java中的Map集合
2021-02-26 09:20:37Map集合:个人感觉Map接口以后会经常用到,可以很清晰地查找某个对象,要熟悉其四种遍历方法。特别注意其键值对的键不...再定义方法时有多个参数的话,可以使用可变参数,不过只能一个且在最后面。Collections的工具...Map集合:
个人感觉Map接口以后会经常用到,可以很清晰地查找某个对象,要熟悉其四种遍历方法。特别注意其键值对的键不能是重复的,有想定义有序存取的话,可以使用LinkedHashMap集合。不过定义自定义对象时,要复写其对象的hashCode和equals方法。静态导入的话,不用编辑器的话可以使用下。再定义方法时有多个参数的话,可以使用可变参数,不过只能一个且在最后面。Collections的工具类可以对数据进行升序和打乱顺序。集合是可以嵌套的。
Map接口概述:
Map接口下的集合与Collection接口下的集合存储数据的不同在于:
Map中的集合,元素是以键值对的形式存在的,但是集合中不能包含重复的键,值可以重复,每个键只能对应一个值。常用集合为HashMap集合、LinkedHashMap集合(有序)
常用方法:
1、get():获取指定键对应的值;
2、put():将指定的键与值对应起来,并添加到集合中,返回对应的值,无的话返回null;
3、remove():移除
Map集合遍历键找值方式:
keySet() 返回此key所在的Set集合
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class Demo01 {
public static void main(String[] args) {
Map map=new HashMap();
//存值
map.put("tom", 18);
map.put("jerry",19);
map.put("rose",18);
map.put("tom",18);
//删除元素
map.remove("rose");
//取值
System.out.println(map.get("tom"));
System.out.println(map.get("jerry"));
System.err.println(map.get("rose"));
//遍历
//1.KeySet+增强for
//获取所有key所在的Set集合
Set keys=map.keySet();
//遍历Set集合取到每一个Key,然后再根据key找到对应的值
for(String key:keys){
System.out.println(key+"..."+map.get(key));
}
System.out.println("...");
//2.Keyset+iterator
Set set2=map.keySet();
Iterator it=set2.iterator();
while(it.hasNext()){
String p=it.next();
System.out.println(p+"..."+map.get(p));
}
}
Entry键值对对象:Map.Entry
在Map类设计时,提供了一个嵌套接口(又定义一个接口):Entry。Entry将键值对的对应关系封装成了对象。即键值对对象。
方法:
getKey() 返回Entry对象中的键
getValue() 返回Entry对象中的值
entrySet() 用于返回Map集合中所有的键值对(Entry)对象,以Set集合形式返回。
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;public classDemo02 {public static voidmain(String[] args) {
Map map=new HashMap();
map.put("1","a");
map.put("2","a");
map.put("3","b");
map.put("3","c");//entrySet遍历(增强for遍历)//1.获取所有结婚证对象存在的Set集合;
/*Set> set=map.entrySet();
//2.遍历所有结婚证取到每一个结婚证
for(Map.Entry entry:set){
//3.通过每一个结婚证对象获取key
String key=entry.getKey();
//4.通过每一个结婚证对象获取value;
String value=entry.getValue();
System.out.println(key+"...."+value);
}*/
//迭代器遍历
Set> set=map.entrySet();
Iterator> it=set.iterator();while(it.hasNext()){
Map.Entry entry=it.next();
String key=entry.getKey();
String value=entry.getValue();
System.out.println(key+"..."+value);
}
HashMap存储自定义类型键值:
当给HashMap中存放自定义对象时,如果自定义对象作为key存在,这时要保证对象唯一,必须复写对象的hashCode和equals方法。
如果要保证map中存放的key和取出的顺序一致,可以使用LinkedHashMap集合来存放。
-
怎样用java定义一个int数组
2021-02-12 10:56:10是一组相关变量的集合数组是一组相关数据的集合,一个数组实际上就是32313133353236313431303231363533e4b893e5b19e31333363373731一连串的变量,数组按照使用可以分为一维数组、二维数组、多维数组数据的有点不使用...展开全部
数组:是一组相关变量的集合数组是一组相关数据的集合,一个数组实际上就是32313133353236313431303231363533e4b893e5b19e31333363373731一连串的变量,数组按照使用可以分为一维数组、二维数组、多维数组
数据的有点不使用数组定义100个整形变量:int i1;int i2;int i3
使用数组定义 int i[100];
数组定义:int i[100];只是一个伪代码,只是表示含义的
(1)一维数组
一维数组可以存放上千万个数据,并且这些数据的类型是完全相同的,
使用java数组,必须经过两个步骤,声明数组和分配内存给该数组,
声明形式一
声明一维数组:数据类型 数组名[]=null;
非配内存给数组:数组名=new 数据类型[长度];
声明形式二
声明一维数组:数据类型 [] 数组名=null;
(2)java数据类型分为两大类
1.基本数据类型
int、long操作的时候本身就是具体的内容
引用数据类型:数组、类、接口
引用传递的就是一个内存的使用权,一块内存空间,可能有多个人同时使用
2.事例声明数组
数组的声明格式里,数据类型是数组元素的数据类型,常见的有整形、浮点型、与字符型等
数组名是用来统一这组相同数据类型元素的名称,其命名规则和变量的相同
数组声明后实际上是在栈内存中保存了此数组的名称,结下了是要在堆内存中配置数组所需要的内存,齐产固定是告诉编译器,所声明的数组要存放多少个元素,而new 则是命令编译器根据括号里的长度。
基本数据类型偶读有其默认值:int 0;只要是引用数据类型默认值就是null事例
声明数组的同时分配内存空间
声明数组的同时非配内存
数据类型 数组名[]=new 数据类型[个数]
int score[]=new int[10];
声明一个元素个数为10的整形数组score,同时开辟依靠内存空间工期使用
java中,由于整形数据类型占用的空间为4个byte,而整个数组score可保存的元素有10个。所以上例中占用的内存共有4*10=40个字节
(3)数组的访问
数组中元素的表示方法
想要访问数组里的元素可以利用索引来完成,java的数组索引标号由10开始,以一个score[10]的整形数组为例,score[0]代表第一个元素
一直向下,最后一个为score[9]
(4)取得数组的长度
在java中取得数组的长度(也就是数组元素的长度)可以利用数组名称.length完成,
数组名称.length--返回一个int类型的数据
(5)数组的静态初始化
之前的数组,所采用的都是动态初始化,所有的内容在数组声明的时候并不具体的指定,而是以默认值的形式出现
静态初始化是指在数组声明后直接为数组指定具体的内容
如果想要直接在声明的时候给数组赋初始值,可以采用大括号完成,只要在数组的生命格式后面加上初值的赋值即可,
数据类型 数组名 []={初始值0,初始值1,初始值3,....初始值n};
范例排序,在操作中排序是比较常用的从大到小
这个时候不要被i值所迷惑 if(score[i]>score[j]){
这一步主要知识为了比较,实际上完成之后输出的时候是根据j的值排序的
(6)二维数组
二维数组声明的方式和以为数组的类似,内存分配也一样是用new这个关键字
其实声明与分配内存的格式如下
动态初始化
数据类型 数组名[][];
数组名=new 数据类型[行的个数][列的个数];
声明并初始化数组
数据类型 数组名[][]=new 数据类型[行的个数][列的个数];
静态初始化
(7)二维数组的存储
声明二维数组score 同时开辟一段内存空间
int score[][]=new int[4][3];
整体数据score可保存的元素是4*3=12个,在java中,int数据类型所占用的空间为4个字节,因此该整形数组占用的内存共为4*12=48个字节
事例
(8)二维数组静态初始化
用到的时候才会开辟空间,不用的(红色部分)则不开辟空间多维数组一般只是用到二维数组三维数组简单了解
-
java如何判断一个集合是否含有某个值
2021-03-23 17:24:14java怎么判断一个集合是否含有某个值一个集合中有两个元素Setset=newHashSet();set=[1,2]if(set.contains(1)){system.out.println("aaaaaaaaaaaaaa")}以上这种写法不执行用if(set.contains('1'))这种写法也不执行望... -
java类的里面可以再定义一个类吗 java里可不可以在一个
2021-03-15 21:16:49java类里面还可以定义一个类,即内部类。java内部类分为: 成员内部类、静态嵌套类、方法内部类、匿名内部类 。内部类的共性(1)、内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面... -
Java如何创建空的集合对象?
2021-03-22 17:50:32有时您需要从Java方法返回一个空集合。java.util.Collections实用工具类具有创建空的三个不同的静态常量List,Set和Map。Collections.EMPTY_LISTCollections.EMPTY_SETCollections.EMPTY_MAP当您要创建类型安全的空... -
java 两个List集合各种情况对比处理
2021-03-04 04:51:08Lambda作为函数式编程中的基础部分,在其他编程语言(例如:Scala)中早就广为使用,但在JAVA领域中发展较慢,直到java8,才开始支持Lambda。抛开数学定义不看,直接来认识Lambda。Lambda表达式本质上是匿名方法,其... -
在JAVA中如何定义一个不定长的数组?
2021-02-12 22:46:40ArrayList会比Vector快,他是非同步的,如果设计涉及到多线程,还是用Vector比较好一些import java.util.*;public class VectorDemo{public static void main(String[] args){//Vector的创建//使用Vector的构造方法... -
Java 初始化时定义一个不可改变的Map集合
2019-05-23 16:43:25初始化时定义一个不可改变的Map集合 代码 package com.zhaohp.sofaboot; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.... -
java集合超详解
2018-08-03 21:28:15一、集合大纲 1.集合和数组的区别: 2.Collection集合的方法: 3.常用集合的分类: Collection 接口的接口 对象的集合(单列集合) ├——-List 接口:元素按进入先后有序保存,可重复 │——... -
java使用Map(HashMap)集合统计字符串中某个字符出现的次数
2020-07-02 19:46:23使用Map集合统计字符串中某个字符出现的次数 源码: ...dawrsf"; ... //定义Map集合 for (int i = 0; i < str.length(); i++) { int count = 0; //初始化count的值 for (int j = 0; j < -
java用list集合存储学生信息并算出成绩平均值
2019-12-31 11:53:08输出每个学生的信息,计算并输出这五个学生Java语言成绩的平均值; 计算并输出他们Java语言成绩的最大值和最小值。 思路 用Scanner 键盘输入 用for循环依次录入学生信息 用for循环输出学生信息 用for循环拿出学生... -
Java中的ArrayList集合定义、遍历、方法
2018-05-11 20:38:11/* 一、定义 ArrayList集合的使用 是引用数据类型 实用的步骤: 1.导入包 java.util包中 2.创建引用类型的变量 数据类型<集合储存的数据类型> 变量名 = new 数据类系<集合储存的数据类型&... -
java 怎么定义一个json
2018-03-01 09:22:40一 简介: JSON(JavaScript对象符号)是一种轻量级的数据交换格式。...JSON是一个完全独立于语言的文本格式,但使用C家族的语言,包括C,C + +,C#,Java中的JavaScript,Perl的,Python中,和许多其... -
java集合类的创建方式
2020-12-17 14:31:06集合可以看作一个容器,集合中的对象可以很容易存放到集合中,也很容易将其从集合中取出来,还可以按一定的顺序摆放。Java中提供了不同的集合类,这些类具有不同的存储对象的方式,并提供了相应的方法方便用户对集合... -
Java集合
2021-05-10 15:38:32java集合就像是一种容器,可以动态的把多个对象的引用放入容器中 2、数组在存储多个数据方面的特点: >一旦初始化后,其长度就确定了 >数组一旦定义好,其元素类型就确定了,我们也就只能操作指定类型的数据了... -
Java中合并两个集合的方法
2021-02-13 02:28:21要在JAVA中合并两个集合,代码如下所示的−示例importjava.util.stream.*;importjava.util.*;importjava.io.*;publicclassDemo{publicstaticSetset_merge(Setset_1,Setset_2){Setmy_set=set_1.stream().collect... -
java中map集合的用法
2013-01-07 22:57:06Map 集合类用于存储元素对(称作“键”和“值”),其中每个键映射到一个值。 从概念上而言,您可以将 List 看作是具有数值键的 Map。 而实际上,除了 List 和 Map 都在定义 java.util 中外,两者并没有直接的联系... -
java中的集合详解
2020-07-21 15:02:17集合:集合是java中提供的一种容器,可以用来存储多个数据。集合和数组既然都是容器,它们有啥区别呢? 数组的长度是固定的。集合的长度是可变的。 数组中存储的是同一类型的元素,可以存储基本数据类型值。... -
java定义接口的方法
2021-03-14 02:23:56java定义接口的方法发布时间:2020-06-28 ...Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行... -
java 固定长度的集合
2019-05-31 14:10:28自动删除之前的数据,可使用add的两个重载方法; package com.***.cr1800.custom; import java.util.LinkedList; public class FixSizeLinkedList<T> extends LinkedList<T> { private int capacity... -
关于java集合的一个问题,怎么把一个数组添加到List集合
2021-02-12 14:58:34展开全部在第10行定义list的时候类型定义为数组32313133353236313431303231363533e78988e69d8331333433646437类型就行。ArrayList list=new ArrayList<>();如果list是按bean对象bai存,则对象要改变:之前List... -
java集合
2021-03-06 04:23:03一.数组和集合**1. 数组用来存储基本数据类型,用于需要存储的对象个数固定的情况下。长度不变**2.集合只能用于存储对象,对象个数不确定复制代码二....Set中不能包含重复的元素,而List是一个有序的集合,提供了按... -
在java中如何定义一个字符串数组
2021-02-12 10:40:33java中定义一个字符串数组方式如32313133353236313431303231363533e59b9ee7ad9431333366306465下,string类型和其他基本类型相似,创建数组有两种方式:String[] str={"AAA","BBB","CCC"};String str[]={"AAA","BBB... -
Java实验05 集合类
2020-11-21 17:33:30第七章 集合 实验7-1 Collection接口对集合的操作 一、实验描述 1、 考核知识点 名称:Collection接口 2、 练习目标 掌握Collection接口中方法的使用 3、 需求分析 Collection是所有单列集合...1) 编写一个类Examp -
java中如何确保一个集合不能被修改? - 源码解读详细
2019-11-25 18:02:46java如何确保一个集合不能被修改? - 源码解读1. Collections. unmodifiableCollection(Collection c) 方法1.1 示例1.2 源码解析1.3 综述2. 使用Arrays.asList创建的集合2.1 示例2.2 源码解读2.3 综述总结: 看了... -
java中常用的几个集合类
2019-06-10 20:19:24//包含Collection(集合),List,Set,Map(图),以及其Iterator,Comparator,Cloneable,还有常用的具体实现类 //List<List<String>>集合的嵌套使用 //1、是否允许空 //2、是否允许重复数据 //3、...