集合的概念
Collection接口
Iterator接口
Set
集合:将若干用途 性质相同或相近的数据组合而成的一个整体
java集合中只能保存引用类型的数据 不能保存基本类型的数据
package com.haina365.day01.day14;
import java.util.ArrayList;
import java.util.Collection;
/*
两大家族 三个集合 四个重要接口 六个重要实现类
两大家族是Collection Map
三个集合 List Set Map
Set集合:无序 不可以重复
List集合:有序 可以重复
Map集合:以键值对的形式保存数据 键不可以重复 值可以重复
四个重要接口Collection Set List Map
六个重要实现类
Set:HashSet TreeSet
List:ArrayList LinkedList
Map:HashMap TreeMap
我们只讲HashSet ArrayList LinkedList HashMap四个实现类
*/
public class CollectionTest {
public static void main(String[] args) {
Collection c = new ArrayList();
//获取集合的长度 也就是集合中元素的个数
System.out.println(c.size());
//判断集合是否为空 如果是则返回true 否则返回false
System.out.println(c.isEmpty());
//add 往集合中添加数据的方法
c.add("zhangsan");
c.add(18);
c.add(80.5);
c.add(true);
c.add('A');
//因为集合也重写了Object的toString方法 所以显示的是保存到集合中的数据内容
System.out.println(c);
System.out.println(c.size());
//删除集合中的元素 如果有则删除 且集合长度改变 如果没有 则不会删除数据 也不会报错 长度不变
c.remove(true);
System.out.println(c);
System.out.println(c.size());
c.remove(false);
System.out.println(c);
System.out.println(c.size());
//将集合转换为数据 算是集合的一种遍历形式
Object[] o = c.toArray();
for (Object i:o){
System.out.print(i + " ");
}
//清空集合 删除集合中所有的数据
c.clear();
System.out.println(c);
}
}
package com.haina365.day01.day14;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class IteratorTest {
public static void main(String[] args) {
Collection c = new ArrayList();
c.add("zhangsan");
c.add(true);
c.add(123);
c.add(559.7);
c.add('C');
//集合的遍历方式 迭代器
Iterator it = c.iterator();
//在数据前面有一个游标 如果后面有数据则返回true 如果没有数据则返回false
while (it.hasNext()){
//it.next方法用于获取后面的数据
Object o = it.next();
System.out.println(o);
}
}
}
package com.haina365.day01.day14;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
/*
Set集合的无序不可以重复 不仅仅是同一个对象不能保存进同一个集合中 不同对象内容相同也不能保存进同一个集合中
说到比较一定会想到==和equals 为了提高比较效率 我们会优先比较hash值 hash值是内容经过了一系列hash计算的得到的一个int
类型的整数值 如果两个对象的hash值不同 则证明这是两个对象 但是当两个对象的hash值相同 则需要进行其他比较 防止出现
hash值相同 但是内容不同的偶然事件发生
当两个对象的hash值相同 则会进行内容的逐一比较 如果形同则不保存 否则保存进set集合
所以set集合的不可以重复 要先看hash值 然后在比较equals 所以需要两者的共同判断
*/
public class SetTest {
public static void main(String[] args) {
Set set = new HashSet();
Set s = new Set() {
@Override
public int size() {
return 0;
}
@Override
public boolean isEmpty() {
return false;
}
@Override
public boolean contains(Object o) {
return false;
}
@Override
public Iterator iterator() {
return null;
}
@Override
public Object[] toArray() {
return new Object[0];
}
@Override
public Object[] toArray(Object[] a) {
return new Object[0];
}
@Override
public boolean add(Object o) {
return false;
}
@Override
public boolean remove(Object o) {
return false;
}
@Override
public boolean containsAll(Collection c) {
return false;
}
@Override
public boolean addAll(Collection c) {
return false;
}
@Override
public boolean retainAll(Collection c) {
return false;
}
@Override
public boolean removeAll(Collection c) {
return false;
}
@Override
public void clear() {
}
};
//无序:指保存在set集合的顺序和显示的顺序不一样 这就是无序
set.add("hello");
set.add("lisi");
set.add("wangwu");
set.add("zhaoliu");
set.add("zhangsan");
s.add("hello");
//set集合调用add方法的实现原理是通过比较hash值 地址 内容来判断是否应该添加进去
String s1 = "hello world";
String s2 = new String("hello world");
//不可重复:指的是同一个对象不能保存在同一个set集合中
//同时 不同对象 内容相同的也不能保存在set集合中
set.add(s1);
set.add(s2);
System.out.println(set);
}
}
package com.haina365.day01.day14;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
public class Test {
public static void main(String[] args) {
Set set = new HashSet();
Student s1 = new Student(18,55,'A');
Student s2 = new Student(18,55,'A');
Student s3 = new Student(20,99,'A');
set.add(s1);
set.add(s2);
set.add(s3);
System.out.println(set);
}
}
class Student{
int age;
double score;
char name;
public Student(int age,double score,char name){
this.age = age;
this.name = name;
this.score = score;
}
//为了让set集合正常工作 需要重写equals方法和hashcode方法
@Override
public boolean equals(Object o) {
if (this == o){
return true;
}
if (o instanceof Student){
Student s = (Student) o;
if (this.age == s.age && this.score == s.score && this.name == s.name){
return true;
}
return false;
}
return false;
}
@Override
public int hashCode() {
//自定义一个hash值
return (int) (age * 12 + score * 234 + name * 3);
}
}