java中集合怎么定义_Java集合系列(一):集合的定义及分类

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中,鼠标悬停时会提示如下的错误信息:

f9cd470da9a7fcb785fcc6cf3e5fdc17.png

意思是类型参数不能是原始类型(基本数据类型),那怎么使用呢?总不能不让我使用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集合

它们之间的继承关系可以参考下图。

adc606f9b022e890dd219173bac6584c.png

从上图可以总结出如下几点:

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. 源码及参考

8. 最后

打个小广告,欢迎扫码关注微信公众号:「申城异乡人」,定期分享Java技术干货,让我们一起进步。

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

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

相关文章

STL6-输入输出流

cout 是 console output 缩写 程序 和键盘 之间有一个输入缓冲区 程序 和 显示器 之间有一个输出缓冲区 #include<iostream> #include<windows.h> #include<iomanip> using namespace std; #if 0 cout << "dd"; //全局流对象&#xff0c;默…

azul java_Java版本更新重大提醒 - Azul

2019年1月对于Java开发人员和用户都特别重要。原因是Oracle JDK 8发布了更新202&#xff0c;这是Oracle的JDK 8的最终公开更新(针对商业用户)。用户现在需要仔细考虑将来如何更新升级Java版本了。对于非商业桌面用户&#xff0c;将继续通过现有Java Update机制提供对Oracle Jav…

java 自定义 钩子_Java添加关闭钩子里面的方法

在我的代码中&#xff0c;我使用CompletionService和ExecutorService来启动一堆Thread来执行某些任务(这可能需要很长时间) . 所以我有一个创建ExecutorService和CompletionService的方法&#xff0c;然后开始提交线程然后获取结果 . 我想添加一个关闭钩子&#xff0c;以便优雅…

Ubuntu nginx+uwsgi部署Django项目

前提条件&#xff1a;首先项目使用一下命令启动成功后&#xff0c;输入公网ip后可以启动成功 python manage.py runserver 0.0.0.0:80 一、阿里云配置安全组 添加8000端口 二、安装配置uwsgi 1、确定django项目可以正常运行了&#xff0c;ctrlc停止项目&#xff0c;下面我们来…

STL7-基础

1、容器可以嵌套容器 2、容器分为序列式容器和关联式容器 序列式容器&#xff1a;容器的元素的位置是由进入容器时机和地点来决定 关联式容器&#xff1a;容器已经有规则&#xff0c;进入容器的元素的位置不是由进入容器时机和地点来决定 只与此容器的排列规则有关 3、迭代…

java 0xaarrggbb 转换_RRGGBBAA或者RRGGBB转换成rgba()

//十六进制颜色值的正则表达式var reg /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;/*16进制颜色转为RGB格式*/var colorRgb function(color){if(color.length>7){var num color.slice(7,9).toUpperCase();var x opacityColor(num)color color.slice(0,7);}var sColor color…

java 假设当前时间_Java中与日期和时间相关的类和方法

一、currentTimeMillis()方法System 类中的方法 currentTimeMillis() 方法可以返回从 GMT1970 年 1 月 1 日 00 : 00 : 00 开始到当前时刻的毫秒数。System.currentTimeMillis(); //返回值为long类型二、Date类1.构造方法(1)public Date (); 以当前系统时间创建一个Date对象&am…

STL8-string容器

C 没有 string 类&#xff0c;但提供了直接对字符数组、字符串操作的函数 -> 如 str_len()等等 -> 需要包含 “string.h”#include<iostream> #include<string> using namespace std;//初始化 void test01() {string s1; //调用无参构造string s2(10, a);str…

java 采集 cms_开源 java CMS - FreeCMS2.3 Web页面信息采集

Web页面信息采集从FreeCMS 2.1开始支持通过简单配置即可抓取目标网页信息&#xff0c;支持增量式采集、关键字替换、定时采集&#xff0c;同一采集规则可采集多个页面(静态和动态)&#xff0c;可采集多种信息属性&#xff0c;可自动审核且静态化信息页面。采集规则管理从左侧管…

Python中reshape函数参数-1的意思?

