java集合框架01

List 接口存储一组不唯一(可以重复),有序(插入顺序)的对象

01. ArrayList实现了长度可变的数组,在内存中分配连续的空间。遍历元素和随机访问元素的效率比较高

通过看ArrayList的源码得知:

 /**
     * Constructs an empty list with an initial capacity of ten.
           构造一个初始容量为十的空列表
     */
    public ArrayList() {
    this(10);  调用带参的构造 参数为10
    }

ArrayList创建的时候,数组初始化长度为10!

List list=new ArrayList(-1);     这句话会运行错误! 看源码得知!

  /**
     * Constructs an empty list with the specified initial capacity.
     *
     * @param   initialCapacity   the initial capacity of the list
     * @exception IllegalArgumentException if the specified initial capacity
     *            is negative
     */
    public ArrayList(int initialCapacity) {
    super();
        if (initialCapacity < 0)  //参数小于0!会抛出异常信息
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
    this.elementData = new Object[initialCapacity];
    }

List list=new ArrayList();   //初始化长度为10

list.add(1);

.....

list.add(11);   //这时候集合会自动扩容!返回一个新的数组长度 =原数组的长度*1.5+1

看源码得知!

 public void ensureCapacity(int minCapacity) {
    modCount++;
    int oldCapacity = elementData.length;
    if (minCapacity > oldCapacity) {
        Object oldData[] = elementData;
        int newCapacity = (oldCapacity * 3)/2 + 1;
            if (newCapacity < minCapacity)
        newCapacity = minCapacity;
            // minCapacity is usually close to size, so this is a win:
            elementData = Arrays.copyOf(elementData, newCapacity);
    }
    }

创建一个新闻实体类

public class News {
    private int id;  //新闻编号
    private String title;  //新闻标题

    @Override
    public String toString() {
        return "新闻 [编号=" + id + ", 标题=" + title + "]";
    }

    public News() { //无参构造
        super();
    }
    public News(int id, String title) { //带参构造
        super();
        this.id = id;
        this.title = title;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }

    public static void main(String[] args) {
        News news=new News();
        /*
         * 直接输出对象 默认走Object类中的toString()
         * News类中重写了这个toString() 就会走本类的!
         */
        System.out.println(news);
    }
}

创建测试类

public class ArrayListTest {

    public static void main(String[] args) {

        List nums=new ArrayList();
        nums.add(1);
        nums.add(1);
        nums.add(1);
        nums.add(1);
        System.out.println(nums.size());

        /*
         * 创建一个ArrayList集合
         * 存储不唯一(允许重复),有序的数据!
         * ArrayList是实现了可变大小的数组!
         * 随机访问和遍历的效率高!
         */
        List list=new ArrayList();
        //往集合中添加 元素(新闻对象)
        News news1=new News(1, "新闻1");
        News news2=new News(2, "新闻2");
        News news3=new News(3, "新闻3");
        list.add(news1);
        list.add(news2);
        list.add(news3);
        //01.打印出集合的长度
        System.out.println("新闻集合的大小:"+list.size());
        //02.查询下标为2的新闻信息
        System.out.println(list.get(2));
        //03.删除下标为1的新闻
        list.remove(1);
        //04.通过对象删除
        list.remove(news3);
        //05.查询集合中是否包含news3
        System.out.println("是否包含news3===>"+list.contains(news3));
        //新增加一个对象
        list.add(new News(4, "新闻4"));
        //06.在指定的位置新增一个对象
        list.add(0, new News(5,"新闻5"));
        System.out.println("*************************");
        //打印新闻的标题
        for (int i = 0; i < list.size(); i++) {
            /*
             * 根据集合的下标获取新闻的信息
             * get(int index)返回值是Object
             * 必须向下转型为News
             */
            News news=(News) list.get(i);
            System.out.println(news.getTitle());
        }
        System.out.println("*************************");
        //07.把集合转换成数组
        Object[] array = list.toArray();
        for (int i = 0; i < array.length; i++) {
            News news=(News) array[i];
            System.out.println("新闻的标题是:"+news.getTitle());
        }
        System.out.println("*************************");
        //08.通过for加强进行遍历
        for (Object object : list) {
            News news=(News) object;
            System.out.println("新闻的标题是:"+news.getTitle());
        }
        System.out.println("*************************");
        /*
         * 09.通过迭代器iterator接口
         *      001.next():获取序列中的下一个元素
         *      002.hasNext():检查序列中是否还有元素
         *      003.remove():删除元素
         */
        Iterator it = list.iterator();
          //判断集合中是否有下一个元素
        while(it.hasNext()){
            News news=(News) it.next();
            System.out.println("新闻的标题是:"+news.getTitle());
        }
        //10.清空整个集合
        list.clear();
        //11.判断集合是否为空
        System.out.println("集合是否为空==>"+list.isEmpty());
        System.out.println(list.size());  //  0
    }
}

