java队列_java集合入门和深入学习(详解),看这篇就差不多了

e48d3744c9f95d2d807ad2afd5c4ce56.png

一、集合入门总结

集合框架:

Java中的集合框架大类可分为Collection和Map;两者的区别:

1、Collection是单列集合;Map是双列集合

2、Collection中只有Set系列要求元素唯一;Map中键需要唯一,值可以重复

3、Collection的数据结构是针对元素的;Map的数据结构是针对键的。

泛型:

在说两大集合体系之前先说说泛型,因为在后面的集合中都会用到;

所谓的泛型就是:类型的参数化

泛型是类型的一部分,类名+泛型是一个整体

如果有泛型,不使用时,参数的类型会自动提升成Object类型,如果再取出来的话就需要向下强转,就可能发生类型转化异常(ClassCaseException);不加泛型就不能在编译期限定向集合中添加元素的类型,导致后期的处理麻烦。

下面就来对比加了泛型和不加泛型的区别:

package 好好学java;import java.util.ArrayList;import java.util.Iterator;import java.util.List;public class Test { public static void main(String[] args) { // 不加泛型,添加和遍历 List list = new ArrayList<>(); list.add(1); list.add("123"); list.add("hello");  Iterator it = list.iterator(); while(it.hasNext()){ // 没有添加泛型,这里只能使用Object接收 Object obj = it.next(); System.out.println(obj); } }}package 好好学java;import java.util.ArrayList;import java.util.Iterator;import java.util.List;public class Test { public static void main(String[] args) { // 加泛型,添加和遍历 List list = new ArrayList(); list.add("123"); list.add("hello");  Iterator it = list.iterator(); while(it.hasNext()){ // 因为添加了泛型,就说明集合中装的全部都是String类型的数据 // 所以这里用String类型接收,就不会发生异常,并且可以使用String的方法 String str = it.next(); System.out.println(str.length()); } }}

自定义带泛型的类:

package 好好学java;public class Test { // 自定义一个带有一个参数的泛型类,可以向传入什么类型就传入什么类型 public static void main(String[] args) { // 进行测试, 传入一个String对象 Person perStr = new Person(); perStr.setT("我是字符串"); String str = perStr.getT(); System.out.println(str);  // 进行测试,传入一个Integer对象 Person perInt = new Person(); perInt.setT(100); Integer intVal = perInt.getT(); System.out.println(intVal);  }}//自定义一个带有一个参数的泛型类class Person{ private T t;  void setT(T t){ this.t = t; }  T getT(){ return t; }}

实现带有泛型的接口类型:

实现接口的同时, 指定了接口中的泛型类型. (定义类时确定);

public class GenericImpl1 implements GenericInter {}

实现接口时, 没有指定接口中的泛型类型.此时, 需要将该接口的实现类定义为泛型类.接口的类型需要在创建实现类对象时才能真正确定其类型. (始终不确定类型, 直到创建对象时确定类型);

public class GenericImpl2 implements GenericInter {}

泛型的通配符(?):

上限限定:比如定义方法的时候出现,public void getFunc(List extends Animal> an),

那么表示这里的参数可以传入Animal,或者 Animal的子类

下限限定: 比如定义方法的时候出现,public void getFunc(Set super Animal> an ),

那么表示这里的参数可以传入Animal,或者Animal的父类

使用泛型的注意点:

1、泛型不支持基本数据类型

2、泛型不支持继承,必须保持前后一致(比如这样是错误的:List list = new ArrayList();

Collection体系:

ollection包括两大体系,List和Set

List的特点:

存取有序,有索引,可以根据索引来进行取值,元素可以重复

Set的特点:

存取无序,元素不可以重复

List:

下面有ArrayList,LinkedList,Vector(已过时)

集合的的最大目的就是为了存取;List集合的特点就是存取有序,可以存储重复的元素,可以用下标进行元素的操作

ArrayList: 底层是使用数组实现,所以查询速度快,增删速度慢

package 好好学java;import java.util.ArrayList;import java.util.Iterator;import java.util.List;public class Test { // 使用ArrayList进行添加和遍历 public static void main(String[] args) { List list = new ArrayList();  list.add("接口1"); list.add("接口2"); list.add("接口3");  // 第一种遍历方式,使用迭代器 Iterator it = list.iterator(); while(it.hasNext()){ String next = it.next(); System.out.println(next); } System.out.println("-------------------"); // 第二种遍历方式,使用foreach for (String str : list){ System.err.println(str); } }}

LinkedList:是基于链表结构实现的,所以查询速度慢,增删速度快,提供了特殊的方法,对头尾的元素操作(进行增删查)。

使用LinkedList来实现栈和队列;栈是先进后出,而队列是先进先出

package com.xiaoshitou.classtest;import java.util.LinkedList;/** * 利用LinkedList来模拟栈 * 栈的特点:先进后出 * @author Beck * */public class MyStack { private LinkedList linkList = new LinkedList();  // 压栈 public void push(String str){ linkList.addFirst(str); }  // 出栈 public String pop(){ return linkList.removeFirst(); }  // 查看 public String peek(){ return linkList.peek(); }  // 判断是否为空 public boolean isEmpty(){ return linkList.isEmpty(); }}package 好好学java;public class Test { public static void main(String[] args) { // 测试栈 StackTest stack = new StackTest(); stack.push("我是第1个进去的"); stack.push("我是第2个进去的"); stack.push("我是第3个进去的"); stack.push("我是第4个进去的"); stack.push("我是第5个进去的"); // 取出 while (!stack.isEmpty()){ String pop = stack.pop(); System.out.println(pop); } // 打印结果 /*我是第5个进去的 我是第4个进去的 我是第3个进去的 我是第2个进去的 我是第1个进去的*/ } }

LinkedList实现Queue:

package 好好学java;import java.util.LinkedList;/** * 利用linkedList来实现队列 * 队列: 先进先出 * @author Beck * */public class QueueTest { private LinkedList link = new LinkedList();  // 放入 public void put(String str){ link.addFirst(str); }  // 获取 public String get(){ return link.removeLast(); }  // 判断是否为空 public boolean isEmpty(){ return link.isEmpty(); }}package 好好学java;public class Test { public static void main(String[] args) { // 测试队列 QueueTest queue = new QueueTest();  queue.put("我是第1个进入队列的"); queue.put("我是第2个进入队列的"); queue.put("我是第3个进入队列的"); queue.put("我是第4个进入队列的");  // 遍历队列 while (!queue.isEmpty()){ String str = queue.get(); System.out.println(str); } // 打印结果 /*我是第1个进入队列的 我是第2个进入队列的 我是第3个进入队列的 我是第4个进入队列的*/ } }

Vector:因为已经过时,被ArrayList取代了;它还有一种迭代器通过vector.elements()获取,判断是否有元素和取元素的方法为:hasMoreElements(),nextElement()。

package 好好学java;import java.util.Enumeration;import java.util.Vector;public class Test { public static void main(String[] args) { Vector vector = new Vector();  vector.add("搜索"); vector.add("vector"); vector.add("list");  Enumeration elements = vector.elements(); while (elements.hasMoreElements()){ String nextElement = elements.nextElement(); System.out.println(nextElement); } } }

Set:

Set集合的特点:元素不重复,存取无序,无下标

Set集合下面有:HashSet,LinkedHashSet,TreeSet

HashSet存储字符串:

package 好好学java;import java.util.HashSet;import java.util.Iterator;import java.util.Set;public class Test { public static void main(String[] args) { // 利用HashSet来存取 Set set = new HashSet();  set.add("我的天"); set.add("我是重复的"); set.add("我是重复的"); set.add("welcome");  // 遍历 第一种方式 迭代器 Iterator it = set.iterator(); while(it.hasNext()){ String str = it.next(); System.out.println(str); }  System.out.println("--------------"); for (String str : set){ System.out.println(str); } // 打印结果,重复的已经去掉了 /*我的天 welcome 我是重复的 -------------- 我的天 welcome 我是重复的*/ } 

那哈希表是怎么来保证元素的唯一性的呢,哈希表是通过hashCode和equals方法来共同保证的。

哈希表的存储数据过程(哈希表底层也维护了一个数组):

根据存储的元素计算出hashCode值,然后根据计算得出的hashCode值和数组的长度进行计算出存储的下标;如果下标的位置无元素,那么直接存储;如果有元素,那么使用要存入的元素和该元素进行equals方法,如果结果为真,则已经有相同的元素了,所以直接不存;如果结果假,那么进行存储,以链表的形式存储。

演示HashSet来存储自定义对象:

package 好好学java;public class Person { // 属性 private String name; private int age;  // 构造方法 public Person() { super();  } public Person(String name, int age) { super(); this.name = name; this.age = age; }  // 要让哈希表存储不重复的元素,就必须重写hasCode和equals方法 @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + age; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Person other = (Person) obj; if (age != other.age) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; }   @Override public String toString() { return "Person [name=" + name + 

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

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

相关文章

oracle课程小结,Oracle 数据库优化实战心得总结

一般情况下&#xff0c;对于频繁访问但是不频繁修改的数据&#xff0c;内部设计应当物理不规范化&#xff1b;对于频繁修改但并不频繁访问的数据&#xff0c;内部设计应当物理规范化。3.充分利用内存&#xff0c;优化sga、pga等(11g已经实现了sgapga自动化&#xff0c;但有的时…

苹果公司的企业文化_百度、苹果、脉脉等互联网大厂的企业文化衫还能这么潮?...

转眼2020年就已经到年中啦&#xff0c;很多企业已经敲锣打鼓&#xff0c;筹备着年中的会议团建了&#xff0c;有趣的&#xff0c;好玩的&#xff0c;有创意的&#xff0c;体面的&#xff0c;大场面的&#xff0c;国际范儿的&#xff0c;到底怎么样的年中策划才是最NICE的呢&…

命名空间跟作用域是什么关系_魏如萱许光汉首次合唱新歌《什么跟什么有什么关系》_娱乐频道...

近日&#xff0c;许光汉与新晋金曲奖歌后魏如萱合作的最新单曲《什么跟什么有什么关系》已经上线。歌曲由金曲奖最佳作词人李焯雄作词&#xff0c;魏如萱作曲&#xff0c;陈建骐担当制作&#xff0c;魏如萱和许光汉共同演唱。单曲收录于十一音乐的年度限定合作企划“不完美人生…

二级域名是否可以随意设定_新老域名是否影响SEO优化收录排名?企业需要多域名做网站吗?...

(文/守护袁昆)各互联网平台想免费做营销推广变得比较困难&#xff0c;而大多数中小企业又没什么资金方面的营销预算&#xff0c;所以付费推广广告也没法做。建立自己的企业官网貌似是不错的方式。传统企业在互联网上玩了一圈&#xff0c;发现还是自己的企业官网最靠谱。那么问题…

oracle pr,PRMSCAN ORACLE碎片扫描合并工具

prmscan 是诗檀软件独立研发的ORACLE数据块碎片扫描合并工具&#xff0c;其适用于以下的场景&#xff1a;误手动删除了文件系统(任意文件系统 NTFS、FAT、EXT、UFS、JFS等)或ASM上的数据文件文件系统损坏&#xff0c;导致数据文件大小变成0 bytes即数据文件被清零文件系统损坏&…

win10启动修复_以安全模式启动win10的4种方法,简单高效,修复电脑故障必用技巧...

在安全模式下启动Windows7只是小菜一碟&#xff0c;你所要做的就是按下Shift8来中断启动过程&#xff0c;然而&#xff0c;在安全模式下启动windows 10的过程并不是那么简单。一些用户甚至认为Windows 10无法使用安全模式&#xff0c;但事实并非如此&#xff0c;有很多方法可以…

usb接口供电不足_Win7系统下电脑USB供电不足的解决方法

关注奕奇科技&#xff0c;学习更多小妙招&#xff0c;工作效率加倍小妙招&#xff0c;值得收藏笔记本主板USB供电不足的现象可以解释成两种情况&#xff1a;第一种是笔记本使用电池的时候会自动切换到较低的功耗&#xff0c;最大的电流标准是500mA&#xff0c;电压是5V&#xf…

php memcached 队列,redis获取所有队列_memcached

scrapy-redis实现分布式中, 获取redis队列中的612x230 - 24KB - PNGscrapy动态的从redis队列中获取源,并启动spid558x462 - 128KB - PNGRedis实现消息队列700x365 - 36KB - JPEGRedis实现简单消息队列 - 滚动_【北京联盟】677x441 - 9KB - PNGRedis实现简单消息队列 - 滚动_【北…

BP算法和RNN_模型CNN-RNN-LSTM和GRU简介

深度学习自从2006年以后已经“火”了十多年了&#xff0c;目前大家看到的&#xff0c;最普遍的应用成果是在计算机视觉、语音识别和自然语言处理&#xff08;NLP&#xff09;。最近工业界也在努力地扩展它的应用场景&#xff0c;比如游戏、内容推荐和广告匹配等等。深度模型架构…

电脑向linux服务器传输文件,windows如何通过ssh工具向linux服务器上传和下载文件?...

这个是很简单的。我用win10和kali给你举例子。kali自带了ssh&#xff0c;只不过我们需要开启它。kali下运行ps -e | grep ssh&#xff0c;你会发现已经有了ssh。只是没有启动&#xff0c;启动方法是/etc/init.d/ ssh start。如果你的linux机器不是kali&#xff0c;就先apt-get …

python bar图_python使用matplotlib绘图 — barChart | 学步园

matplotlib是python最著名的绘图库&#xff0c;它提供了一整套和matlab相似的命令API&#xff0c;十分适合交互式地进行制图。而且也可以方便地将它作为绘图控件&#xff0c;嵌入GUI应用程序中。它的文档相当完备&#xff0c;并且Gallery页面中有上百幅缩略图&#xff0c;打开之…

python random randint_python中random.randint(1,100)随机数中包不包括1和100

展开全部 在python中的random.randint(a,b)用于生成一个2113指定范围内的整数。5261其中参数a是下4102限&#xff0c;1653参数b是上限&#xff0c;生成的随机数n: a < n < b。 print random.randint(12, 20) #生成的随机数n: 12 < n < 20 print random.randint(20,…

curaengine linux编译,CuraEngine开源程序解读

8种机械键盘轴体对比本人程序员&#xff0c;要买一个写代码的键盘&#xff0c;请问红轴和茶轴怎么选&#xff1f;meshmesh中主要定义了关于三角形网格三个类和这三个类的一些成员函数&#xff0c;分别是MeshVertex&#xff0c;MeshFace以及Mesh。全局变量const int类型的全局变…

python docx库安装_详解python中docx库的安装过程

python中docx库的简介 python-docx包&#xff0c;这是一个很强大的包&#xff0c;可以用来创建docx文档&#xff0c;包含段落、分页符、表格、图片、标题、样式等几乎所有的word文档中能常用的功能都包含了&#xff0c;这个包的主要功能便是用来创建文档&#xff0c;相对来说用…

创新固定资产管理方式:易点易动集成企业微信的全新解决方案

在当今竞争激烈的商业环境中&#xff0c;高效的固定资产管理对于企业的成功至关重要。然而&#xff0c;传统的资产管理方式往往繁琐、容易出错&#xff0c;并且缺乏实时性和准确性。为了解决这些挑战&#xff0c;易点易动与企业微信进行了集成合作&#xff0c;推出了一种全新的…

python删除重复元素_Python-删除列表中重复元素的方法

原博文 2017-12-21 17:07 − 1.set()方法 x [1,2,3,4,5,1] y list(set(x)) print(y) [1, 2, 3, 4, 5] 2. x [b,c,d,b,c,a,a] y {}.fromkeys(x).ke... 相关推荐 2019-09-28 21:13 − Python python是一种跨平台的计算机程序设计语言&#xff0c;是一种面向对象的动态类型语…

linux内核提取ret2usr,Linux内核漏洞利用技术详解 Part 2

前言在上一篇文章中&#xff0c;我们不仅为读者详细介绍了如何搭建环境&#xff0c;还通过一个具体的例子演示了最简单的内核漏洞利用技术&#xff1a;ret2usr。在本文中&#xff0c;我们将逐步启用更多的安全防御机制&#xff0c;即SMEP、KPTI和SMAP&#xff0c;并逐一解释它们…

raid5坏了一块盘怎么办_机械硬盘的坏道处理——屏蔽之

分享一次处理硬盘坏道的经历。打算写的让小白也能照着葫芦画葫芦。机械硬盘的阿喀琉斯之踵无疑是坏道。倘若一块硬盘出现了坏道怎么办&#xff1f;当然是即刻备份资料更换新硬盘。毫无疑问&#xff0c;二手硬盘几乎都是被榨干的状态&#xff0c;活生生地一副论斤卖的样子。当然…

linux 嵌入式 交叉 环境搭建 实验原理,实验三 嵌入式Linux开发环境的搭建

南京邮电大学通达学院实 验 报 告实验 实验三题目 嵌入式Linux开发环境的搭建 课程名称 嵌入式驱动开发实验 学院 专业 班 实验者学号同做者学号 08002210 姓名 毛骏超 同做者学号 08002225 姓名 陈超/ 嵌入式应用开发实验成绩 评定一、实验目的1.掌握嵌入式交叉编译环境的搭建…

insert into select 优化_数据库优化总结

第一部分&#xff1a;SQL语句优化1、尽量避免使用select *&#xff0c;使用具体的字段代替*&#xff0c;只返回使用到的字段。2、尽量避免使用in 和not in&#xff0c;会导致数据库引擎放弃索引进行全表扫描。SELECT * FROM t WHERE id IN (2,3)SELECT * FROM t1 WHERE usernam…