java 中Collection存储器详解及简单实例
发布时间 - 2026-01-11 00:34:39 点击率:次本篇仅为了巩固一下基础,回忆一下存储的这两个常用的东东…

一、Collection
1.存储对象可以考虑:①数组②结合
2.数组存储对象的特点:Student[] stu = new Student[20]; stu[0] = new Stutdent();……
弊端:①一旦创建,其长度不可变
②真实的数组存放的对象的个数是不可知的
3.集合
Collection接口
丨------List接口:存储有序,可以重复的元素
丨-------ArrayList(主要的实现类,首选)
丨-------LinkedList(频繁的插入,删除)
丨-------Vector(古老的实现类,线程安全)
丨------Set接口:存储无序,不可重复的元素,Set中常用的方法都是Collection下定义的
丨-------HashSet(主要实现类)
丨-------LinkedHashSet
丨-------TreeSet
例: (这里主要是说Set接口)
1)HashSet
Set存储的元素是无序的,是不可重复的!
1.无序性:无序性 != 随机性。真正的无序性,指的是元素在底层存储的位置是无序的。(根据hash值来存)
2.不可重复性:当向Set中添加进相同的元素的时候,后面的这个不能添加进去。
//说明:要求添加进Set中的元素所在的类,一定要重写equals()和hashcode()方法。进而保证set中元素的不可重复性!
set中的元素时如何存储的呢?使用了哈希算法。
当向set中添加元素时,首先调用此对象所在类的hashCode()方法,计算此对象的hash值,此哈希值决定了此对象在set中的存储位置,若此位置之前没有对象存储,则此对象直接存到这个位置。(就好比一个教室,按号入座一样),若已有对象存储,在通过equals()方法比较这两个对象的是否相同,如果相同后一个对象不能再添加进来。
万一返回false呢?都存储。(不建议如此)
//>要求:hashcode()方法要与equals()方法一致。
事例代码如下:
public class TestSet{
@Test
public void testHashSet(){
Set set = new HashSet();
set.add(123);
set.add(456);
set.add(new String("AA"));
set.add(new String("AA"));//若此时在这里加上相同元素,则加不进去。
set.add("BB");
set.add(null);
System.out.println(set.size());
System.out.println(set);
}
}
2)LinkedHashSet()
/*
*LinkedHashSet:使用链表维护了一个添加进集合中的顺序,导致当我们遍历LinkedHashSet集合元素是按照
*添加进去的顺序遍历的!但是存储是无序的!
*LinkedHashSet得插入性能略低于HashSet,但在迭代访问Set里的全部元素时有很好的性能。
*LinkedHashSet不允许集合元素重复。
*/
public class TestLinkedHashSet{
@Test
public void testLinkedHashSet(){
Set set = new LinkedHashSet();
set.add(123);
set.add(456);
set.add(new String("AA"));
set.add(new String("AA"));
set.add("BB");
set.add(null);
System.out.println(set.size());
System.out.println(set);
//迭代器去遍历
Iterator iterator = set.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
输出为:123,456,AA,BB,null
3)TreeSet
/*
*1.向TreeSet中添加的元素必须是同一个类的
*2.可以按照添加进集合中的元素的指定的顺序遍历,像String,包装类等默认按照从小到大的顺序遍历
*3.当向TressSet中添加自定义类的对象时,有两种排序方法:①自然排序②定制排序
*4.自然排序:要求自定义类实现java.lang.Comparable接口并重写其compareTo(Object obj)
在此方法中,指明按照自定义类额哪个属性进行排序。
*5.向TreeSet中添加元素时,首先按照compareTo()进行比较,一旦返回0,虽然仅是两个对象的子属性值相同, 但是程序会认为这两个对象是相同的,进而后一个对象就不能添加进来。
*>compartTo()与hashCode();以及equals()三者保持一致!
*/
False:
public class TestTreeSet{
//这样添加会报出一个CastException,会出现异常
@Test
public void testTreeSet(){
Set set = new TreeSet();
set.add(123);
set.add(456);
set.add(new String("AA"));
set.add(new String("AA"));
set.add("BB");
}
}
True:
public class TestTreeSet{
@Test
public void testTreeSet(){
Set set = new TreeSet();
// set.add(new String("AA"));
// set.add(new String("AA"));//相同的元素没有进去
// set.add("JJ");
// set.add("GG");
// set.add("MM");
//String没有报错是以为String类型实现了Comparable接口,已经重写好了排序的方法
//当Person类没有实现Comparable接口时,当向TreeSet中添加Person对象时,报 //ClassCastException
set.add(new Person("CC",23));
set.add(new Person("MM",21));
set.add(new Person("GG",25));
set.add(new Person("JJ",24));
set.add(new Person("KK",20));//新加一个KK,但是age相同
set.add(new Person("DD",20));
for(Object str : set){
System.out.println(str);
}
}
}
输出为AA,GG,JJ,MM
//当向TreeSet中添加Person类的对象时,依据此方法,确定按照哪个属性排列。
//需要重写compareTo方法
//Person(name,age,get/set方法,空构造器,toString,equals,hashCode)
@Override
public int compareTo(Object o){
if(o instanceof Person){
Person p = (Person)o;
// return this.name.compareTo(p.name); 从小往大排
// return -this.name.compareTo(p.name); 从大往小排
int i = this.age.compareTo(p.age);
if(i == 0){
return this.name.compareTo(p.name);
}else{
return i ;
}
}
return 0;
}
//定制排序
//Customer(name,id,get/set方法,空构造器,toString,equals,hashCode)
public class TestTreeSet{
@Test
public void testTreeSet2(){
//1.创建一个实现了Comparator接口的类对象
Comparator com = new Comparator(){
//
@Override
public int compare(Object o1,Object o2){
if(o1 instanceof Customer && o2 instanceof Customer){
Customer c1 = (Customer)o1;
Customer c2 = (Customer)o2;
int i = c1.getId().compareTo(c2.getId());
if(i == 0){
return c1.getName().compareTo(c2.getName());
}
return i;
}
return 0;
}
};
//2.将此对象作为形参传递给TreeSet的构造器中
TreeSet set = new TreeSet(com);
//3.向TreeSet中添加Comparator接口中的compare方法中涉及的类的对象
set.add(new Customer("AA",1003));
set.add(new Customer("BB",1002));
set.add(new Customer("GG",1004));
set.add(new Customer("CC",1001));
set.add(new Customer("DD",1001));
for(Object str : set){
System.out.println(str);
}
}
}
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# java
# Collection
# Collection详解
# Collection实例
# JAVA对list集合进行排序Collections.sort()
# 如何解决Mybatis--java.lang.IllegalArgumentException: R
# JAVA collection集合之扑克牌游戏实例
# 浅谈Java中Collection和Collections的区别
# 详解java中的Collections类
# 用Java集合中的Collections.sort方法如何对list排序(两种方法)
# java Collection 之Set使用说明
# 遍历
# 重写
# 这两个
# 自定义
# 都是
# 实现了
# 若此
# 迭代
# 在这里
# 很好
# 好了
# 在此
# 已有
# 但在
# 希望能
# 就不能
# 是说
# 仅是
# 当我们
# 将此
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID
如何在阿里云通过域名搭建网站?
七夕网站制作视频,七夕大促活动怎么报名?
制作企业网站建设方案,怎样建设一个公司网站?
如何用免费手机建站系统零基础打造专业网站?
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区
Laravel Blade模板引擎语法_Laravel Blade布局继承用法
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法
详解CentOS6.5 安装 MySQL5.1.71的方法
Linux系统命令中tree命令详解
如何在阿里云虚拟服务器快速搭建网站?
zabbix利用python脚本发送报警邮件的方法
利用JavaScript实现拖拽改变元素大小
网站制作大概多少钱一个,做一个平台网站大概多少钱?
PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑
bootstrap日历插件datetimepicker使用方法
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
如何快速生成专业多端适配建站电话?
瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口
如何在IIS中配置站点IP、端口及主机头?
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
大连 网站制作,大连天途有线官网?
宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作
网易LOFTER官网链接 老福特网页版登录地址
如何自定义建站之星模板颜色并下载新样式?
如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程
Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】
企业网站制作这些问题要关注
手机网站制作与建设方案,手机网站如何建设?
Laravel如何使用Blade组件和插槽?(Component代码示例)
如何在云指建站中生成FTP站点?
如何在Tomcat中配置并部署网站项目?
Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南
Laravel如何处理CORS跨域请求?(配置示例)
Laravel如何构建RESTful API_Laravel标准化API接口开发指南
如何用已有域名快速搭建网站?
进行网站优化必须要坚持的四大原则
Python面向对象测试方法_mock解析【教程】
Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试
JavaScript如何实现错误处理_try...catch如何捕获异常?
昵图网官网入口 昵图网素材平台官方入口
实例解析Array和String方法
Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧
高防服务器租用如何选择配置与防御等级?
VIVO手机上del键无效OnKeyListener不响应的原因及解决方法
如何自定义建站之星网站的导航菜单样式?

