List
- List 是接口,
ArrayList
,LinkedList
是实现类 - List 特点
- 可以利用
add()
添加null
值
- 可以利用
- List 创建
List list = List.of(1, 2, 3);
,可以利用of()创建,但是不可以传入null值,且of 方法创建的是不可变集合。
- List遍历
- 用迭代器
Iterator
遍历,它在集合的实例调用的时候创建。 Iterator
仅用于遍历,不可再遍历的时候进行数据改动- 主要有两个方法,
hasNext()
判断是否有下一个元素,next()
返回下一个元素
- 用迭代器
equals
-
对于自定义引用数据类型List,如果使用某些方法,其底层实现调用了
equals()
,那么就要重写equals()
,否则会报错。 -
equals() 重写
- 先确定哪些字段相等,实例就相等
- 利用
instanseof
判断传入和要比较的是不是同一类型,一致继续,否则返回false
- 对于引用类型使用
Object.equals()
比较,相比字段.equals()
方法可以防止出现空指针错误基本类型用==
比较
实例
public class Student { public String name; public int id; @Override public boolean equals(Object o){ if(o instanceof Student){ Student s = (Student) o return Object(this.name, s,name) && this.id == s.id; } } }
Map
-
Map是一个接口,
hashMap
是实现类 -
Map特点
put()
会替换原有的key
对应的value
-
Map遍历
- 遍历
value
,利用keySet()
方法返回key
的Set
集合
Map<String, Object> map = new HashMap(); for(String key : map.keySet()){ System.out.println(key + " = " + map.get(key)); }
- 遍历
key
和value
, 利用entrySet()
方法返回key-value
的Set
集合
Map<String, Object> map = new HashMap(); for(Map.Entry<String, Object> entry : map.entrySet()){ System.out.println(entry.getKey() + " = " + entry.getValue); }
- 遍历
-
Map中equals()和hashCode()方法的重写
- 对于自定义引用类型,在
Map
中也会存在无法使用equals比较的问题。所以需要重写equals()
。 - 对于Map映射,相同的
key
其hashCode()
返回值也一定要相同,即对应的value
要一致,因为value
是存储在一个数组中,而key
的hashCode()
得到的正是value
对应的索引值。因此我们还需要重写hashCode()
。 - 重写注意点
- 利用
hash()
时传入参数应该是你重写equals()
所用的属性 - 所以常说,一个类重写了‘equals()’,就一定要重写
hashCode()
- 利用
- 实例
import java.util.Comparator; import java.util.Map; import java.util.TreeMap; public class treeMapTest { static class Student { public String name; public int id; public Student(String name, int id) { this.name = name; this.id = id; } } public static void main(String[] args) { Map<Student,String> map = new TreeMap<>(new Comparator<Student>() { @Override public int compare(Student t1, Student t2) { return Integer.compare(t1.id, t2.id); //按照学号排序; } }); map.put(new Student("王五",14), "二等奖"); map.put(new Student("张三",13), "一等奖"); map.put(new Student("李四",12), "三等奖"); for(Student s : map.keySet()){ System.out.println(s.id + "=" +map.get(s));//13=一等奖 14=二等奖 12=三等奖 } } }
- 对于自定义引用类型,在
-
如果
Map
的key
是enum
类型,推荐使用EnumMap
,既保证速度,也不浪费空间。
Map<DayOfWeek, String> map = new EnumMap<>(DayOfWeek.class)
-
SortMap
这个接口的常用实现类TreeMap
可以让key
按顺序排列,但是在使用时要注意两点TreeMap
的原理不依赖equals()
和hashCode()
,所以对于自定义引用类型,无需重写这两个方法。- 但是排序
Compartor
接口,所以要求重写compare()
。
import java.util.Comparator; import java.util.Map; import java.util.TreeMap; public class treeMapTest { static class Student implements Comparable<Student>{ public String name; public int id; public Student(String name, int id) { this.name = name; this.id = id; } @Override public int compareTo(Student o) { return this.id - o.id } } public static void main(String[] args) { Map<Student,String> map = new TreeMap<>(); map.put(new Student("王五",14), "二等奖"); map.put(new Student("张三",13), "一等奖"); map.put(new Student("李四",12), "三等奖"); for(Student s : map.keySet()){ System.out.println(s.id + "=" +map.get(s));//12=三等奖 13=一等奖 14=二等奖 } } }
properties
- 使用流程
- 创建Properties实例;
- 调用load()读取文件;
- 调用getProperty()获取配置。
- 实例
public class propertiesTest { public static void main(String[] args) throws Exception { // File f = new File("/test.properties");//"D:\test.properties" // File f = new File("test.properties");//D:\IdeaCode\Algorithms\test.properties File f = new File("src/com/base/collection/test.properties");//D:\IdeaCode\Algorithms\src\com\base\collection\test.properties /* /表示根目录,即磁盘D 不加就是相对路径,从项目文件夹开始 即D:\IdeaCode\Algorithms */ f.createNewFile(); System.out.println(f.getAbsoluteFile()); //读取properties Properties prop = new Properties(); prop.load(new FileInputStream(f)); String url = (String) prop.get("url"); //写入 prop.setProperty("name","niuniu"); prop.store(new FileOutputStream(f),"注释");//将内容输入进去 String name = prop.getProperty("name"); System.out.println(url); System.out.println(name); } }
set
Set
是一个接口,实现类有Hashset
,TreeSet
HashSet
保证元素不重复,但不保证元素顺序,内部实现原理就是HashMap
中的key
,所以在使用时要正确实现equals()
,hashCode()
。TreeSet
实现了SortedSet
接口,可以保证元素的顺序。但是要注意实现Compare
接口,如果没有实现,那么创建TreeSet
时必须传入一个Comparator
对象。
queue
Queue
是一个接口,实现类有LinkList
,PriorityQueue
。- 实现基本操作的方法:
- 通过
add()
/offer()
方法将元素添加到队尾; - 通过
remove()
/poll()
从队首获取元素并删除; - 通过
element()
/peek()
从队首获取元素但不删除。 - 后面三种
Queue
独有的方法,操作失败不会抛出异常,而是返回null
。
- 通过
PriorityQueue
指优先队列。PriorityQueue
默认按元素比较的顺序排序(必须实现Comparable
接口),也可以通过Comparator
自定义排序算法(元素就不必实现Comparable
接口)。
实例import java.util.Comparator; import java.util.PriorityQueue; import java.util.Queue; public class PriorityQueueTest { public static void main(String[] args) { Queue<Student> queue = new PriorityQueue(new Student());//这个Comparator queue.offer(new Student(10, "xiaohong")); queue.offer(new Student(2, "xiaofan")); System.out.println(queue.peek().name); } static class Student implements Comparator<Student> { int id; String name; public Student(int id, String name) { this.id = id; this.name = name; } public Student() { } @Override public int compare(Student o1, Student o2) { return Integer.compare(o1.id, o2.id); } } }
Deque
指先进先出队列,继承Queue
接口。可以利于它来创建栈。内部有与栈相关的push()
,pop()
,peek()