List——知道索引的集合

Set——没有重复元素的集合

Map——成对的键、值得集合

ArrayList

1 概念

ArrayList是可动态增长或缩减的索引序列,相当于动态数组;

是用数组结构实现;

随机访问效率高;

不适合经常作插入或删除操作;

对容量不确定的效率较低,可能经常需要对元素进行复制;

2 使用

2.1 定义ArrayIist对象

ArrayList<String> list1 = new ArrayList<String>();

2.2 添加数据

a 在ArrayList末尾添加数据

list1.add("y");
list1.add("q");
list1.add("a"); // 输出list1是[y, q, a]

b 在下标为N处添加数据

list1.add(1, "t"); // 输出list1是[y, t, q, a]

c 将一个ArrayList中所有数据添加到另一个ArrayList中

ArrayList<String> list2 = new ArrayList<String>();
list2.add("w");
list2.add("c");
list1.addAll(list2); // 输出list1是[y, t, q, a, w, c]

d 将一个ArrayList中所有数据添加到另一个ArrayList中的下标为N处

list1.addAll(2, list2); // 输出list1是[y, t, w, c, q, a, w, c]

2.3 删除数据

a 删除下标为N处的数据

list1.remove(3); // 输出list1是[y, t, w, q, a, w, c]

b 按照指定内容删除第一个匹配的数据

list1.remove("w"); // 输出list1是[y, t, q, a, w, c]

c 按照指定集合删除缩合匹配的数据

前提是list1=[s, y, q, a, t, y, q, a],lsit2=[y, q, a]

list1.removeAll(list2); // 输出list1是[s, t]

d 清空ArrayList

list1.clear(); // 输出list1是[]

2.4 修改数据

a 修改下标为N处的数据

list1.set(1, "y"); // 前提list1=[s, t],执行后list1=[s, q]

2.5 查询数据

a 获取下标为N的数据

String first = list1.get(1); //前提是list1=[s, q],执行后first="q"

2.6 迭代器遍历

ArrayList<String> list = new ArrayList<String>();
list.add("y");
list.add("q");
list.add("a");
list.add("t");
list.add("w");
list.add("c");
// iterator()方法返回Iterator
Iterator<String> it = list.iterator();
// hasNext()方法检查ArrayList中是否有下一个元素
while (it.hasNext()){// next()方法返回类型为Object,需强制类型转换成String// 第一次调用next()方法返回ArrayList的下标为0的对象String str = (String) it.next();System.out.print(str);
}

2.7 排序

ArrayList没有sort()方法,因此需要借助Collections.sort()方法对ArrayList的中String按照字母进行排序;

LinkedList<String> list = new LinkedList<String>();
list.add("y");
list.add("q");
list.add("a");
list.add("t");
list.add("w");
list.add("c");
// 排序前list=[y,q,a,t,w,c],排序后list=[a,c,q,t,w,y]
Collections.sort(list);

而对于自己定义的类进行排序,无法简单使用上述方法进行排序,否则编译器报错;

方法1——使用Comparable

首先查看sort()方法的帮助文档,一个如下:

public static <T extends Comparable<? super T>> void sort(List<T> list)

其中,Comparable是接口;对于泛型,extends代表“是一个……”,适用于类和接口;”T extends Comparable“可读作“T必须有实现Comparable的类型”

”Lsit<T>“表示仅能继承Comparable的参数化类型的list;

”<? super T>表示Comparable的类型参数必须是T或T的父型“

因此,对于自己编写的类的ArrayList进行排序,必须实现Comparable;

Comparable接口只有一个方法需要实现,返回值为负整数、零、正整数,分别表示当前对象小于、等于、大于指定对象;

public interface Comparable<T>{
int compareTo(T o);
}

接着确定如何比较才能有办法实现Comparable接口,这里按照歌名字母进行排序;

class Song implements Comparable<Song>{String title;String artist;public int compareTo(Song s){return title.compareTo(s.getTitle());}Song(String t, String a, String r, String b){title = t;artist = a;rating = r;bpm = b;}public String getTitle(){return title;}public String getArtist(){return artist;}
}

方法2——使用Comparator

还有另一个sort()方法,取用Comparator参数;

sort(List<T> list, Comparator<? super T> c)

Comparator接口只有一个方法需要实现;

public interface Comparator<T>{
int compare(T o1, T o2);
}

sort()方法带有Comparator,不会调用元素的compareTo()方法,而是调用Comparator的compare()方法;

class ArtistCompare implements Comparator<Song>{public int compare(Song one, Song two){return one.getArtist().compareTo(two.getArtist());}
}ArrayList<Song> songList = new ArrayList<Song>();
ArtistCompare artistCompare = new ArtistCompare();
Collections.sort(songList, artistCompare);

LinkedList

1 概念

LinkedList在任何位置可高效地插入和删除的有序序列;

是用链表结构实现;

随机访问效率低;

适合作插入或删除操作;

2 操作

因为LinkedList是使用链表结构实现的,因此没有get()和set()方法;

HashSet

1 概念

HashSet是没有重复元素的无序集合;

2 使用

3 对象的等价

3.1 引用相等性

堆上同一对象的两个引用;

使用==判断两个引用是否相等;

3.2 对象相等性

堆上的两个不同对象在意义上是相同的;

使用equals()方法判断两个对象在意义上是否相等;

TreeSet

1 概念

没有重复元素的有序集合;

2 使用

要使用TreeSet,以下其中一项必须为真;

2.1 集合中的元素必须是有实现Comparable的类型

2.2 使用重载、取用Comparator参数的构造函数创建TreeSet

HashMap

1 概念

存储键/值关联的数据结构;

2 使用

2.1 常用方法

