一、笔记
Set集合(重点)
•基本概念
•java.util.Set接口是Collection接口的子接口,与List接口平级。
•该接口中的元素没有放入次序,并且不允许重复。
•该接口的主要实现类:HashSet类 和 TreeSet类。
•其中HashSet类的底层是采用哈希表来实现数据内容的管理。
•其中TreeSet类的底层是采用有序二叉树来实现数据内容的管理。
HashSet 和hashCode方法的关系
• HashSet 是Set接口的实现类,通过Hash表的方式实现;在 将对象加入HashSet 集合中时,需要获取对象的HashCode值通过Hash算法索引到对应的存储空间。
HashSet的元素存放规则
向HashSet中放元素的次序:
1 先调用元素的hashCode(),得到哈西码,通过算法元素在 哈西表中的位置。
2 如果该位置为Null,没有元素,直接放入即可。
3 如果该位置不是Null,有元素,调用元素的equals()方法, 比较是不是同一个元素。
4 如果是同一个元素,保留旧的元素,丢弃新的。
5 如果不是同一个元素,放入该位置的链表中下一个元素。
TreeSet – 可排序的Set
• 很多时候,需要对集合中的元素按照某种规则进行排序。排序不是放入次序。
• SortedSet 就是可排序的Set,实现类就是TreeSet。
• 必须实现Comparable接口,实现其中方法,才能被排序(自然排序)。
• 自然排序只能按一种规则排序,比较器可以多元化排序。
Comparable接口
•针对对象数组或者集合中的元素进行排序时,首先需要确 定对象元素的“比较”逻辑(即哪个大,哪个小)。
•JDK中定义了Comparable接口,用于表示对象间的大小关 系,JAVA类可以通过实现Comparable接口编写对象的大小逻辑。
Comparable接口中定义有compareTo 方法,其逻辑是:
• 返回 正数表示this大于参数对象;
• 返回负数表示this小于参数对象;
• 返回0表示this等于参数对象
TreeSet类
(1)什么是二叉树?
二叉树就是指最多有两个分叉的树形结构,换句话说,二叉树是指每个节点最多只有两个子节点的树形结构。
(2)什么是有序二叉树?
满足以下3个条件的二叉树叫做有序二叉树:
a.左子树中的任意节点元素值都小于根节点;
b.右子树中的任意节点元素值都大于根节点;
c.左子树和右子树的内部也要遵循上述规则;
(3)使用方式
当放入元素到TreeSet对象时,需要指定元素之间比较大小的规则,具体方式如下:
元素的自然排序进行处理,让元素类型实现java.lang.Comparable<T>接口;
Map集合
基本概念
java.util.Map<K,V>接口主要用于描述单对元素的集合,具体要求如下:
K - 此映射所维护的键的类型
V - 映射值的类型
该集合中要求key不允许重复,每个key对应一个value。
该集合的主要实现类:HashMap类
常用的方法
V put(K key, V value) - 用于将参数指定key和参数指定的value组成一对放入当前集合
- 若当前集合中不存在key,则表示增加的功能,返回null。
- 若当前集合中存在key,则表示修改的功能,返回之前的旧值。
V get(Object key)
- 用于根据参数指定的key返回对应的value,若key不存在则返回null。
V remove(Object key)
- 用于根据参数指定的key来删除该对元素,返回被删除元素的value。
IO流:Input Output 输入、输出流
对于数据的操作而言,流化分为:字节流 InputStream OutputStream
想操作文件:FileOutputStream FileInputStream
集合:只能用来存储一堆对象的容器
集合框架:
Collection(集合)|--List(有序的,数据可以重复):ArrayList(列表式) LinkedList(链表式) Stack(LIFO) Vector
|--Set(无序的,数据具有唯一性):HashSet TreeSet
方法:add remove/clear set get/size add..
集合遍历:
for循环
forEach循环
迭代器:类似于娃娃机的爪子,用来从容器中抓数据
hasNext():相当于一个指针,在指针移动前会判断集合中有无元素,有返回true,没有返回false
next():取出集合中的元素
二、Demo
1.
package com.sihuo.zhuguangyi.collection_iterator;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;
public class TestIterator {
public static void main(String[] args) {
ArrayList arr = new ArrayList();
arr.add("你好3");
arr.add("你好2");
arr.add("你好4");
arr.add("你好6");
arr.add("你好5");
arr.add("你好1");
// Iterator itr = arr.iterator();
// while(itr.hasNext()) {
// Object s=itr.next();
// if(s.equals("你好2")) {
itr.remove();
arr.remove(0);//ConcurrentModificationException 并发修改异常
// }else {
// System.out.println(s);
// }
// }
ListIterator listItr = arr.listIterator();
/*
* 将指针移动到集合底部
*/
while(listItr.hasNext()) {
System.out.println(listItr.next());
}
System.out.println("*******************************");
/*
* 反向遍历
*/
while(listItr.hasPrevious()) {
System.out.println(listItr.previous());
}
}
}
2.
package com.sihuo.zhuguangyi.collection_map;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.qfedu.tom.collection_set.Student;
public class TestHashMap {
public static void main(String[] args) {
HashMap<Integer,String> hm = new HashMap<Integer,String>();
//增加
/*
* HashMap中的key值是以Set集合的形式存储的,无序,数据唯一
* value值可以看作是以List集合的形式存储的,数据可以重复
* 理解:可以理解为,key值相当于是value值的下角标,只不过是给下角标起了个名字而已
*/
hm.put(8, "班长的老婆");
hm.put(9, "俊俊的老婆");
hm.put(6, "班长的老婆");
hm.put(7, "班长的老婆");
hm.put(4, "班长的老婆");
hm.put(5, "班长的老婆");
// System.out.println(hm);
//删
// hm.clear();
// hm.remove("班长");
// System.out.println(hm);
//查
// System.out.println(hm.size());
// System.out.println(hm.get("班长"));
Set set = hm.keySet();//将key值存放到Set集合中
// for (Object object : set) {
// System.out.println(object+"="+hm.get(object));
// }
Iterator itr = set.iterator();
while(itr.hasNext()) {
Object o =itr.next();
System.out.println(o+"========>>"+hm.get(o));
}
}
}
3.
package io.oi;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
public class TestFileOutputStream {
public static void main(String[] args) throws Exception {
//文件路径
FileOutputStream fos = new FileOutputStream("E:\\a.txt");
byte[] b = new byte[] {97,98,99,100,101};
fos.write(b);
fos.write("Hello World".getBytes());
FileInputStream fis = new FileInputStream("E:\\a.txt");
System.out.print((char)fis.read());
System.out.print((char)fis.read());
System.out.print((char)fis.read());
System.out.print((char)fis.read());
System.out.print((char)fis.read());
System.out.print((char)fis.read());
}
}