collection的理解

集合框架collection

数组增删改的练习

为什么出现集合类?

面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,Java就提供了

集合类。

数组和集合类同是容器,有何不同?

数组虽然也可以存储对象,但长度是固定的;集合长度是可变的。数组中可以存储基本数据类

型,集合只能存储对象。

集合类的特点

集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。

集合与数组的区别

  • 长度
    • 数组长度固定
    • 集合长度可变
  • 内容
    • 数组存储同一类型元素
    • 集合存储不同类型元素
  • 元素类型
    • 数组可以存基本类型,也可以存引用类型
    • 集合只可以存引用类型

不同的集合类

  • 存储数据时会有不同的需求,比如要求多个元素中不能有相同的,比如要求多个元素按照某种要求自动排序。针对不同的需求,Java提供了不同的集合类,每个类的数据结构不同。虽然大家有不一样的地方,但是都是用来存储元素获取元素的,所有有共性。把共性提取出来,就形成了所谓的集合之间的继承体系

继承体系

  • collection
    在这里插入图片描述

Collection

所有代码连接

  1. 添加功能

    boolean add(Object obj):添加一个元素

    boolean addAll(Collection c):添加一个集合的元素

       //创建集合的对象
                  Collection collection=new ArrayList();
                  //增加值
                  collection.add(1);
                  collection.add("tom");
                  collection.add("456");
                  Collection collection1=new ArrayList();
                  collection1.add("789");
                  collection1.add("enen");
                  System.out.println(collection);
                  System.out.println(collection1);
                  //赋值整个集合于集合
                  collection.addAll(collection1);
                  System.out.println(collection);
    
  2. 删除功能

    void clear():移除所有元素

    boolean remove(Object o):移除一个元素

    boolean removeAll(Collection c):移除一个集合c的所有元素

              //全部删除
    //              collection1.clear();
    //              System.out.println(collection1);
              //删除值
              collection.remove("456");
              System.out.println(collection);
              //删除集合中的某个集合
              collection.removeAll(collection1);
              System.out.println(collection);
    
  3. 判断功能

    boolean contains(Object o):判断集合中是否包含指定的元素

    boolean containsAll (Coolection c):判断集合中是否包含指定的集合元素

    boolean isEmpty():判断集合是否为空

            //集合中是否包含指定元素
                  collection.contains(1);
                  System.out.println( collection.contains(1));
                  //集合中是否包含集合1
                  Collection collection2=new ArrayList();
                  collection2.add("bbh");
                  collection.containsAll(collection1);
                  System.out.println(collection.containsAll(collection1));
                  System.out.println(collection.containsAll(collection2));
                  //判断集合是否为空
                  Collection collection3=new ArrayList();
                  collection.isEmpty();
                  System.out.println(collection.isEmpty());
                  System.out.println(collection3.isEmpty());
    
  4. 获取功能

    Iterator iterator()(重点)

      Iterator iterator=collection1.iterator();
                  //判断下一行是否有值
                  while(iterator.hasNext()) {
                	  //输出值
                	  System.out.println(iterator.next());
                  }
                  //for 循环判断
                  for(;iterator.hasNext();) {
                	  System.out.println(iterator.next());
                  }
    

    写两行System.out.println(iterator.next())会报元素异常NosuchElementException

  5. 长度功能

    int size():元素的个数

    面试题:数组 没有length()方法,只有length属性,字符串有length()方法,集合没有length()方法,有size()方法。

       //集合长度
                  collection.size();
                  System.out.println(collection.size());
    
  6. 交集功能

    boolean retainAll(Collection c):

  Collection collection4=new ArrayList();
              System.out.println(collection);
              collection4.add(1);
              collection4.add("tom");
              collection4.add("哎呀");  
              System.out.println(collection4);
              System.out.println(collection.retainAll(collection4));    //true
              System.out.println(collection);       //[1,tom]

//代码顺序不能颠


  System.out.println();
              Collection collection5=new ArrayList();
              collection5.add(234);
              collection5.add("jerry");
              System.out.println(collection5);
              collection.retainAll(collection5);
              System.out.println(collection.retainAll(collection5));    //false
              System.out.println(collection);       //[]
  1. 把集合转换为数组

    Object[] toArray()

    //把集合转换为数组
              Collection collection6=new ArrayList();
              collection6.add(234);
              collection6.add(789);
              System.out.println(collection6);
               Object [] object= collection6.toArray();
              System.out.println(object[1]);
              //把数组转成集合
               int [] a= {12,6,9,8,7,6};
               Arrays.asList(a);
               System.out.println(Arrays.asList(a));