02.LinkedList:采用链表存储方式。插入、删除元素时效率比较高

public class LinkedListTest {

    public static void main(String[] args) {
        //创建一个LinkedList集合
        LinkedList list=new LinkedList();
        //创建几个新闻对象
        News news1=new News(1, "新闻1");
        News news2=new News(2, "新闻2");
        News news3=new News(3, "新闻3");
        News news4=new News(4, "新闻4");
        //新增数据
        list.add(news1); //在一个位置
        list.addFirst(news2); //news2会顶替news1在集合中的位置  news1位于第2位
        list.addLast(news4); //news4在第三个位置
        list.add(news3);  //第4个位置
        //遍历整个集合
        for (Object object : list) {
            News news=(News) object; //转换成新闻对象才能调用对应方法
            System.out.println("新闻的标题:"+news.getTitle());
        }
        //通过indexOf(Object o) 获取对象在集合中的下标
        int index=list.indexOf(news4);
        list.remove(index);//根据下标删除对象
        //看是否还包含news4
        System.out.println("是否还包含news4==>"+list.contains(news4));
        //删除集合中的第一个元素
        list.removeFirst();
        for (Object object : list) {
            System.out.println(object); //不需要强制类型转换  默认走的是重写之后的toString()
        }
        //获取集合中的第一个元素
        News news=(News) list.getFirst();
        System.out.println("第一个元素的新闻标题:"+news.getTitle());
        //获取集合中的最后一个元素
        News newsz=(News) list.getLast();
        System.out.println("最后一个元素的新闻标题:"+newsz.getTitle());
    }
}                     

ArrayList和LinkedList的区别

/*
         * ArrayList和LinkedList的区别
         * ArrayList:采用数组的形式来保存数据!这些数据被放在内存中开辟连续的空间!
         *           每个数据的位置都有下标!
         *           比如说:
         *           现在集合长度为50! 现在想删除下标为2的元素!
         *           删除之后,底层还要做什么操作?
         *           下标为2之后的元素都要前移??
         *
         *           现在想在下标为3的位置 新增 元素!
         *           下标3的元素之后的数据全部后移??
         *           所以 新增,删除效率慢!
         *           因为是数组结构,所以遍历,查询效率高!
         *
         * LinkedList:链表式结构!存储在集合中的每个对象都存放在相互独立的空间!
         *            比如说:
         *             现在集合长度为50!
         *             第1个元素记录第2个元素的位置
         *             第2个元素记录第3个元素的位置
         *             。。。。
         *             第49个元素记录第50个元素的位置
         *             我们想删除第3个元素!
         *             只需要让 第2个元素记录第4个元素的位置!
         *             之后的元素有影响吗?  没有
         *
         *             在第2个元素和第3个元素之间新增一个元素x
         *             这时候只需要 第2个元素 记录x的位置
         *             x记录第三个元素的位置
         *             新增,删除效率高!
         *             因为没有下标,所以查询遍历的效率低!
         *
         */

set集合

