day10-集合框架-对象数组的概述与引用

1 集合框架的简单介绍:

  • A:集合的由来

    • 数组长度是固定,当添加的元素超过了数组的长度时需要对数组重新定义,太麻烦,java内部给我们提供了集合类,能存储任意对象,长度是可以改变的,随着元素的增加而增加,随着元素的减少而减少
  • B:数组和集合的区别
    • 区别1 :

      • 数组既可以存储基本数据类型,又可以存储引用数据类型,基本数据类型存储的是值,引用数据类型存储的是地址值
      • 集合只能存储引用数据类型(对象)集合中也可以存储基本数据类型,但是在存储的时候会自动装箱变成对象
    • 区别2:
      • 数组长度是固定的,不能自动增长
      • 集合的长度的是可变的,可以根据元素的增加而增长
  • C:数组和集合什么时候用
    * 1,如果元素个数是固定的推荐用数组
    * 2,如果元素个数不是固定的推荐用集合

2 Collection集合的基本功能测试

  • A:案例演示

  • 基本功能演示

    boolean add(E e)
    boolean remove(Object o)
    void clear()
    boolean contains(Object o)
    boolean isEmpty()
    int size()

/*
boolean add(E e) 添加
boolean addAll(E e) 添加一个对象
boolean remove(Object o) 删除
void clear() 清空该容器中所有对象
boolean contains(Object o) 判断集合里是否包含指定元素
boolean isEmpty() //判断集合是否为空
int size() 返回集合容器大小
*/ import java.util.ArrayList;
import java.util.Collection;
class DemoCollection {
public static void main(String[] args) {
//Collection c=new Collection();不能这样写,因为Collection是接口,抽象的
Collection c=new ArrayList();
System.out.println(c.add(100)); //添加内容可以为任意对象
System.out.println(c.add("50"));
Collection c0=new ArrayList();
System.out.println(c0.add(c)); //将c添加到c0里
System.out.println(c.remove("a")); //c对象中并没有字符串a
System.out.println(c.remove(100)); //将100从c对象中删除
c.clear(); //清空
System.out.println(c);
System.out.println(c.isEmpty()); //判断是否为空 Collection c1=new ArrayList();
c1.add(100);
c1.add("50");
System.out.println(c1.contains(100)); //判断100是否包含在c1对象里
System.out.println(c1.isEmpty());
int i=c1.size(); //返回集合容器大小
System.out.println(i);
}
}
/*
运行结果:
true
true
true
false
true
[]
true
true
false
2
*/
复制代码
    • B:注意:
  • collectionXxx.java使用了未经检查或不安全的操作.
    注意:要了解详细信息,请使用 -Xlint:unchecked重新编译.
    java编译器认为该程序存在安全隐患
    温馨提示:这不是编译失败,所以先不用理会,等学了泛型你就知道了

3 toArray集合转换为数组

package com.hui;

public class Student {
private String name; //私有化成员变量,只在本类中有效
private int age;
public Student() {} //空参构造函数
public Student(String name,int age) { //有参构造函数
this.name=name; //将参数赋值于局部变量
this.age=age;
}
public void setName(String name) { //设置年龄
this.name=name;
}
public String getName() { //获取年龄
return name;
}
public void setAge(int age) { //设置姓名
this.age=age;
}
public int getAge() { //获取姓名
return age;
}
public String toString() {
return "姓名:"+name+" 年龄:"+age;
}
} /*
* 把集合转成数组,可以实现集合的遍历
* toArray()
*/
package com.kai;
import java.util.Collection;
import java.util.ArrayList;
import com.hui.Student;
class DemoToArray {
public static void main(String[] args) {
Collection c=new ArrayList(); //父类引用指向子类对象
c.add(new Student("小红",20)); //添加对象
c.add(new Student("小兰",21));
c.add(new Student("小花",22));
c.add(new Student("小黑",23));
/*
解释:
c.add(new Student("小红",20));
add(E e)里的E指的是Object,所以这里相当于
Object o=new Student("小红",20)
此处的("小红",20)已经向上转型为了Object型
*/
Object[] arr=c.toArray(); //将集合转成数组
for(int i=0;i<arr.length;i++) {
Student s=(Student)arr[i]; //arr[i]为Object类型,必须向下Student转型
System.out.println(s.toString()); //toString()可以省略不写
}
}
}
复制代码

4 Collection的all系列