迭代器**(集合独有的遍历方式)**

  • while
  • for
  • 不要多次使用next
  • 原理(接口?类?源码解析)
 Iterator iterator=collection1.iterator();
              //判断下一行是否有值
              while(iterator.hasNext()) {
            	  //输出值
            	  System.out.println(iterator.next());
              }
              //for 循环判断
              for(;iterator.hasNext();) {
            	  System.out.println(iterator.next());
              }

写两行System.out.println(iterator.next())会报元素异常NosuchElementException

List

  • 有序的集合,允许重复元素存在

  • List集合的特有功能:

    1. 添加功能

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

  1. 获取功能

    Object get(int index):获取指定位置的元素

  2. 列表迭代器

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

  3. 删除功能

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

  4. 修改功能

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

//List
		java.util.List list = new ArrayList();
		list.add(123);
		//添加功能  在指定位置添加元素
		list.add(0, 456);
			System.out.println(list);
		//获取功能  获取指定位置的元素 	
			  //list可以获取下标的元素,collection不能
			System.out.println(list.get(0));
		//删除功能
		list.remove(0);
		//修改功能
		list.set(0, 896);
		//list 独有的迭代器
		ListIterator listiterator = list.listIterator();
		while (listiterator.hasNext()) {
			System.out.println(listiterator.next());
            //删除下标为二的元素
            //list.remove(2);  list中有三个元素,删除会触发并发异常 ConcurrentModificationException;
			}

常见数据结构

  • 数组:连续的存储空间----查询快,增删慢
  • 链表:不连续,中间用箭头指向
  • 队列: 先进先出
  • 栈: 先进后出
  • 堆:
  • 树: 二叉树 数字小的左边放,数字大的右边放
  • 图: 人物关系图Java的jvm运行机

子类

  • ArrayList:

​ 底层数据结构是数组,查询快,增删慢。

​ 线程不安全,效率高。

  • Vector:

​ 底层数据结构是数组,查询快,增删慢。

​ 线程安全,效率低。

  • LinkedList:

​ 底层数据结构是链表,查询慢,增删快。

​ 线程不安全,效率高。

LinkedList独有方法

  • 模拟栈操作

泛型

Arraylist<> list=new Arrayist<>();

< >为泛型

foreach循环

为for循环的加强版

for(元素数据类型 变量 :数组或者Collection集合){
使用变量即可,该变量就是元素
}
Arraylist<Integer> list=new Arrayist<Integer>();
for(Integer a:list){
system.out.println(a);
}
//循环前先判断是否为null

可变参数

定义方法时不知道定义多少个参数

修饰符 返回值类型 方法名 (数据类型... 变量名){}

注意:

  • 这里的变量是一个数组
  • 如果一个方法有可变参数,并且有多个参数,那么,可变参数肯定是最后一个
//main方法
change.(4,5,10,15,14,19);

public static int change(int a,int c,int...d) {
	System.out.println(a+c);        //9
	
	int sum=0;
	for(int i:d) {
		sum+=i;
		System.out.println(i);       //10,15,14,19
	}
	
	System.out.println(sum);     //10+15+14+19
	return sum;
}

set

无序(输出的顺序和插入的顺序不一样),不允许重复,重写hashcode和equals方法(先比较哈希值,譬如重地与通话哈希值一样,用equals方法比较内容)保证了元素的唯一性

  • hashset

    • 不保证顺序
    • 底层数据结构是哈希表
  • linkedhashset

    • 底层是哈希表加链表
    • 哈希表保证唯一性,链表保证有序
  • treeset

    • 可以排序
      • 使用元素自然排序排序
      • 使用Comparator
//HashSet
HashSet<String> set=new HashSet<>();
	set.add("123");
	set.add("456");
	set.add("678");
	set.add("123");
	set.add("sggb");
	set.add("rth");
	System.out.println(set);

//LinkedHashSet
Set<String> set=new LinkedHashSet<>();
	set.add("123");
	set.add("456");
	set.add("fdsag");
	set.add("456");
	for(String s:set) {
		System.out.println(s);     //123,456,fdsag
	}

//TreeSet
Set<String> set=new TreeSet<String>();
	set.add("123");
	set.add("789");
	set.add("234");
	set.add("456");
	set.add("456");
	for(String s:set) {
		System.out.println(s);    //123,234,456,789
	}

//获取十个二十以内的随机数,不重复
	Random random=new Random();
	Set<Integer> set1=new LinkedHashSet<>();
	while(set1.size()<10) {
		int a=random.nextInt(20)+1;
	set1.add(a);
		}System.out.println(set1);
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值