集合框架-day10
day10-集合框架-对象数组的概述与引用
1 集合框架的简单介绍:
- A:集合的由来
- 数组长度是固定,当添加的元素超过了数组的长度时需要对数组重新定义,太麻烦,java内部给我们提供了集合类,能存储任意对象,长度是可以改变的,随着元素的增加而增加,随着元素的减少而减少
- B:数组和集合的区别
- 区别1 :
- 数组既可以存储基本数据类型,又可以存储引用数据类型,基本数据类型存储的是值,引用数据类型存储的是地址值
- 集合只能存储引用数据类型(对象)集合中也可以存储基本数据类型,但是在存储的时候会自动装箱变成对象
- 区别2:
- 数组长度是固定的,不能自动增长
- 集合的长度的是可变的,可以根据元素的增加而增长
- 区别1 :
- 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的更多相关文章
- 一起学 Java(三) 集合框架、数据结构、泛型
一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...
- 【目录】JUC集合框架目录
JUC集合框架的目录整理如下: 1. [JUC]JUC集合框架综述 2. [JUC]JDK1.8源码分析之ConcurrentHashMap(一) 3. [JUC]JDK1.8源码分析之Concurr ...
- java面试题——集合框架
先来看一下集合框架关系图 Collection FrameWork 如下: Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └S ...
- Java使用实现面向对象编程:第七章集合框架的解读=>重中之重
对于集合框架,是非常重要的知识,是程序员必须要知道的知识点. 但是我们为什么要引入集合框架呢? 我们之前用过数组存储数据,但是采用数组存储存在了很多的缺陷.而现在我们引用了集合框架,可以完全弥补了数组 ...
- Java集合框架List,Map,Set等全面介绍
Java集合框架的基本接口/类层次结构: java.util.Collection [I]+--java.util.List [I] +--java.util.ArrayList [C] +- ...
- Java集合框架练习-计算表达式的值
最近在看<算法>这本书,正好看到一个计算表达式的问题,于是就打算写一下,也正好熟悉一下Java集合框架的使用,大致测试了一下,没啥问题. import java.util.*; /* * ...
- Java 之 集合框架(JCF)
1.集合框架 a.框架:为了实现某一目的或功能,而预先提供的一系列封装好的.具有继承或实现关系的类与集合 b.集合:①定义:Java中对一些数据结构和算法进行封装,即封装(集合也是一种对象) ②特点: ...
- 【集合框架】Java集合框架综述
一.前言 现笔者打算做关于Java集合框架的教程,具体是打算分析Java源码,因为平时在写程序的过程中用Java集合特别频繁,但是对于里面一些具体的原理还没有进行很好的梳理,所以拟从源码的角度去熟悉梳 ...
- 【集合框架】JDK1.8源码分析之Comparable && Comparator(九)
一.前言 在Java集合框架里面,各种集合的操作很大程度上都离不开Comparable和Comparator,虽然它们与集合没有显示的关系,但是它们只有在集合里面的时候才能发挥最大的威力.下面是开始我 ...
随机推荐
- 1089 Insert or Merge (25分)
According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, and gr ...
- PTA数据结构与算法题目集(中文) 7-8
PTA数据结构与算法题目集(中文) 7-8 7-8 哈利·波特的考试 (25 分) 哈利·波特要考试了,他需要你的帮助.这门课学的是用魔咒将一种动物变成另一种动物的本事.例如将猫变成老鼠的魔咒是 ...
- 基于 mpvue 框架的小程序选择控件,支持单列,多列,联动
最近在学着写mpvue小程序,在做选择控件时候遇到了点问题,按照微信小程序方法picker,很不方便! 在网上搜到一个很好用的组件下面给大家分享: 组件说明文档链接:https://go.ctolib ...
- 在.net core中完美解决多租户分库分表的问题
前几天有人想做一个多租户的平台,每个租户一个库,可以进行水平扩展,应用端根据登录信息,切换到不同的租户库 计划用ef core实现,他们说做不出来,需要动态创建dbContext,不好实现 然而这个使 ...
- Django常用的第三方包
Django常用的第三方包 API开发 djangorestframework django-rest-multiple-models django-cors-headers 查询 django-fi ...
- 2020-3-3 20175110王礼博 《网络对抗技术》Exp1 PC平台逆向破解
目录 1.实践目标与基础知识 2.直接修改程序机器指令,改变程序执行流程 3.通过构造输入参数,造成BOF攻击,改变程序执行流 4.注入Shellcode并执行 5.实验收获与感想 6.什么是漏洞?漏 ...
- Java入门第一阶段总结
前言 写了三周的模拟题,对原本就厌恶的模拟更加深恶痛绝.但是不得不说模拟题是对一门语言入门掌握其语法成效最快的一类题,轻松地从C入门到了Java.一直坚信各门语言都是想通的,一力破万法. 作业过程总结 ...
- O - Navigation System CodeForces - 1321D
题目大意:有一个导航系统,会根据你当前的位置,规划到目的地的最短路线,给你一个有向图,和一条行驶路径,问你导航重新规划路径的最大次数和最小次数. 读题的时候题意特别不理解,何为最大次数,何为最小次数? ...
- D - Romantic
The Sky is Sprite. The Birds is Fly in the Sky. The Wind is Wonderful. Blew Throw the Trees Trees ar ...
- testNG 常用的注解
常用注解介绍: @BeforeSuite 在该套件的所有测试都运行在注释的方法之前,仅运行一次 @AftereSuite 在该套件的所有测试都运行在注释方法之后,仅运行一次 @BeforeClass ...