HashMap<String, double> map = new HashMap<String, double>();
map.put("math", 100);
map.put("english", 97);
System.out.println(map.containsKey("chinese"));
System.out.println(map.containsValue(100));
double scoreMath = map.get("math");
System.out.println(map.size());
map.remove("math");

2.2 遍历

HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("twc", 25);
map.put("yq", 28);
Iterator it = map.entrySet().iterator();
while(it.hasNext()){Map.Entry<String, Integer> entry = (Map.Entry) it.next();System.out.print(entry.getKey() + " ");System.out.println(entry.getValue());
}

HeadFirstJava——14_数据结构相关推荐

  1. Java14-day05【集合(Collection常用方法-遍历、List特有方法、List集合子类特点、LinkedList集合的特有功能、ListIterator)】

    视频+资料(工程源码.笔记)[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg   提取码:zjxs] Java基础--学习笔记(零起点打开java ...

  2. 面试+学习+做项目+最全Java视频讲解

    关注公众号:计算机视觉与图形学实战 Java零基础教程视频(适合Java 0基础,Java初学入门) 尚硅谷Java零基础入门教程(含百道Java真题,2万多行Java代码实战) 黑马程序员全套Jav ...

  3. 数据结构学习笔记-郝斌

    课时 1.P1_什么叫做数据结构 全教程大纲: 1.数据结构的概述 推荐用书: 严蔚敏(考研选择)<数据结构> 吴伟民的<数据结构> 高一凡<数据结构>(有具体程序 ...

  4. 数据结构(08)— 线性单链表基本操作

    1. 线性单链表数据结构 // 假定每个结点的类型用 SNode 表示 typedef struct SNodeTag {int data; // 所存储的数据元素SNodeTag *next; // ...

  5. 数据结构(06)— 线性循环链表实战

    1. 循环链表定义 单链的循环链表结点的存储结构和单链表的存储结构一样, 所不同的是: 最后一个结点的 next 域指向头结点, 而不是"空".这样, 由表尾很容易找到表头. 但若 ...

  6. 数据结构(05)— 线性单链表实战

    1. 设计思路 本项目的实质是完成对考生信息的建立.查找.插入.修改.删除等功能,可以首先定义项目的数据结构,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运行结 ...

  7. 数据结构(04)— 线性顺序表实战

    1. 设计思路 本实战的实质是完成对学生成绩信息的建立.查找.插入.修改.删除等功能,可以首先定义项目的数据结构,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运 ...

  8. 数据结构(03)— 数据处理基本操作(数据的查找、新增、删除、修改)

    我们先来看一个关于查找的例子.查找,就是从复杂的数据结构中,找到满足某个条件的元素.通常可从以下两个方面来对数据进行查找操作:​ 根据元素的位置或索引来查找: 根据元素的数值特征来查找. 针对上述两种 ...

  9. 数据结构(02)— 时间复杂度与空间复杂度转换

    1. 时间复杂度转化为空间复杂度 常用的降低时间复杂度的方法有递归.二分法.排序算法.动态规划等,降低空间复杂度的核心思路就是,能用低复杂度的数据结构能解决问题,就千万不要用高复杂度的数据结构. ​ ...

  10. OpenCV 笔记(09)— 常用的数据结构和函数(Vec、Point、Scalar、Size、Rect、cvtColor)

    1. Vec 对象类型 Vec 是一个主要用于数值向量的模板类.我们可以定义向量的类型和组件的数量: Vec<double, 19> myVector 我们还可以使用任何的预定义类型: t ...

最新文章

  1. java map一对多映射_java – Mapstruct:将多个源对象映射到子对象
  2. PAT甲级1088 Rational Arithmetic:[C++题解]分数的加减乘除
  3. Java EE与NoSQL的未来
  4. 征服用计算机弹法,征服WIN7
  5. 计算机怎么会自动开机,Windows10系统电脑半夜会自动开机如何解决
  6. Windows学习总结(15)——Notepad++ 快捷键大全
  7. 【一分钟论文】IJCAI2019 | Self-attentive Biaffine Dependency Parsing
  8. arcpy 使用ListFields函数获取字段列表的名称、类型和长度
  9. android 修复工具,安卓手机修复工具下载 牛学长安卓手机修复工具(安卓手机修复助手) v2.4.0.15 官方免费安装版 下载-脚本之家...
  10. dell R740secure boot_凯诺 10月11日 DELL 电脑报价
  11. 前端上传组件Plupload使用指南
  12. 网站一键分享到新浪微博QQ空间腾讯微博
  13. 如何修复硬盘的分区表
  14. 只能吃土豆的牛牛(二进制枚举)
  15. 怎样提高自己的分析能力
  16. mongodb php auth,mongodb 3.0改变了authMechanism
  17. PDF怎么删除空白页,PDF删除空白页的方法
  18. vertica基本操作
  19. Tomcat安装及环境配置教程
  20. Pygame实战之外星人入侵NO.11——设置开始按钮

热门文章

  1. 光纤基础知识;接口类型、光模块、光纤种类、
  2. 计算机丢失d3d10,“怎样解决d3dx10_42.dll丢失造成的游戏打不开”的解决方案
  3. keil+c语言优化,KEIL编译器【C语言编译选项优化等级说明】
  4. SQL面试题:删除表中指定字段的重复数据,只保留最大的id数据
  5. matlab使用笔记(一)——matlab语言中if、for语句与C语言中的差别
  6. fanuc机器人码垛编程实例_FANUC 机器人码垛编程详细讲解,要收藏哦~
  7. MATLAB深度学习工具箱文档——trainingOptions函数的参数设置
  8. 推荐自用黑苹果Clover引导主题
  9. 官网下载mysql连接驱动jar包教程
  10. 二进制编辑和进程监控工具