/*
boolean addAll(Collection c) 添加对象
boolean removeAll(Collection c) 删除的是两个集合的交集,只要有交集就返回true,无交集flase
boolean containsAll(Collection c) 判断调用的集合是否包含传入的集合
boolean retainAll(Collection c) 取交集,如果调用的集合改变就返回true,如果调用的集合不变就返回false
*/ import java.util.ArrayList;
import java.util.Collection;
class DemoCollectionAll {
public static void main(String[] args) {
Collection c=new ArrayList();
c.add("a");
c.add("b");
c.add("c");
c.add("d");
Collection c1=new ArrayList();
c1.add("e");
c1.add("f");
System.out.println(c.addAll(c1)); //将对象c1添加到对象c中
System.out.println(c.containsAll(c1)); //判断调用的集合是否包含传入的集合
Collection c2=new ArrayList();
c2.add("a");
c2.add("m");
System.out.println(c.addAll(c2)); //删除的是两个集合的交集,只要有交集就返回true,无交集flase Collection c3=new ArrayList();
c3.add("abcd");
Collection c4=new ArrayList();
c4.add("ab");
System.out.println(c3.retainAll(c4));
/*
取c3与c4的交集,为ab,然后拿着交集和c3比较,不一样返回true
*/
Collection c5=new ArrayList();
c5.add("abcdef");
System.out.println(c3.retainAll(c5));
/*
取c3与c5的交集,为abcd,然后拿着交集和c3比较,一样返回false
*/ }
}
/*
运行结果:
true
true
true
true
false
*/
复制代码

5 迭代器

  • 迭代器概述

    • 集合是用来存储元素,存储的元素需要查看,那么就需要迭代(遍历)
import java.util.Collection;
import java.util.ArrayList;
import java.util.Iterator;
class DemoIteration {
public static void main(String[] args) {
Collection c=new ArrayList();
c.add("a");
c.add("b");
c.add("c");
c.add("d");
Iterator it=c.iterator(); //获取迭代器;
boolean b=it.hasNext(); //hasNext返回值类型为boolean型,功能是判断集合中是否有元素,有元素就返回ture
//也可以说成如果还有元素可以迭代,就返回ture
Object o=it.next(); //返回迭代的下一个元素
System.out.println(o); //输出一个迭代的a while(it.hasNext()) {
Object oo=it.next(); //next()有指针的功能,能接着上次的迭代结果继续迭代
System.out.println(oo);
}
}
}
/*
运行结果:
a
b
c
d
*/
复制代码

6 自定义对象的迭代

		c.add(new Student("张三",23));
