学习心得
今天讲解的是昨天的员工管理系统,主运行页面的代码很少,越来越优化,也知道了集合和多态创建时候应该注意的问题
心情😂😂
今天的代码量很多,晚上看了好久才看完一遍读懂一遍
掌握程度:顺序的一些东西,有点不太好,记不住嵌套的时候东西放到哪里,类和类之间有的时候调用方法还要再练习
我们在创建对象的时候用的是多态
父类对象---子类引用
我们创建出来的对象只能调用父类和子类中都有的方法
面试题:
| Collection 和 Map 接口的区别 |
Collection存放单值的的最大父接口 Map存放对值的最大父接口 |
| ArrayList 和 LinkedList 的区别 |
ArrayList:内部结构是数组,比较适合做高频率的查找,遍历。 LinkedList:双向链表,比较适合做高频率的新增和删除。 |
| ArrayList 和 Vector 的区别 |
ArrayList线程异步,线程不安全 Vector线程同步,线程安全 |
| HashSet 和 LinkedHashSet 的区别和联系 |
LinkedHashSet 的内部结构是链表。 添加顺序时候会维护添加顺序,效率比HashList低 |
| List和Set的区别 |
List 有顺序,元素可以重复1,顺序指的是添加的先后顺序。 Set 没有顺序,元素不可以重复,顺序指的是添加的先后顺序。 |
Collection 接口:
List:有顺序,元素可以重复1,顺序指的是添加的先后顺序
Set:没有顺序,元素不可以重复,顺序指的是添加的先后顺序
Set 实际上是有顺序的,内部有一个专门排序的的算法。
1.所谓的无序
2.所谓的无序是指没有按照添加的先后顺序,其实内部是做了排序的
Set集合如何确保数据不重复?
保证数据类型的类要重写hashCode 和 equals 方法。
public class Ch03 { public static void main(String[] args) { Set<Person> set = new HashSet<>(); set.add(new Person("张三",1001)); set.add(new Person("张三",1001)); set.add(new Person("张三",1001)); set.add(new Person("张三",1001)); // 引用数据类型 // set集合所谓的不能重复,默认情况下比较地址 System.out.println(set); }
TreeSet:
排序规则:要排序的对象的类必须实现 Comparable 接口。
public class Ch04 { public static void main(String[] args) { // Set<Integer> tree = new TreeSet<>(); // tree.add(-100); // tree.add(100); // tree.add(10); // tree.add(50); // Set<String> tree = new TreeSet<>(); // tree.add("1"); // tree.add("a"); // tree.add("哈哈哈哈哈哈"); // tree.add("%"); Set<Person> tree = new TreeSet<>(); tree.add(new Person("张岳",1001)); tree.add(new Person("李四",1010)); tree.add(new Person("费四",1003)); System.out.println(tree);
LinkedHashSet:在添加数据的同时维护数据的添加顺序。效率比HashSet略低一点。
public class Ch05 { public static void main(String[] args) { LinkedHashSet<String> set = new LinkedHashSet<>(); set.add("1"); set.add("a"); set.add("哈哈哈哈哈哈"); set.add("%"); System.out.println(set); }
比较接口:
Comparable接口:自然排序,排序规则是固定的。
Comparator接口:临时排序。
public class Ch06 { public static void main(String[] args) { List<Person> list = new ArrayList<>(16); list.add(new Person("张岳",1100)); list.add(new Person("李四",1010)); list.add(new Person("刘海柱",1020)); // list.sort(new Comparator<Person>() { // @Override // public int compare(Person o1, Person o2) { // return 0; // } // }); list.sort((o1,o2) -> { if(o1.getId() < o2.getId()){ return -1; } if(o1.getId().equals(o2.getId())){ return 0; } return 1; }); System.out.println(list); }
Map接口:
1.存储对值K - V key - value
2.key不能重复,value可以重复
3.没有顺序(添加的先后顺序)
HashMap内部存储结构:
jdk1.7之前:链表加二叉树
jdk1.7之后:链表加数组加红黑树
HashMap基本上面试90%问原理!!!
public class Ch07 { public static void main(String[] args) { Map<String, String> map = new HashMap<>(); map.put("1001","张岳"); map.put("1002","赵红兵"); map.put("1003","小北京"); map.put("1004","李四"); map.put("1004","张浩然"); map.put("1005","张浩然"); System.out.println(map); System.out.println(map.get("1003")); System.out.println(map.values()); System.out.println(map.keySet()); }
面试题:
| Hashtable 和 HashMap 的区别: |
1.HashMap 是线程同步,线程不安全,Hashtable是线程同步的,线程安全 2.HashMap 的 key 是可以为 null 的,Hashtable是不可以为 null 的。 |
public class Ch08 { public static void main(String[] args) { Map<String, String> map = new HashMap<>(); map.put(null,null); System.out.println(map); Hashtable<String, String> table = new Hashtable<>(); table.put(null,null); System.out.println(table); }
Properties:属性
Properties 是 Hashtable 的子类,更多的是在操作属性文件。
import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * List集合的遍历 */ public class Ch10 { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); // 1.for循环 // for (int i = 0; i < list.size(); i++) { // System.out.println(list.get(i)); // } // 2.foreach语句 // for (String s : list) { // System.out.println(s); // } // 3.迭代器 Iterator<String> iterator = list.iterator(); while(iterator.hasNext()) { String s = iterator.next(); iterator.remove(); // System.out.println(s); } System.out.println(list); }
两种方法:
import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.HashSet; import java.util.Iterator; import java.util.Set; public class Ch11 { public static void main(String[] args) { Set<Integer> set = new HashSet<>(); set.add(4); set.add(15); set.add(38); // 2.迭代器 Iterator<Integer> iterator = set.iterator(); while(iterator.hasNext()) { System.out.println(iterator.next()); } // 1.增强for // for (Integer integer : set) { // System.out.println(integer); // } // for (int i = 0; i < set.size(); i++) { // // }
Entry是hashmap的一个内部类,每一组键值对就是一个Entry对象
import java.util.*; public class Ch12 { public static void main(String[] args) { Map<String, String> map = new HashMap<>(); map.put("1001","张岳"); map.put("1002","赵红兵"); map.put("1003","小北京"); map.put("1004","李四"); map.put("1005","张浩然"); // 4.迭代器 Set<String> strings = map.keySet(); Iterator<String> iterator = strings.iterator(); while(iterator.hasNext()) { String s = iterator.next(); System.out.println(s + "->" + map.get(s)); } // 3.增强for循环 // Entry是hashmap的一个内部类 // 每一组键值对就是一个Entry对象 // Set<Map.Entry<String, String>> entries = map.entrySet(); // for (Map.Entry<String, String> entry : entries) { // System.out.print(entry.getKey() + "->"); // System.out.println(entry.getValue()); // } // 2.增强for循环 // Set<String> strings = map.keySet(); // Collection<String> values = map.values(); // 1.for循环 // Set<String> strings = map.keySet(); // for (String s : strings) { // System.out.println(s + "->" + map.get(s)); // }
迭代中删除元素:
import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Objects; public class Ch13 { public static void main(String[] args) { List<String> names = new ArrayList<>(); names.add("tom"); names.add("lucy"); names.add("lucy"); names.add("lucy"); names.add("jerry"); // for (int i = 0; i < names.size(); i++) { // if(Objects.equals(names.get(i),"lucy")){ // names.remove(i); // // 1.回调指针 // i--; // } //// if("lucy".equals(names.get(i))){ //// //// } // } // 2.逆序遍历 // for (int i = names.size() - 1; i >= 0; i--) { // if(Objects.equals(names.get(i),"lucy")){ // names.remove(i); // } // } // 3.使用迭代器(推荐)万无一失 Iterator<String> iterator = names.iterator(); while(iterator.hasNext()) { String s = iterator.next(); if(Objects.equals(s,"lucy")){ iterator.remove(); } } // 4.增强for循环 // for (String s : names) { // if(Objects.equals(s,"lucy")){ // names.remove(names.indexOf(s)); // } // } System.out.println(names); }
其他的集合:
1.LinkedHashMap,在HashMap的基础上维护了一个双向链表。
2.TreeMap:天然支持排序
3.Collections:Collections是一个工具类
面试题:
线程安全问题:
迭代器是依赖于集合而存在,在判断成功以后,集合中新增了元素,迭代器不知道,所以就报错。
解决:
1.迭代器遍历元素,迭代器删除元素
2.普通for循环遍历,集合删除
返回值代表什么?
int
代表排序结果
- 负数-1:比较的两个值调用者小
- 0:两个值相等
- 正数1:比较的两个值调用者大
@Override public int compareTo(Person p) { if(this.id > p.id){ return -1; } if(this.id.equals(p.id)){ return 0; } return 1; } }
集合需要掌握的:
- 1.如何创建需要的集合。多态
- 2.主要用到的是List和Map
- 3.各种区别?
- 4.各种集合API的调用
- 5.两个比较接口
- 6.各种集合的特点,从接口层面,到实现类层面
- 7.重点集合的内部结构。ArrayList,HashSet,HashMap
- 8.各种集合的遍历
- 9.并发问题
最重要的集合:
ArrayList、HashMap
积压的问题:
- 1.synchronize原理
- 2.ReentrantLock原理
- 3.ArrayList原理
- 4.LinkedList原理
- 5.HashMap原理***
- 6.HashSet原理
List->Map->Set
浙公网安备 33010602011771号
你点我就回上面去了ヾ(≧O≦)〃嗷~