import numpy as np c np.array([[1,2,3],[4,5,6]]) print(2行3列) print(c.reshape(2,3)) print(3行2列) print(c.reshape(3,2)) print(我也不知道几行&#xff0c;反正是一列) print(c.reshape(-1,1)) print(我也不知道几列&#xff0c;反正是一行) print(c.reshape(1,-1)) …

java浮点数四舍五入_Java小程序练习--浮点数的四舍五入

今天学习到了关于浮点数的知识&#xff0c;而后便编写了一个小demo&#xff0c;实现浮点数的四舍五入&#xff0c;保留两位小数。具体实现思路如下:1.获取用户输入的数字&#xff0c;将其保存到double型变量中&#xff1b;2.因为要保存到小数点后的两位&#xff0c;将该数乘以1…

STL9-vector容器

vector容器 动态数组 可变数组 vector容器 单口容器 vector实现动态增长&#xff1a; 当插入新元素时&#xff0c;如果空间不足&#xff0c;那么vector会重新申请更大内存空间&#xff08;默认二倍&#xff09;&#xff0c;将原空间数据拷贝到新空间&#xff0c;释放旧空…

函数返回值失效

#include<stdio.h> #include<stdlib.h> #include<string.h> #if 1 char* getMen2() {char buf[64]; //临时变量&#xff0c;栈区存放strcpy(buf, "abccddeeff");printf("buf:%s\n", buf);return buf; //此处并不是把内存块64个字节ret…

mysql突然出现慢sql_Mysql开启慢SQL并分析原因

第一步.开启mysql慢查询方式一:修改配置文件Windows&#xff1a;Windows 的配置文件为 my.ini&#xff0c;一般在 MySQL 的安装目录下或者 c:\Windows 下。Linux&#xff1a;Linux 的配置文件为 my.cnf &#xff0c;一般在 /etc 下在 my.ini 增加几行:[mysqlld]long_query_time…

STL10-deque容器

deque 双端队列 deque 删除操作 deque案例&#xff1a; #if 1 #include<iostream> #include<deque> using namespace std; void PrintDeque(deque<int>& d) {for (deque<int>::iterator it d.begin(); it ! d.end(); it) {cout << *it <…

php mysql 平均分_平均评级计算mysql php

我想计算每个用户的平均评分 .我有三张 table .表评级id |order_id |rate------------------1 | 52 |82 | 51 |43 | 52 |24 | 51 |7表顺序这里做的是驱动程序表IDid |did------------------52 | 551 | 735 | 644 | 8表驱动程序id |name------------------5 | test17 | test28 |…

Leedcode4-sort listnode 归并排序

#include<iostream> using namespace std;//Sort a linked list in O(n log n) time using constant space complexity.//Definition for singly-linked list. //归并排序 #if 0 struct ListNode {int val;ListNode *next;ListNode(int x) : val(x), next(NULL) {}}; str…

vue 字典配置_vue遍历数据及字典的方法

数组&#xff1a;数值{{ item.message }}数组&#xff1a;数值加索引{{ item.msg }}{{index}}字典&#xff1a;key value index{{ value }} {{key}} {{index}}new Vue({el: #repeat,data: {object: {FirstName: John,LastName: Doe,Age: 30}}})vue遍历数组和对象的方法以及他们…

tensorflow代码中tf.app.run()什么意思

# 前面的代码省略了... 。。。 。。。 。。。 def main(argvNone):mnist input_data.read_data_sets("F:\mydata\TensorFlowData\MNIST_data", one_hotTrue)train(mnist)if __name__ __main__:tf.app.run()那么 tf.app.run()什么意思呢 &#xff1f;可以猜到&#…

java jdbc dao_Java自学-JDBC DAO

基于JDBC设计DAO的实例DAODataAccess Object数据访问对象实际上就是运用了ORM中的思路&#xff0c;把数据库相关的操作都封装在这个类里面&#xff0c;其他地方看不到JDBC的代码步骤 1 : DAO接口package jdbc;import java.util.List;import charactor.Hero;public interface DA…