zoukankan      html  css  js  c++  java
  • 容器 集合知识点

    容器(Collection)
    数组是一种容器, 集合也是一种容器
    java编程中, 装其他各种各样的对象(引用类型)的一种东西, 叫容器

    (图书馆里所有的书, 要想管理图书馆里所有的书, 就需要先把这些书放到一个东西里面, 目前掌握的知识来说, 只能是数组, 数组的长度是固定的, 这就出现一个问题, 数组的长度该定义成多长 ? 长度是不固定的, 因为不知道有多少本书, 这个时候需要这样一种机制: 定义一种东西, 长度不固定, 可以随时添加和删除, 这种东西就是Collection, 只要不超出内存, 随便往里添加)

    Collection---接口:
    Set接口(不允许重复, 没有顺序)
    Set接口中的方法没有自己定义的, 全部都是继承自Collection
    *HashSet---实现类(以哈希码表为底层的实现机制)
    TreeSet---实现类(以二叉树(一种数据结构)为底层的实现机制)
    没有顺序, 不可以重复(可以互相equals就叫重复)
    List接口(可以重复, 有顺序)
    *ArrayList---实现类(以数组为底层的实现机制)
    查询速度快, 但是增删改效率低
    LinkedList---实现类(以链表为底层的实现机制)
    查询速度慢, 增删改的效率高
    有顺序, 可以重复

    Collection接口的使用
    Collection<String> c = new ArrayList<String>();
    问题:
    为什么不直接写ArrayList<String> a = new ArrayList<String>();
    c.add(参数类型必须是Object)

    c.remove方法: 通过判断两个对象是否互相的equals来确定是不是该删除该对象, 自定义的类, 需要自己重写父类的equals方法

    重写equals方法, 也应该重写hashCode方法

    hashCode通常用来做索引, 一个对象通过它的hashCode的值可以找到它在内存中的地址, 所以两个对象如果equals了, 而且又要作为索引的情况下, hashCode的值必须相等

    List接口:
    有顺序, 可以重复添加
    get
    set(有一个返回值要注意 !)
    add
    remove(int)
    remove(Object)
    indexOf
    lastIndexOf
    retainAll(Collection)----返回一个boolean值,
    当list的内容被改变的时候返回true, 否则返回false

    Set接口
    没有顺序, 但是不可以重复

    向容器中添加或删除一个数组。

    package test;
    
    import java.util.Arrays;
    
    public class MyArray {
        
        private Object[] objs = new Object[10];
        private int size;
        
        public void add(Object o) {
            if(size == objs.length) {
                Object[] otherObjs = Arrays.copyOf(objs, objs.length + 1);
                otherObjs[size] = o;
                objs = otherObjs;
            } else {
                objs[size] = o;
            }
            size++;
        }
    
        // {1,2,3,4,5,6,7,8,9,10}
        public void remove(int index) {
            Object[] o1 = new Object[index];
            Object[] o2 = new Object[objs.length - index - 1];
            
            for (int i = 0; i < o1.length; i++) {
                o1[i] = objs[i];
            }
            for (int i = 0; i < o2.length; i++) {
                o2[i] = objs[index + i + 1];
            }
            int count = 0;
            Object[] o3 = new Object[o1.length + o2.length];
            for (int i = 0; i < o1.length; i++) {
                o3[i] = o1[i];
                count++;
            }
            for (int i = 0; i < o2.length; i++) {
                o3[count] = o2[i];
                count++;
            }
            objs = o3;
            size--;
        }
        
        public int size() {
            return size;
        }
    
        @Override
        public String toString() {
            return "MyArray [objs=" + Arrays.toString(objs) + ", size=" + size + "]";
        }
        
        
    }
  • 相关阅读:
    [转载]NSDistributedNotificationCenter
    protobuf在IOS中的使用
    mac 下大dmg文件分割成多部分
    IOS 后台任务、多任务的理解2
    越狱iPhone、ipad通过网页安装ipa
    Android中的几种多线程实现
    Android多线程-AsyncTask异步任务
    2----IOS、Android数据存储方式
    Andriod 页面跳转传值
    svn 分支创建 合并
  • 原文地址:https://www.cnblogs.com/F9801/p/9027396.html
Copyright © 2011-2022 走看看