集合框架collection
数组增删改的练习
为什么出现集合类?
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,Java就提供了
集合类。
数组和集合类同是容器,有何不同?
数组虽然也可以存储对象,但长度是固定的;集合长度是可变的。数组中可以存储基本数据类
型,集合只能存储对象。
集合类的特点
集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。
集合与数组的区别
- 长度
- 数组长度固定
- 集合长度可变
- 内容
- 数组存储同一类型元素
- 集合存储不同类型元素
- 元素类型
- 数组可以存基本类型,也可以存引用类型
- 集合只可以存引用类型
不同的集合类
- 存储数据时会有不同的需求,比如要求多个元素中不能有相同的,比如要求多个元素按照某种要求自动排序。针对不同的需求,Java提供了不同的集合类,每个类的数据结构不同。虽然大家有不一样的地方,但是都是用来存储元素获取元素的,所有有共性。把共性提取出来,就形成了所谓的集合之间的继承体系
继承体系
- collection
Collection
所有代码连接
-
添加功能
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);
-
删除功能
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);
-
判断功能
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());
-
获取功能
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
-
长度功能
int size():元素的个数
面试题:数组 没有length()方法,只有length属性,字符串有length()方法,集合没有length()方法,有size()方法。
//集合长度 collection.size(); System.out.println(collection.size());
-
交集功能
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); //[]
-
把集合转换为数组
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集合的特有功能:
-
添加功能
void add(int index,Object element):在指定位置添加元素
-
-
获取功能
Object get(int index):获取指定位置的元素
-
列表迭代器
ListIterator listIterator():List集合特有的迭代器
-
删除功能
Object remove(int index):根据索引删除元素,返回被删除的元素
-
修改功能
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);
}