Java学习这么久,打算这几天回顾下java的基本知识点,首先是集合。

一、常用集合类关系图

Collection

  |___List  有序,可重复

    |___ArrayList   底层数据结构是数组,增删慢,查询快;线程不安全,效率高

    |___LinkedList   底层数据结构是链表,增删快,查询慢;线程不安全,效率高

    |___Vector    底层数据结构是数组,增删慢,查询快;线程安全,效率低

  |___Set  无序,不可重复

    |___HashSet

    |___TreeSet

Map

  |___HashMap

  |___TreeMap

二、集合两个问题(Why?Feature?)

1、Why?为什么使用集合?

java是一种面向对象语言,为了方便对对象的操作,所以使用了集合。

2、Feature?集合有什么特点?即它和数组的不同点。

集合:①存储不同引用类型对象 ②长度可变

数组:①存储相同数据类型(包括数据类型和引用类型) ②长度不可变

三、Collection概述

Collection的功能概述:
 1:添加功能

  1. boolean add(Object obj):添加一个元素
  2. boolean addAll(Collection c):添加一个集合的元素

2:删除功能

  1. void clear():移除所有元素
  2. boolean remove(Object o):移除一个元素
  3. boolean removeAll(Collection c):移除一个集合的元素(是一个还是所有) 注意:只要有一个元素被移除,就返回True

3:判断功能

  1. boolean contains(Object o):判断集合中是否包含指定的元素
  2. boolean containsAll(Collection c):判断集合中是否包含指定的集合元素(是一个还是所有) 注意:要包含所有的元素,返回True
  3. boolean isEmpty():判断集合是否为空

4:获取功能

  1. Iterator<E> iterator()(重点) 集合专用迭代器
  1. //创建集合
  2.  
  3. Collection c= new ArrayList();
  4.  
  5. //集合添加元素
  6.  
  7. c.add("Hello");
  8.  
  9. c.add("World");
  10.  
  11. //使用迭代器
  12.  
  13. Iterator it =c.iterator();
  14.  
  15. While(it.hasNext ()){
  16.  
  17.   String s =(String) it.next();
  18.  
  19.   System.out.println(s);
  20.  
  21. }
  1. //迭代器源码
  2. public interface Inteator {
  3. boolean hasNext();
  4. Object next();
  5. }
  6.  
  7. public interface Iterable {
  8. Iterator iterator();
  9. }
  10.  
  11. public interface Collection extends Iterable {
  12. Iterator iterator();
  13. }
  14.  
  15. public interface List extends Collection {
  16. Iterator iterator();
  17. }
  18.  
  19. public class ArrayList implements List {
  20. public Iterator iterator() {
  21. return new Itr();
  22. }
  23.  
  24. private class Itr implements Iterator {
  25. public boolean hasNext() {}
  26. public Object next(){}
  27. }
  28. }

5:长度功能

  1. int size():元素的个数

面试题:数组有没有length()方法呢?字符串有没有length()方法呢?集合有没有length()方法呢?

数组求长度用length属性

字符串求长度用length()方法

集合求长度用size()方法

6:交集功能

  1. boolean retainAll(Collection c)

两个集合都有的元素?思考元素去哪了,返回的boolean又是什么意思呢?

假设有两个集合A,B。
A对B做交集,最终的结果保存在A中,B不变。
返回值表示的是A是否发生过改变。

7:把集合转换为数组

  1. Object[] toArray()

集合转换成数组例子

  1. //创建集合对象
  2.  
  3. Collection c = new ArrayList();
  4.  
  5. //添加元素
  6.  
  7. c.add("Hello");
  8.  
  9. c.add("World");
  10.  
  11. //集合转换成数组
  12.  
  13. Object[] obj = c.toArray();
  14.  
  15. //遍历集合
  16.  
  17. for(int x =0;x<obj.length;x++){
  18.  
  19.   System.out.println(obj[x]);
  20.  
  21. }

四、Collection下List特有功能

A:添加功能

  1. void add(int index,Object element): 在指定位置添加元素

B:获取功能

  1. Object get(int index):获取指定位置的元素
  1. //List的特有遍历---普通for 遍历
  2. //创建对象
  3. List list = new ArrayList();
  4. //添加元素
  5. list.add("Hello");
  6. list.add("World");
  7. //普通for遍历
  8. for(int x=0;x<list.size();x++){
  9. String s=(String)list.get(x);
  10. System.out.println(s);
  11. }

C:列表迭代器

  1. ListIterator listIterator():List集合特有的迭代器