public class SetTest {
    public static void main(String[] args) {
        /*
         * Set接口存储的是唯一(不能重复),无序(新增,删除,查询)对象的集合!
         * HashSet是Set常用的实现类
         * Set存放的是对象的引用
         */
        //创建一个Set集合
        Set s=new HashSet();
        //给集合赋值
        s.add("");    //空串
        s.add(null);  //空值
        s.add(new String("abc"));
        System.out.println(s.size());  // 3

        Set set=new HashSet();
        set.add(new News(1, "新闻1"));
        set.add(new News(2, "新闻2"));
        set.add(new News(3, "新闻3"));
        System.out.println(set.size()); //3
        for (Object object : set) {
            System.out.println(object);
        }

        Set set1=new HashSet();
        set1.add(new String("abc"));
        set1.add(new String("abc"));
        set1.add(new String("abc"));
        System.out.println(set1.size()); //1

        String  a ="abc";
        String  b =new String("abc");
        String  c =new String("abc");
        System.out.println(a==b);  //false
        System.out.println(c==b); //false
        //具有相同内容的String对象,hashCode是一致的!
        System.out.println(b.hashCode()==c.hashCode());  //T

        String str1="a";
        String str2=new String("a");
        System.out.println(str1==str2); //false  内存地址不一样
        System.out.println(str1.equals(str2)); //true  内容一样
        System.out.println(str1.hashCode()==str2.hashCode()); //T
    }
}
public class TreeTest {
    public static void main(String[] args) {
        /*
         * 1. HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的,只不过Set用的只是Map的key
         * 2. Map的key和Set都有一个共同的特性就是集合的唯一性.TreeMap更是多了一个排序的功能.
         * 3. hashCode和equal()是HashMap用的, 因为无需排序所以只需要关注定位和唯一性即可.
         * 4. 由于TreeMap需要排序,所以需要一个Comparator为键值进行大小比较.
         */
        Set set1=new HashSet();
        set1.add("z");
        set1.add("a");
        set1.add("y");
        set1.add("b");
        for (Object object : set1) {
            System.out.println(object);
        }

        System.out.println("*******************");
        TreeSet set2=new TreeSet();  //自动排序
        set2.add("z");
        set2.add("a");
        set2.add("y");
        set2.add("b");
        for (Object object : set2) {
            System.out.println(object);
        }
    }
}

map集合

public class MapTest {
    public static void main(String[] args) {
        /*
         * Map 是一个键值对的集合 有  key和 value
         * 通过key拿到value的值
         * Set中的add()默认底层走的是Map的put()
         * 所以key是不允许重复的!
         * 也是先判断对象的hashCode,之后equals比较!
         */
        Map m=new HashMap();
        m.put("1", "嘘");
        m.put("1", "嘘");
        m.put("1", "嘘");
        m.put(new String("1"), "嘘");
        System.out.println(m.size()); // 1
        System.out.println("*************************");

        /*
         * 在集合中  不存在 基本数据类型
         * 基本数据类型不是类!
         * 只能使用基本数据类型的封装类!
         */
        Map map=new HashMap();
        News news3=new News(3, "新闻3");
        //向集合中增加数据
        map.put("1", new News(1, "新闻1"));  //这里的  "1" 是String
        map.put(2, new News(2, "新闻2"));   //这里的2  是    Interger
        map.put(3, news3);
        map.put(4, new News(4, "新闻4"));
        System.out.println("集合的大小:"+map.size());   // 4
        //通过map集合中的key取得对应的value
        News  news = (News) map.get("1");
        System.out.println(news);
        //根据key删除指定的对象
        System.out.println("删除的返回值:"+map.remove(4));
        //判断是否存在某个key
        System.out.println("是否有某个key:"+map.containsKey(4));
        //判断是否存在某个value
        System.out.println("是否有某个value:"+map.containsValue(news3));
        //得到所有key的集合
        Set keySet = map.keySet();
        for (Object object : keySet) {
            System.out.println(object);
        }
        //返回所有values的集合
        Collection values = map.values();
        for (Object object : values) {
            System.out.println(object);
        }
    }
}
时间: 2024-10-11 00:28:05

java集合框架01的相关文章

java集合框架01——总体框架一览

java集合框架是java提供的工具包,在java.util.*中,这个包中包含了常用的数据结构:集合.数组.链表.栈.队列.映射等.java集合框架主要可以分为四个部分:List列表.Set集合.Map映射和工具类(Iterator迭代器.Enumeration枚举类.Arrays和Collections). java集合框架示意图如下: 从图中可以看出,java中集合框架有两条分支:Collection和Map. 1. Collection是一个接口,它包含了集合的基本操作和属性.Colle

Java 集合系列 01 总体框架

