知识点1:二叉树
1 package com.atguigu.javase.tree;
2
3 class Tree {
4
5 private class TreeNode {
6 int value;
7 TreeNode left;
8 TreeNode right;
9 }
10
11 private TreeNode root; // 根引用
12
13 public void add(int n) {
14 TreeNode newNode = new TreeNode();
15 newNode.value = n;
16 if (root == null) { // 树为空
17 root = newNode;
18 } else {
19 insert(root, newNode);
20 }
21 }
22
23 public void insert(TreeNode target, TreeNode newNode) {
24 if (newNode.value < target.value) { // 新结点比目标小, 向左走
25 if (target.left == null) {
26 target.left = newNode;
27 } else {
28 insert(target.left, newNode);
29 }
30 } else { // 向右走
31 if (target.right == null) {
32 target.right = newNode;
33 } else {
34 insert(target.right, newNode);
35 }
36 }
37 }
38
39 public void view(TreeNode node) {
40 if (node == null) {
41 return;
42 }
43 view(node.left);
44 System.out.println(node.value);
45 view(node.right);
46 }
47
48 public void travel() {
49 view(root);
50 }
51 }
52
53 public class TreeTest {
54
55 public static void main(String[] args) {
56 Tree tree = new Tree();
57 tree.add(20);
58 tree.add(10);
59 tree.add(50);
60 tree.add(80);
61 tree.add(5);
62 tree.add(2);
63 tree.add(9);
64
65 tree.travel();
66
67 }
68 }
知识点2:Set和List集合
1 package com.atguigu.javase.collection;
2
3 import org.junit.Test;
4
5 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters;
6 import java.util.*;
7
8 /**
9 * 集合 : 解决批量对象的存储问题.
10 * 简单地看作是一个可变长度的Object[]. 是一个长度可变的容器.
11 * Collection : 保存一个一个的对象
12 * 无序可重复. 无序 : 不按添加顺序保存元素, 可重复 : 重复的对象可以多次添加.
13 * boolean add(Object obj) 添加元素, 返回值表示添加成功或失败
14 * boolean contains(Object obj) 判断当前集合中是否包含参数中的对象
15 * boolean remove(Object obj) 删除指定的元素
16 * int size() 返回元素个数
17 *
18 * Set : 保存一个一个的对象, 无序不可重复
19 * HashSet : 使用哈希算法实现的Set集合.
20 * 去重规则 : 两个对象的equals为true, 两个对象的hashCode也必须相等.
21 *
22 * TreeSet : 基于二叉搜索树实现的Set集合. 内部要实现自然排序, 如果提供了比较器,它就会定制排序.
23 * 去重规则 : 两个对象的compare为0.
24 *
25 * List : 保存一个一个的对象, 有序可重复
26 * void add(int index, Object ele). 在指定下标位置处插入新元素
27 * Object get(int index) 返回指定下标处的元素
28 * Object remove(int index) 删除指定下标处的元素
29 * Object set(int index, Object ele) 替换指定下标处的元素为参数ele. 旧元素作为返回值.
30 *
31 * ArrayList : 基于数组实现的List集合
32 * Vector : 和ArrayList等价.
33 * LinkedList : 基于链表实现的List集合.
34 *
35 * Map : 保存一对一对的对象
36 *
37 */
38
39 class Student implements Comparable {
40
41 private int id;
42 private String name;
43 private int grade;
44 private double score;
45
46 public Student() {}
47
48 public Student(int id, String name, int grade, double score) {
49 this.id = id;
50 this.name = name;
51 this.grade = grade;
52 this.score = score;
53 }
54
55 public int getId() {
56 return id;
57 }
58
59 public void setId(int id) {
60 this.id = id;
61 }
62
63 public String getName() {
64 return name;
65 }
66
67 public void setName(String name) {
68 this.name = name;
69 }
70
71 public int getGrade() {
72 return grade;
73 }
74
75 public void setGrade(int grade) {
76 this.grade = grade;
77 }
78
79 public double getScore() {
80 return score;
81 }
82
83 public void setScore(double score) {
84 this.score = score;
85 }
86
87 @Override
88 public String toString() {
89 return "Student{" +
90 "id=" + id +
91 ", name='" + name + '\'' +
92 ", grade=" + grade +
93 ", score=" + score +
94 '}';
95 }
96
97 @Override
98 public boolean equals(Object o) {
99 if (this == o) return true;
100 if (o == null || getClass() != o.getClass()) return false;
101 Student student = (Student) o;
102 return id == student.id &&
103 grade == student.grade &&
104 Double.compare(student.score, score) == 0 &&
105 Objects.equals(name, student.name);
106 }
107
108 @Override
109 public int hashCode() {
110 return Objects.hash(id, name, grade, score);
111 }
112
113 @Override
114 public int compareTo(Object o) throws RuntimeException {
115 if (!(o instanceof Student)) {
116 throw new RuntimeException("对象不可比");
117 }
118 int n = (int)(this.score - ((Student)o).score);
119 if (n == 0) {
120 n = 1;
121 }
122 return n;
123 }
124
125 }
126
127 // 写一个比较器, 用于完成两个学生对象的比较
128 class MyComparator implements Comparator {
129
130 @Override
131 public int compare(Object o1, Object o2) {
132 if (!(o1 instanceof Student) || !(o2 instanceof Student)) {
133 throw new RuntimeException("对象不可比");
134 }
135 return -(((Student)o1).getGrade() - ((Student)o2).getGrade());
136 }
137 }
138
139 public class CollectionTest {
140
141 @Test
142 public void test7() {
143 MyComparator myComparator = new MyComparator();
144 Set set = new TreeSet(myComparator); // 通过构造器传递对象, 99.9%的情况是对象关联.
145 Student s1 = new Student(1,"小明", 5, 80);
146 Student s2 = new Student(2,"小花", 4, 90);
147 Student s3 = new Student(3,"小伟", 2, 100);
148 Student s4 = new Student(4,"小芳", 1, 90);
149 Student s5 = new Student(5,"小丽", 6, 50);
150
151 set.add(s1);
152 set.add(s2);
153 set.add(s3);
154 set.add(s4);
155 set.add(s5);
156
157 for (Object tmp : set) {
158 System.out.println(tmp);
159 }
160
161 System.out.println("*************************************");
162 // 1) 遍历谁, 就向谁要迭代器.
163 Iterator iterator = set.iterator();
164 // 使用注意事项1 : 迭代器要趁热使用
165 // set.remove(s1); 不要随意再修改集合的内容, 否则迭代器会出问题.
166 // 2) 循环依次询问当前游标后面有无元素, 如果有, 返回true
167 while (iterator.hasNext()) {
168 // 真的获取到后面的元素, 并且会引发内部游标的下移
169 Object obj = iterator.next();
170 // next()在循环中必须只调用一次.
171 System.out.println(obj);
172 }
173 // 使用注意事项 : 迭代器是一次性使用, 用完作废.
174
175 }
176
177 @Test
178 public void test6() {
179 Set set = new TreeSet();
180 Student s1 = new Student(1,"小明", 5, 80);
181 Student s2 = new Student(2,"小花", 4, 90);
182 Student s3 = new Student(3,"小伟", 2, 100);
183 Student s4 = new Student(4,"小芳", 1, 90);
184 Student s5 = new Student(5,"小丽", 6, 50);
185
186 set.add(s1);
187 set.add(s2);
188 set.add(s3);
189 set.add(s4);
190 set.add(s5);
191
192 for (Object tmp : set) {
193 System.out.println(tmp);
194 }
195 }
196
197 @Test
198 public void test5() {
199 Set set = new TreeSet();
200 //set.add(20);
201 //set.add(5);
202 //set.add(2);
203 //set.add(10);
204 set.add("cc");
205 set.add("bb");
206 set.add("aa");
207 //set.add(30);
208
209 for (Object tmp : set) {
210 System.out.println(tmp);
211 }
212 }
213
214 @Test
215 public void test4() {
216 Set set = new TreeSet();
217 set.add(20);
218 set.add(5);
219 set.add(2);
220 set.add(10);
221 set.add(80);
222 set.add(60);
223 set.add(5);
224
225 for (Object tmp : set) {
226 System.out.println(tmp);
227 }
228 }
229
230 @Test
231 public void test3() {
232 Set set = new HashSet(); // 无序不可重复
233 Student s1 = new Student(1, "小明", 3, 80);
234 Student s2 = new Student(2, "小丽", 2, 90);
235 Student s3 = new Student(1, "小明", 3, 80);
236
237 set.add(s1);
238 set.add(s2);
239 set.add(s3);
240 set.add(s1);
241
242 for (Object obj : set) {
243 System.out.println(obj);
244 }
245 }
246
247 // 创建一个List集合, 保存10个20以内的随机整数.
248 @Test
249 public void exer3() {
250 List list = new ArrayList();
251 for (int i = 0; i < 10; i++) {
252 int n = (int)(Math.random() * 20);
253 list.add(n);
254 }
255 // 遍历
256 for (int i = 0; i < list.size(); i++) {
257 Object o = list.get(i);
258 System.out.println(o);
259 }
260 }
261
262 // 创建一个List集合, 保存10个20以内的随机整数, 不要重复的.
263 @Test
264 public void exer4() {
265 List list = new ArrayList();
266 for (int i = 0; i < 10; i++) {
267 int n = (int)(Math.random() * 20);
268 if (list.contains(n)) {
269 i--;
270 continue;
271 }
272 list.add(n);
273 }
274
275 for (Object tmp : list) {
276 System.out.println(tmp);
277 }
278 }
279
280 @Test
281 public void exer42() {
282 List list = new ArrayList();
283 while (list.size() != 10) {
284 int n = (int)(Math.random() * 20);
285 if (!list.contains(n)) {
286 list.add(n);
287 }
288 }
289
290 for (Object tmp : list) {
291 System.out.println(tmp);
292 }
293 }
294
295 @Test
296 public void exer43() {
297 List list = new ArrayList();
298 for (int i = 0; i < 10;) {
299 int n = (int)(Math.random() * 20);
300 if (!list.contains(n)) {
301 list.add(n);
302 i++;
303 }
304 }
305
306 for (Object tmp : list) {
307 System.out.println(tmp);
308 }
309 }
310
311 @Test
312 public void test2() {
313 List list = new ArrayList();
314 list.add("abc");
315 list.add("yyy");
316 list.add(new Integer(200));
317 list.add("abc");
318 list.add(200);
319 list.add(new Student(2, "小丽", 1, 50));
320 System.out.println(list);
321 list.add(2, "我是汉字"); // 插入
322 list.add(1, 3);
323 System.out.println(list);
324 Object o = list.get(7);
325 System.out.println(o);
326 list.remove(3); // 整数会优先作为下标来使用
327 list.remove(Integer.valueOf(3)); // 删除对象
328 System.out.println(list); //[abc, yyy, 200, abc, 200, Student{id=2, name='小丽', grade=1, score=50.0}]
329 list.set(3, 3.14); // 替换操作
330 System.out.println(list);
331 System.out.println("*************************************");
332 for (int i = 0; i < list.size(); i++) {
333 Object o1 = list.get(i);
334 System.out.println(o1);
335 }
336
337 }
338
339 // 创建一个Set集合, 保存10个20以内的随机整数.
340 @Test
341 public void exer1() {
342 Set set = new HashSet();
343 for (int i = 0; i < 10; i++) {
344 set.add((int)(Math.random() * 20));
345 }
346 // 遍历集合
347 for (Object tmp : set) {
348 System.out.println(tmp);
349 }
350 }
351 // 创建一个Set集合, 保存10个20以内的随机整数. 保证10个.
352 @Test
353 public void exer12() {
354 Set set = new HashSet();
355 while (set.size() != 10) {
356 set.add((int)(Math.random() * 20));
357 }
358 // 遍历集合
359 for (Object tmp : set) {
360 System.out.println(tmp);
361 }
362 }
363
364 @Test
365 public void exer13() {
366 Set set = new HashSet();
367 for (int i = 0; i < 10; i++) {
368 int n = (int)(Math.random() * 20);
369 if (!set.add(n)) {
370 i--;
371 }
372 }
373 }
374
375 @Test
376 public void exer14() {
377 Set set = new HashSet();
378 for (int i = 0; i < 10; ) {
379 int n = (int)(Math.random() * 20);
380 if (set.add(n)) {
381 i++;
382 }
383 }
384 }
385
386 public static void main(String[] args) {
387 Set set = new HashSet(); // Set : 无序不可重复
388 set.add("abc");
389 set.add("yyy");
390 set.add(new Integer(200));
391 set.add(100); // set.add(Integer.valueOf(100));
392 set.add(new Student(1, "小明", 2, 80));
393 boolean b1 = set.add("yyy");
394 boolean b2 = set.add(200);
395 System.out.println(b1);
396 System.out.println(b2);
397
398 System.out.println(set.size());
399
400 System.out.println(set);
401
402 System.out.println("***************************************");
403 // 遍历集合.
404 for (Object tmp : set) {
405 System.out.println(tmp);
406 }
407
408 boolean contains = set.contains(200); // 判断是否包含
409 System.out.println("contains = " + contains);
410
411 set.remove(100); // 删除
412
413 System.out.println(set);
414 }
415 }
1 package com.atguigu.javase.collection;
2
3 import java.util.Comparator;
4 import java.util.HashSet;
5 import java.util.Set;
6 import java.util.TreeSet;
7
8 public class SetExer {
9
10 public static void main(String[] args) {
11 Set set = new TreeSet(new Comparator() {
12 @Override
13 public int compare(Object o1, Object o2) {
14 return (int)(((Person)o1).getWeight() - ((Person)o2).getWeight());
15 }
16 });
17
18 Person p1 = new Person("张三", 30, "男", 90);
19 Person p2 = new Person("李四", 40, "女", 50);
20 Person p3 = new Person("王五", 10, "男", 70);
21 Person p4 = new Person("王六", 50, "男", 30);
22
23 set.add(p1);
24 set.add(p2);
25 set.add(p3);
26 set.add(p4);
27
28 for (Object obj : set) {
29 System.out.println(obj);
30 }
31 }
32
33 public static void main3(String[] args) {
34 Person p1 = new Person("张三", 30, "男", 90);
35 Person p2 = new Person("李四", 40, "女", 50);
36 Person p3 = new Person("王五", 10, "男", 70);
37
38 Set set = new TreeSet();
39 set.add(p1);
40 set.add(p2);
41 set.add(p3);
42
43 for (Object obj : set) {
44 System.out.println(obj);
45 }
46 }
47
48 public static void main2(String[] args) {
49 // 写一个类Person, name,age,gender, 创建几个对象, 有内容相同的对象, 添加到HashSet集合中
50 // 如果想让HashSet帮助去重, 怎么做???
51 Person p1 = new Person("张三", 30, "男", 20);
52 Person p2 = new Person("李四", 40, "女", 70);
53 Person p3 = new Person("张三", 30, "男", 30);
54
55 Set hashSet = new HashSet();
56 hashSet.add(p1);
57 hashSet.add(p2);
58 hashSet.add(p3);
59
60 for (Object obj : hashSet) {
61 System.out.println(obj);
62 }
63 }
64 }
知识点3:经典for和增强for
1 package com.atguigu.javase.collection;
2
3 public class ForTest {
4
5 public static void main(String[] args) {
6 int[] arr = new int[8];
7 for (int i = 0; i < arr.length; i++) {
8 arr[i] = (int)(Math.random() * 20);
9 }
10 // 遍历
11 for (int i = 0; i < arr.length; i++) {
12 int tmp = arr[i];
13 //tmp *= 10;
14 System.out.print(tmp + " ");
15 }
16 System.out.println();
17
18 for (int i = 0; i < arr.length; i++) {
19 int tmp = arr[i];
20 System.out.print(tmp + " ");
21 }
22 System.out.println();
23
24 /////////////////////////////////////////////////////
25 // 遍历, 增强for, 为了遍历数组更安全, 更简单.
26 /*
27 for (元素数据类型 临时变量 : 数组名) {
28 访问临时变量;
29 }*/
30 for (int tmp : arr) {
31 //tmp *= 10;
32 System.out.print(tmp + " ");
33 }
34 System.out.println();
35
36 char[] arr2 = {'a', '2', '5'};
37 for (char ch : arr2) {
38 System.out.println(ch);
39 }
40 }
41 }
知识点4:Hashset 和TreeSet
1 package com.atguigu.javase.collection;
2
3 import java.util.Comparator;
4 import java.util.HashSet;
5 import java.util.Set;
6 import java.util.TreeSet;
7
8 public class SetExer {
9
10 public static void main(String[] args) {
11 Set set = new TreeSet(new Comparator() {
12 @Override
13 public int compare(Object o1, Object o2) {
14 return (int)(((Person)o1).getWeight() - ((Person)o2).getWeight());
15 }
16 });
17
18 Person p1 = new Person("张三", 30, "男", 90);
19 Person p2 = new Person("李四", 40, "女", 50);
20 Person p3 = new Person("王五", 10, "男", 70);
21 Person p4 = new Person("王六", 50, "男", 30);
22
23 set.add(p1);
24 set.add(p2);
25 set.add(p3);
26 set.add(p4);
27
28 for (Object obj : set) {
29 System.out.println(obj);
30 }
31 }
32
33 public static void main3(String[] args) {
34 Person p1 = new Person("张三", 30, "男", 90);
35 Person p2 = new Person("李四", 40, "女", 50);
36 Person p3 = new Person("王五", 10, "男", 70);
37
38 Set set = new TreeSet();
39 set.add(p1);
40 set.add(p2);
41 set.add(p3);
42
43 for (Object obj : set) {
44 System.out.println(obj);
45 }
46 }
47
48 public static void main2(String[] args) {
49 // 写一个类Person, name,age,gender, 创建几个对象, 有内容相同的对象, 添加到HashSet集合中
50 // 如果想让HashSet帮助去重, 怎么做???
51 Person p1 = new Person("张三", 30, "男", 20);
52 Person p2 = new Person("李四", 40, "女", 70);
53 Person p3 = new Person("张三", 30, "男", 30);
54
55 Set hashSet = new HashSet();
56 hashSet.add(p1);
57 hashSet.add(p2);
58 hashSet.add(p3);
59
60 for (Object obj : hashSet) {
61 System.out.println(obj);
62 }
63 }
64 }