集合
1. 集合的三大接口:list,set,map
List 可以重复,有顺序。
set 不重复 ,没有顺序,
Map 健值对 健不能重复
2. List 的实现了ArrayList
默认集合的操作对象是Object 类型,可以保存任何类型的对象但在遍历的时候需要进行类型判断,比较麻烦,一般我们在使用的时候是泛型集合
泛型集合: 在集合定义的时候,通知集合允许保存的数据类型。
当使用的是集合的时候就只能保存同一个数据类型,在获取集合对象的时候也不需要进行类型判断
List 集合名称 = new ArrayList();
3. List的常用方法
Add() 在集合的最后添加对象
Add(index,obj) ; 在指定的位置插入对象
Addall() 在一个集合中添加另一个集合的内容
Size()获取集合的元素个数
isEmpty() 判断集合中是否存在内容
Remove() 删除单个对象,删除对象的原则是判断是否是同一个对象而对象的值是否相同
Contains() 判断集合中是否包含某一个对象
集合的遍历
Iterator()迭代器可以遍历所有的集合类型(list,set,map)
for循环只能遍历list 的内容
案例
//创建一个学生的集合
List<Student> stuList = new ArrayList<Student>();
//添加对象
Student stu1 = new Student("张三","女");
Student stu2 = new Student("李四","男");
Student stu3 = new Student("王五","女");
Student stu4 = new Student("赵柳","男");
Student stu5 = new Student("李四","男");
Student stu6 = stu3;
stuList.add(stu1);
stuList.add(stu2);
stuList.add(stu3);
stuList.add(stu5); //stu5 和 stu2 不叫重复对象,只是属性值刚好相同
stuList.add(stu6); //添加重复的对象 stu6 == stu3
stuList.add(2, stu4); //在指定的位置插入对象
//查询集合中的元素个数 如果size ==0表示集合中没有内容
int size =stuList.size();
System.out.println("集合中的元素个数:" + size);
//判断集合元素是否为空
boolean isEmpty =stuList.isEmpty();
System.out.println("是否为空:" + isEmpty);
//移除某一个元素
stuList.remove(stu6); //移除的是重复对象的第一个
stuList.remove(stu5);
//判断某一个对象是否存在
Student check_stu = new Student("张三","女");
boolean isHave =stuList.contains(check_stu);
System.out.println("isHave:"+ isHave); //false 同名同性别不一定是同对象
check_stu = stu1; //check_stu == stu2;两个对象是相同的
isHave = stuList.contains(check_stu);
System.out.println("isHave:"+ isHave); //true
//遍历:所有的集合类型都可以采用iterator的方式便利
Iterator<Student> stuIterator = stuList.iterator();
while(stuIterator.hasNext()){
Student temp_stu = stuIterator.next();
System.out.println(temp_stu);
}
//list 特别的遍历 利用for循环或foreach都可以
System.out.println("===================");
for(int i =0;i<stuList.size();i++){
Student stu = stuList.get(i);
System.out.println(stu);
}
4. List的三个实现类的区别和联系
LinkedList 底层是由链表实现,在增加删除元素的时候要快,但遍历要慢
因为LinkedList多实现了接口所有方法要比ArrayList要多
ArrayList 底层是数组实现默认容量是10 ,扩容1.5倍. 遍历要快,增加删除要慢
同时线程不安全,效率高
Vector 底层也是数组实现,默认容量10,扩容2被,遍历要快,增加删除要慢
同时线程安全,效率低
5.Set 集合
Set stuSet = new HashSet();
无序,不可重复
不可重复的判断规则是:首先调用对象的hashCode ,如果HashCode相同,则调用eqals方法
常用方法和List 相同的: 重点的方法: add ,remover ,container ,iterator遍历
Set 不支持for循环遍历只能用iterator遍历
HashSet 和TreeSet的区别和联系
HashSet与TreeSet接口的一点不同,HashSet 保存的数据是无序的,TreeSet保存的数据是有序的
利用TreeSet保存自定义类对象的时候,自定义所在的类一定要实现Comparable接口,否则无法排序
TreeSet 依靠的是Comparable 来区分重复数据;HashSet 依靠的是hashCode()、equals()来区分重复数据
里面都不允许保存重复数据。
6. Map集合
Map保存数据的方法以键值对的方式去保存,键不能重复,值可以重复
Map的常用方法
Put() 在集合中保存数据
Get() 根据KEY获取VALUE的信息
KeySet() 获取所有的KEY
VALUES() 获取所有的value
isEmpty 判断集合的的元素是否为空
Size() 获取Map的元素个数
//key 名字 value 家庭住址
Map<String,String> strMap = new HashMap<String,String>();
strMap.put("张三", "河北省石家庄兴华大街100号");
strMap.put("李四", "河北省唐山市兴华大街110号");
//查看一共有多少个学生信息 size()
int stusize = strMap.size();
System.out.println("一共有:"+stusize+"学生的信息");
//查询某一个学生的家庭住址containKey get
String findname = "王五";
if(strMap.containsKey(findname))
{
String address = strMap.get(findname);
System.out.println(findname +"家庭住址:"+ address);
}else{
System.out.println("没有找到"+findname+"的信息");
}
//修改王五的家庭住址
System.out.println("替换学生的信息:");
String newname ="王五";
String newaddress="河南省驻马店市政府街100号";
//strMap.put(newname, newaddress);
strMap.replace(newname, newaddress);
//把李四的信息移除
String removename = "李四";
if(strMap.containsKey(removename)){
strMap.remove(removename);
System.out.println(removename +"移除成功");
}else{
System.out.println(removename +"不存在,不能移除");
}
//显示所有的学生的地址
Iterator<String> nameIter= strMap.keySet().iterator();
System.out.println("姓名\t地址");
while(nameIter.hasNext()){
String name = nameIter.next();
String address = strMap.get(name);
System.out.println(name+"\t"+address);
}
//情况所有的元素
strMap.clear();
System.out.println("还有没有学生信息 :"+ strMap.isEmpty());
System.out.println("Map结束");
遍历map的方法有三种<循环key,循环values,循环map对象>
//第一种:遍历可以 keyset()
Set<String> keySet = stuMap.keySet();
Iterator<String> keyIter = keySet.iterator();
while(keyIter.hasNext()){
String key = keyIter.next();
//通过key获取map中的value
Student stu = stuMap.get(key);
System.out.println(key +" " + stu);
}
//第二种:遍历vlaues
System.out.println("所有的VALUES");
Collection<Student> stuColl = stuMap.values();
Iterator<Student> stuIter = stuColl.iterator();
while(stuIter.hasNext()){
Student stu = stuIter.next();
System.out.println(stu);
}
//第三种: 遍历KEY-VALUE对象
System.out.println("所有的entry (key+ value)");
Set<Entry<String,Student>> entrySet = stuMap.entrySet();
Iterator<Entry<String,Student>> entryIter = entrySet.iterator();
while(entryIter.hasNext()){
Entry<String,Student> entry = entryIter.next();
String key = entry.getKey();
Student student = entry.getValue();
System.out.println(key+" "+ student);
}
7. Map的实现类的区别
HashMap
根据键的hashCode值存储数据,只允许一条记录的键为null,速度快,线程不安全
Hashtable
常用功能与HashMap类似,速度慢,线程安全
LinkedHashMap
是HashMap的一个子类,保存了记录的插入顺序
TreeMap
是SortedMap接口的实现,key有序以”二叉树"的格式存储
8.Collection 和Collections 的区别
Collection是一个接口,是List和Set的父接口,它里面保存的数据的特点是:无序,且重复
Collections是一个工具类,不能实例化,提供了一些静态的方法,用于是实现对于集合的一些常用功能。
集合中保存的都是对象的引用
Proerties ,Queue,Stack