D:删除功能

  1. Object remove(int index):根据索引删除元素,返回被删除的元素

E:修改功能

  1. Object set(int index,Object element):根据索引修改元素,返回被修饰的元素

五、引入泛型

泛型是将类型明确工作推迟到对象创建或者方法调用的时候。

泛型的格式:<数据类型>  注意:此处的数据类型只能是引用类型。int----Integer

泛型的好处:

A.将运行期间的错误提前到编译期间

B.避免强制类型转换

  1. //创建集合对象加入泛型
  2. ArrayList<String> list = new ArrayList<String>()
  3. list.add("Hello");
  4. list.add("World");
  5. //使用迭代器
  6. Iterator<String> it = list.iterator();
  7. While(it.hasNext()){
  8. //使用泛型后不用进行类型强制转换
  9.   String s = list.next();
  10.   System.out.println(s);
  11. }

JDK7 新特性:泛型推断。

  1. ArrayList<Student> array = new ArrayList<>();

将泛型定义到类上

  1. public class ObjectTool<T> {
  2. private T obj;
  3.  
  4. public T getObj() {
  5. return obj;
  6. }
  7.  
  8. public void setObj(T obj) {
  9. this.obj = obj;
  10. }
  11. }

将泛型定义到方法上

  1. public class ObjectTool {
  2. public <T> void show(T t) {
  3. System.out.println(t);
  4. }
  5. }

将泛型定义到接口上

  1. public interface Inter<T> {
  2. public abstract void show(T t);
  3. }

高级通配符

  1. <?>:任意类型,没有指定就是Object类型
  2. <? extends E>:向下限定,E及其子类
  3. <? super E>:向上限定,E及其父类
  1. class Animal{}
  2. class Dog extends Animal{}
  3. class Cat extends Animal{}
  4.  
  5. Collection<?> c = new ArrayList<Animal>();
  6. Collection<?> c = new ArrayList<Dog>();
  7. Collection<?> c= new ArrayList<Cat>();
  8.  
  9. Collection<? extends Animal> c =new ArrayList<Animal>();
  10. Collection<? extends Animal> c =new ArrayList<Dog>();
  11. Collection<? extends Animal> c = new ArrayList<Cat>();
  12.  
  13. Collection<? super Animal> c =new ArrayList<Animal>;
  14. Collection<? super Animal> c = new ArrayList<Object>;

六、JDK 5 新特性

增强for遍历集合

格式:

  1. for(数据类型 变量名:遍历的集合或数组名){
  2.  
  3. }

好处:简化了数组和集合的遍历方式。

缺点:需要遍历的集合或数组不能为空。

      解决方案:遍历之前做if判断。

  1. ArrayList<String> list = null;
  2. if(list!=null){
  3. for(String s :list){
  4. System.out.println(s);
  5. }
  6. }

至此List有三种遍历方式

  1. //创建集合对象
  2. ArrayList<String> list = new ArrayList<String>();
  3. list.add("Hello");
  4. list.add("World");
  5. //第一种:迭代器遍历
  6. Iterator<String> it =list.iterator();
  7. While(it.hasNext()){
  8. String s = list.next();
  9. System.out.println(s);
  10. }
  11.  
  12. //第二种:普通for遍历
  13. for(int x=0;x<list.size();x++){
  14. String s = list.get(x);
  15. System.out.println(s);
  16. }
  17.  
  18. //第三种:增强for遍历
  19. for(String s :list){
  20. System.out.println(s);
  21. }

静态导入

import static 包名.类名.方法名
可以直接导入到方法

注意事项:①方法必须是静态的。②导入时有多个同名的静态方法,使用时必须要加前缀(包名.类名.方法名)

可变参数

如果一个方法的参数不固定,那么我们可以使用可变参数。

格式:

  1. 修饰符 返回值类型 方法名(数据类型... 变量名){
  2.  
  3. }
  4. //注意:这里的...不是省略号
  5.  
  6. 例如:设计一个求和方法,传入的参数数量未知
  7.  
  8. public int sum(int...a){
  9. int sum =0;
  10. for(int i :a){
  11. sum+=i;
  12. }
  13. return sum;
  14. }

注意:①这里的变量实际上是一个数组,所以可以使用增强for遍历。

   ②如果一个方法除了可变参数还有别的参数,那么可变参数一定要放到参数的最后。

数组转集合     

  1. public static <T> List<T> asList(T... a):把数组转成集合
  2.  
  3. List<String> list = Arrays.asList("hello","World","Java");