c.add(new Student("李四",24));
c.add(new Student("王五",25));
c.add(new Student("赵六",26));
c.add(new Student("赵六",26)); for(Iterator it = c.iterator();it.hasNext();) {
Student s = (Student)it.next(); //向下转型
System.out.println(s.getName() + "," + s.getAge());
复制代码

7 List集合的功能概述

/*
* List集合的特有功能概述
* void add(int index,E element) //向集合的指定索引位置添加对象,其它对象的索引位置相对后移一位
* E remove(int index) //清除集合中指定索引位置对象
* E get(int index) //用来获得指定位置索引的对象
* E set(int index,E element) //将集合中指定索引位置的对象修改为指定的对象
*/
import java.util.Collection;
import java.util.ArrayList;
import java.util.List; class DemoList {
public static void main(String[] args) {
List l=new ArrayList();
l.add("a");
l.add("b");
l.add("hello");
l.add("c");
l.add("d");
l.add(1,"m"); //添加一个对象
System.out.println(l);
//[a, m, b, hello, c, d]
List ll=new ArrayList();
ll.add("123");
l.add(3,ll); //添加一个List对象
System.out.println(l);
//[a, m, b, [123], hello, c, d]
l.remove(3);
System.out.println(l); //删除索引3处的位置
//[a, m, b, hello, c, d]
l.get(3); //只是获取,不改变l对象的内容
System.out.println(l); //l对象内容并没有改变
//[a, m, b, hello, c, d]
System.out.println(l.get(3)); //打印出获取的对象
//hello
l.set(3,"world"); //在此处已经将l修改
System.out.println(l);
//[a, m, b, world, c, d]
System.out.println(l.set(3,"world"));
//无法理解此处出现的会是world ????????????????
}
}
/*
运行结果;
[a, m, b, hello, c, d]
[a, m, b, [123], hello, c, d]
[a, m, b, hello, c, d]
[a, m, b, hello, c, d]
hello
[a, m, b, world, c, d]
world
*/
复制代码

8 集合框架(并发修改异常产生的原因及解决方案)

需求:我有一个集合,请问,我想判断里面有没有"world"这个元素,如果有,我就添加一个"javaee"元素,请写代码实现。

List list = new ArrayList();
list.add("a");
list.add("b");
list.add("world");
list.add("d");
list.add("e");
/*Iterator it = list.iterator();
while(it.hasNext()) {
String str = (String)it.next();
if(str.equals("world")) {
list.add("javaee"); //这里会抛出ConcurrentModificationException并发修改异常
}
}*/
复制代码
  • ConcurrentModificationException出现

  • 迭代器遍历,集合修改集合

  • 解决方案
    *a:迭代器迭代元素,迭代器修改元素(ListIterator的特有功能add)
    *b:集合遍历元素,集合修改元素

    ListIterator lit = list.listIterator(); //如果想在遍历的过程中添加元素,可以用ListIterator中的add方法
    while(lit.hasNext()) {
    String str = (String)lit.next();
    if(str.equals("world")) {
    lit.add("javaee");
    //list.add("javaee");
    }
    }

转载于:https://juejin.im/post/5bd9a23d5188257f8a79feda

集合框架-day10的更多相关文章

  1. 一起学 Java(三) 集合框架、数据结构、泛型

    一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...

  2. 【目录】JUC集合框架目录

    JUC集合框架的目录整理如下: 1. [JUC]JUC集合框架综述 2. [JUC]JDK1.8源码分析之ConcurrentHashMap(一) 3. [JUC]JDK1.8源码分析之Concurr ...

  3. java面试题——集合框架

    先来看一下集合框架关系图 Collection FrameWork 如下: Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └S ...

  4. Java使用实现面向对象编程:第七章集合框架的解读=>重中之重

    对于集合框架,是非常重要的知识,是程序员必须要知道的知识点. 但是我们为什么要引入集合框架呢? 我们之前用过数组存储数据,但是采用数组存储存在了很多的缺陷.而现在我们引用了集合框架,可以完全弥补了数组 ...

  5. Java集合框架List,Map,Set等全面介绍

    Java集合框架的基本接口/类层次结构: java.util.Collection [I]+--java.util.List [I]   +--java.util.ArrayList [C]   +- ...

  6. Java集合框架练习-计算表达式的值

    最近在看<算法>这本书,正好看到一个计算表达式的问题,于是就打算写一下,也正好熟悉一下Java集合框架的使用,大致测试了一下,没啥问题. import java.util.*; /* * ...

  7. Java 之 集合框架(JCF)

    1.集合框架 a.框架:为了实现某一目的或功能,而预先提供的一系列封装好的.具有继承或实现关系的类与集合 b.集合:①定义:Java中对一些数据结构和算法进行封装,即封装(集合也是一种对象) ②特点: ...

  8. 【集合框架】Java集合框架综述

    一.前言 现笔者打算做关于Java集合框架的教程,具体是打算分析Java源码,因为平时在写程序的过程中用Java集合特别频繁,但是对于里面一些具体的原理还没有进行很好的梳理,所以拟从源码的角度去熟悉梳 ...

  9. 【集合框架】JDK1.8源码分析之Comparable && Comparator(九)

    一.前言 在Java集合框架里面,各种集合的操作很大程度上都离不开Comparable和Comparator,虽然它们与集合没有显示的关系,但是它们只有在集合里面的时候才能发挥最大的威力.下面是开始我 ...

随机推荐

  1. STM32CubeMX工程定时器配置

    STM32CubeMX生成工程 选择自己的芯片型号 配置RCC寄存器时钟为外部晶振 单击芯片配置GPIO,选择输出方式,重命名标签等 进入时钟配置,本人使用的为8M外部晶振作为时钟源,PLL时钟源选择 ...

  2. WTM asp.net core应用程序在Ubuntu上和CentOS上部署

    wtm在Ubuntu上和CentOS上部署 项目发布 在Visual Studio中右击Web项目,选择发布,如下图: Ubuntu安装.net core运行时 Ubuntu我是用的Vmware虚拟机 ...

  3. Android AndroidManifest.xml详解

    AndroidManifest.xml简述: AndroidManifest.xml 是每个android程序中必须的文件.它位于整个项目的根目录,描述了package中暴露的组件(activitie ...

  4. Kafka,RocketMQ,RabbitMQ部署与使用体验

    前言 近期在研究各种消息队列方案,为了有一个直观的使用体验,我把Kafka,RocketMQ,RabbitMQ各自部署了一遍,并使用了最基本的生产与消费消息功能.在部署过程中也遇到一些问题,特此记录. ...

  5. Flask 入门(十二)

    Blueprint ,听说过么? 那必须的啊!但它是干嗒的?也不难理解! 如果你的项目是一个公司,Blueprint就是治理你的公司的 没有Blueprint,你的公司除了老板就是员公 有了Bluep ...

  6. Linux不同时钟的区别

    今天发现项目中调用 clock_gettime 函数传入时钟类型参数时有 CLOCK_MONOTONIC.CLOCK_MONOTONIC_RAW.CLOCK_BOOTTIME.CLOCK_REALTI ...

  7. defer使用小结

    defer 前言 defer的定义 defer执行的规则 为什么需要defer defer进阶 作为匿名函数 作为函数参数 defer命令执行的时机 defer配合recover 总结 参考 defe ...

  8. 在类的外面调用类的private函数

    将基类中的虚函数定义为public,在派生类中将该虚函数定义为private,则可以通过基类指针调用派生类的private函数 #include <iostream> #include & ...

  9. C++_编程前奏

    计算机硬件系统 计算机操作系统的五大组成部分 计算机操作系统的组成部分 构成 控制器 指令寄存器(IR)/程序计数器(PC)/操作控制器(OC) 运算器 算数逻辑单元/累加器/状态寄存器/通用寄存器 ...

  10. 解决Jquery中click里面包含click事件,出现重复执行的问题

    出现问题的代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.o ...