集合框架-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,虽然它们与集合没有显示的关系,但是它们只有在集合里面的时候才能发挥最大的威力.下面是开始我 ...
随机推荐
- HDU1158:Employment Planning(暴力DP)
Employment Planning Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- php人民币小写转大写函数,不限长度,精确到分
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://ustb80.blog.51cto.com/6139482/1035327 在打印 ...
- django_rest_framework视图传递参数给序列化器
django_rest_framework视图传递参数给序列化器 视图中默认可以将request.data传递给序列化器,但request.data是不可更改的对象,但又想将额外的参数传递给序列化器 ...
- C/C++内存详解
众所周知,堆和栈是数据结构中的两种数据结构类型,堆是一种具有优先顺序的完全二叉树(或者说是一种优先队列,因为它在一定的优先顺序下满足队列先进先出的特点),排队打饭就是它的典型实例,栈是一种后进先出的数 ...
- JAVA中的==和equals()的区别
一.先来说说Java的基本数据类型和引用类型 八大基本数据类型:Byte,short,int,long,double,folat,boolean,char,其中占一个字节的是byte,short和ch ...
- mysql 多个属性排序查询
查询 排序(order by) 语法:order by 字段 asc/desc asc 顺序,正序.数值 :递增,字母:自然顺序(a-z) desc 倒序 反序 数值:递减, 字母:自然反序 查询的宗 ...
- alg-链表中有环
typedef struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(nullptr) {} }ListN ...
- 别人用钱,而我用python爬虫爬取了一年的4K高清壁纸
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取htt ...
- D - Fox And Two Dots DFS
Fox Ciel is playing a mobile puzzle game called "Two Dots". The basic levels are played on ...
- Git敏捷开发--rebase命令
git rebase是git下比较常用的命令,以下记录自己遇到较多的使用场景. 合并分支 在多人协作的项目中,拉分支是很常见的事情,经常需要同步自己的分支与远端master分支一致,有两种方式: gi ...