注意:虽然数组可以转成集合,但是这个集合的长度不可变,固定

七、List下ArrayList、Vector、LinkedList特有功能

  1. //Vector特有功能
  2.  
  3. //添加功能
  4. public void addElement(Object obj) --------add()
  5.  
  6. //获取功能
  7. public Object elementAt(int index) -------- get()
  8. public Enumeration elements() --------Iterator iterator()
  9. boolean hasMoreElements() --------hasNext()
  10. Object nextElement() --------next()
  1. //LinkedList的特有功能:
  2.  
  3. //添加功能
  4. public void addFirst(Object e)
  5. public void addLast(Object e)
  6.  
  7. //获取功能
  8. public Object getFirst()
  9. public Obejct getLast()
  10.  
  11. //删除功能
  12. public Object removeFirst()
  13. public Object removeLast()

八、collection下set概述

set是一个元素无序且唯一的集合

HashSet:

HashSet为何存储元素是唯一的呢?

原因:HashSet底层依靠的是hashCode()和equals()方法。

先比较hashCode(),如果相同继续比较equals(),equals()返回true说明元素重复,返回false则添加进集合

HashSet 的add()源码:

  1. interface Collection {
  2. ...
  3. }
  4.  
  5. interface Set extends Collection {
  6. ...
  7. }
  8.  
  9. class HashSet implements Set {
  10. private static final Object PRESENT = new Object();
  11. private transient HashMap<E,Object> map;
  12.  
  13. public HashSet() {
  14. map = new HashMap<>();
  15. }
  16.  
  17. public boolean add(E e) { //e=hello,world
  18. return map.put(e, PRESENT)==null;
  19. }
  20. }
  21.  
  22. class HashMap implements Map {
  23. public V put(K key, V value) { //key=e=hello,world
  24.  
  25. //看哈希表是否为空,如果空,就开辟空间
  26. if (table == EMPTY_TABLE) {
  27. inflateTable(threshold);
  28. }
  29.  
  30. //判断对象是否为null
  31. if (key == null)
  32. return putForNullKey(value);
  33.  
  34. //和对象的hashCode()方法相关
  35. int hash = hash(key);
  36.  
  37. //在哈希表中查找hash值
  38. int i = indexFor(hash, table.length);
  39. for (Entry<K,V> e = table[i]; e != null; e = e.next) {
  40. //这次的e其实是第一次的world
  41. Object k;
  42. if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
  43. V oldValue = e.value;
  44. e.value = value;
  45. e.recordAccess(this);
  46. return oldValue;
  47. //走这里其实是没有添加元素
  48. }
  49. }
  50.  
  51. modCount++;
  52. addEntry(hash, key, value, i); //把元素添加
  53. return null;
  54. }
  55.  
  56. transient int hashSeed = 0;
  57.  
  58. final int hash(Object k) { //k=key=e=hello,
  59. int h = hashSeed;
  60. if (0 != h && k instanceof String) {
  61. return sun.misc.Hashing.stringHash32((String) k);
  62. }
  63.  
  64. h ^= k.hashCode(); //这里调用的是对象的hashCode()方法
  65.  
  66. // This function ensures that hashCodes that differ only by
  67. // constant multiples at each bit position have a bounded
  68. // number of collisions (approximately 8 at default load factor).
  69. h ^= (h >>> 20) ^ (h >>> 12);
  70. return h ^ (h >>> 7) ^ (h >>> 4);
  71. }
  72. }
  73.  
  74. hs.add("hello");
  75. hs.add("world");
  76. hs.add("java");
  77. hs.add("world");

LinkedHashSet:

存储元素有序且唯一。

HashSet保证其存储元素唯一;Linked保证其存储元素有序(输入和输出元素有序)

TreeSet:

能够对元素按照某种规律进行排序;

A 自然排序,如果没有指定,则从小到大排序。

让元素所属的类实现自然排序接口 Comparable,重写接口中compareTo ()方法。

B 比较器排序。

让集合的构造方法接收一个比较器接口的子类对象 Comparator,此时可以使用匿名内部类方法实现排序。

  1. //实现比较器排序的局部代码
  2. TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
  3. @Override
  4. public int compare(Student s1, Student s2) {
  5. // 姓名长度
  6. int num = s1.getName().length() - s2.getName().length();
  7. // 姓名内容
  8. int num2 = num == 0 ? s1.getName().compareTo(s2.getName())
  9. : num;
  10. // 年龄
  11. int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2;
  12. return num3;
  13. }
  14. });