java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例 Java集合是java提供的工具包,包含了常用的数据结构:集合.链表.队列.栈.数组.映射等.Java集合工具包位置是java.util.*Java集合主要可以划分为4个部分:List列表.Set集合.Map映射.工具类(Itera

黑马程序员------Java集合框架学习总结

Java培训.Android培训.iOS培训..Net培训.期待您的交流 一.综述 所有集合类都位于java.util包下.集合中只能保存对象(保存对象的引用变量).(数组既可以保存基本类型的数据也可以保存对象). Java的集合类主要由两个接口派生而出:Collection和Map,Collection和Map是Java集合框架的根接口,这两个接口又包含了一些接口或实现类. 二.Collection接口 Collction: List:有序(元素存入集合的顺序和取出的顺序一致),元素都有索引.

Java集合框架中隐藏的设计套路

我们的世界不应该只有"胡萝卜" 进入正题之前容我先扯点别的. 最近突然想到了一个驴子和胡萝卜不得不说的故事.说是一个人坐在驴子背上,用一根长杆绑着一根胡萝卜,然后把胡萝卜悬到驴子的面前,驴子以为只要向前走一步就可以吃到胡萝卜,于是不停地向前走,可是它始终无法吃到这根萝卜. 一千个读者就有一千个哈姆雷特,当然不同的人对这个故事也会有不同的理解.比如我们为了生活拼命地工作,却永远达不到财务自由,我们是不是也像一只忙碌的"驴子"呢? 所以,我们的世界不应该只有"

黑马程序员---Java集合框架

---------------------- Android开发.java培训.期待与您交流! ---------------------- Java集合框架 集合我们都知道是用来储存对象的容器,那之前的数组不也可以储存对象么,为什么要出现集合呢? 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,然而集合类中提供很多方便操作对象存储的方法,要比数组更容易操作对象,而且集合的长度是可变的,然而数组长度确实固定不变的,这样不利于对对象的间隔储存.  数组和集

Java—集合框架List

集合的概念 现实生活中:很多的事物凑在一起 数学中的集合:具有共同属性的事物的总和 Java中的集合类:是一种工具类,就像是容器,存储任意数量的具有共同属性的对象 集合的作用 在类的内部,对数据进行组织(针对作用与意义一样的属性,将他们放到一个集合中) 简单而快速的搜索大数量的条目 有的集合接口,提供了一系列排列有序的元素,并且可以在序列中快速的插入或删除有关元素 有的集合接口,提供了映射关系,可以通过关键字(key)去快速查找到对应的唯一对象,而这个关键字可以是任意类型 与数组相比 数组的长度

《深入理解Java集合框架》系列文章

Introduction 关于C++标准模板库(Standard Template Library, STL)的书籍和资料有很多,关于Java集合框架(Java Collections Framework, JCF)的资料却很少,甚至很难找到一本专门介绍它的书籍,这给Java学习者们带来不小的麻烦.我深深的不解其中的原因.虽然JCF设计参考了STL,但其定位不是Java版的STL,而是要实现一个精简紧凑的容器框架,对STL的介绍自然不能替代对JCF的介绍. 本系列文章主要从数据结构和算法层面分析

JAVA集合框架

收藏 查看我的收藏 146有用+1 56 编辑 Java,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总称.用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力:跨平台.动态的Web.Internet计算.从此,Java被广泛接受并推动了Web的迅速发展,常用的浏览器现在均支持Java applet.集合框架是为表示和操作集合而规定的一种统一的标准的体系结构.任何集合框架都包含三大块内容:对外的接口.接口的实

我所理解Java集合框架的部分的使用(Collection和Map)

所谓集合,就是和数组类似--一组数据.java中提供了一些处理集合数据的类和接口,以供我们使用. 由于数组的长度固定,处理不定数量的数据比较麻烦,于是就有了集合. 以下是java集合框架(短虚线表示接口,长虚线表示抽象类,实线表示类,箭头表示实现接口或者继承)(在网络上找的图,不知道原作者,侵权请联系我删除)(总之,关系很复杂,所以不用记得这个图,只是用来吓吓人而已的). 下面贴上个人理解之精简版之Collection(集)和Map(地图?暂且这么理解吧),话说思维导图蛮好用,以下是两幅思维导图