Java集合之Collection与之子类回顾的更多相关文章

  1. Java集合框架Collection

    转自:http://www.cdtarena.com/javapx/201306/8891.html [plain] view plaincopyprint?01.在 Java2中,有一套设计优良的接 ...

  2. -1-3 java集合框架基础 java集合体系结构 Collection 常用java集合框架 如何选择集合 迭代器 泛型 通配符概念 Properties 集合 迭代器

    集合又称之为容器存储对象的一种方式 •数组虽然也可以存储对象,但长度是固定的:显然需要可变长度的容器 集合和数组的区别?                 A:长度区别                  ...

  3. Java | 集合(Collection)和迭代器(Iterator)

    集合(Collection) 集合就是Java中提供的一种 空器,可以用来存储多个数据. 集合和数组都是一个容器,它们有什么区别呢? 数组的长度是固定的,集合的长度是可变的. 数组中存储的是同一类型的 ...

  4. java集合 之 Collection和Iterator接口

    Collection是List,Queue和Set接口的父接口,该接口里定义的方法即可用于操作Set集合,也可以用于List和Queue集合.Collection接口里定义了如下操作元素的方法. bo ...

  5. Java集合之Collection接口

    java的集合分为三大接口,分别是Collection,Map,Iterator,集合接口和类在java.util包中,此次主要介绍三大接口之一的Collection接口. 一些Collection允 ...

  6. Java集合之Collection

    Java集合是java提供的工具包,包含了常用的数据结构:集合.链表.队列.栈.数组.映射等.Java集合工具包位置是java.util.* Java集合主要可以划分为4个部分:List列表.Set集 ...

  7. Java集合(Collection)综述

    1.集合简介 数学定义:一般地,我们把研究对象统称为元素.把一些元素组成的总体叫做集合. java集合定义:集合就是一个放数据的容器,准确的说是放数据对象引用的容器. java中通用集合类存放于jav ...

  8. java集合框架collection(6)继承结构图

    根据<java编程思想>里面的说法,java集合又叫容器,按照单槽和双槽分为两类,Collection和Map,这两个都是接口. 一.Collection Collection下面又分了三 ...

  9. 《Java基础知识》Java集合(Collection)

    作为一个Developer,Java集合类是我们在工作中运用最多的.最频繁的类.相比于数组(Array)来说,集合类的长度可变,更加适合于现代开发需求: Java集合就像一个容器,可以存储任何类型的数 ...

随机推荐

  1. Maximum Subarray - LeetCode

    目录 题目链接 注意点 解法 小结 题目链接 Maximum Subarray - LeetCode 注意点 最大值有可能是正负数交替着出现 解法 解法一:一次遍历即可.当sum小于0的时候就重新开始 ...

  2. 【bzoj4540】 Hnoi2016—序列

    http://www.lydsy.com/JudgeOnline/problem.php?id=4540 (题目链接) 题意 给出$n$个数的序列,$m$个询问,每次询问一段区间$[l,r]$,问$[ ...

  3. 解题:POI 2008 Station

    题面 水水的换根裸题,不过以前还真没做过换根的题 换根的思想就是在DFS中利用树的信息更新出当前点为根时的信息,具体来说一般是考虑子树外和子树内两部分 每个点的答案$ans$就是$ans[fa]+n- ...

  4. Tensorflow Object_Detection 目标检测 笔记

    Tensorflow models Code:https://github.com/tensorflow/models 编写时间:2017.7 记录在使用Object_Detection 中遇到的问题 ...

  5. Python【requests】第三方模块

    import requests print("===============get请求================")url = 'http://api.nnzhp.cn/ap ...

  6. Window10+Python3.5安装opencv

    Window10+Python3.5安装opencv 标签: opencvpython 2017-05-14 16:47 2201人阅读 评论(0) 收藏 举报  分类: Python编程(41)  ...

  7. html5 +css3 点击后水波纹扩散效果 兼容移动端

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  8. PHP数组的遍历

    对于012345...这样的数组可以用for进行遍历 $arr=array('a','b','c','d','e'); for($key=0;$key<count($arr);$key++){ ...

  9. A Gentle Guide to Machine Learning

    A Gentle Guide to Machine Learning Machine Learning is a subfield within Artificial Intelligence tha ...

  10. jdk1.8.0_45源码解读——LinkedList的实现

    jdk1.8.0_45源码解读——LinkedList的实现 一.LinkedList概述 LinkedList是List和Deque接口的双向链表的实现.实现了所有可选列表操作,并允许包括null值 ...