this.hash = hash;
this.key = key;
this.value = value;
this.next = next;
}
…
}
看到上面代码Node里面的next,是一个单链表结构,而结合table是一个Node数组,可以判断出HashMap是一个数组加链表的结构。下面我总结一下HashMap的结构图:
2、HashMap 排序题
已知一个HashMap<Integer,User>集合, User 有name(String)和age(int)属性。请写一个方法实现
对HashMap 的排序功能,该方法接收HashMap<Integer,User>为形参,返回类型为HashMap<Integer,User>,要求对HashMap 中的User 的age 倒序进行排序。排序时key=value 键值对不得拆散。
Tips:要做出这道题必须对集合的体系结构非常的熟悉。HashMap 本身就是不可排序的,但是该道题偏偏让给HashMap 排序,那我们就得想在API 中有没有这样的Map 结构是有序的,LinkedHashMap,对的,就是他,他是Map 结构,也是链表结构,有序的,更可喜的是他是HashMap 的子类,我们返回LinkedHashMap<Integer,User>即可,还符合面向接口(父类编程的思想)。但凡是对集合的操作,我们应该保持一个原则就是能用JDK 中的API 就有JDK 中的API,比如排序算法我们不应该去用冒泡或者选择, 而是首先想到用Collections 集合工具类。
public class HashMapTest {
public static void main(String[] args) {
HashMap<Integer, User> users = new HashMap<>();
users.put(1, new User(“张三”, 25));
users.put(3, new User(“李四”, 22));
users.put(2, new User(“王五”, 28));
System.out.println(users);
HashMap<Integer,User> sortHashMap = sortHashMap(users);
System.out.println(sortHashMap);
/**
- 控制台输出内容
- {1=User [name=张三, age=25], 2=User [name=王五, age=28], 3=User [name=李四,
age=22]}
{2=User [name=王五, age=28], 1=User [name=张三, age=25], 3=User [name=李四,
age=22]}
*/
}
public static HashMap<Integer, User> sortHashMap(HashMap<Integer, User> map) {
// 首先拿到map 的键值对集合
Set<Entry<Integer, User>> entrySet = map.entrySet();
// 将set 集合转为List 集合,为什么,为了使用工具类的排序方法
List<Entry<Integer, User>> list = new ArrayList<Entry<Integer,
User>>(entrySet);
// 使用Collections 集合工具类对list 进行排序,排序规则使用匿名内部类来实现
Collections.sort(list, new Comparator<Entry<Integer, User>>() {
@Override
public int compare(Entry<Integer, User> o1, Entry<Integer, User> o2) {
//按照要求根据User 的age 的倒序进行排
return o2.getValue().getAge()-o1.getValue().getAge();
}
});
//创建一个新的有序的HashMap 子类的集合
LinkedHashMap<Integer, User> linkedHashMap = new LinkedHashMap<Integer,
User>();
//将List 中的数据存储在LinkedHashMap 中
for(Entry<Integer, User> entry : list){
linkedHashMap.put(entry.getKey(), entry.getValue());
}
//返回结果
return linkedHashMap;
}
}
3、HashMap 和HashTable 有什么区别?
1.HashMap 是线程不安全的,HashMap 是一个接口,是Map 的一个子接口,是将键映射到值得对象,不允许键值重复,允许空键和空值;由于非线程安全,HashMap 的效率要较HashTable 的效率高一些.
2.HashTable 是线程安全的一个集合,不允许null 值作为一个key 值或者Value 值;
3.HashTable 是sychronize,多个线程访问时不需要自己为它的方法实现同步,而HashMap 在被多个线程访问的时候需要自己为它的方法实现同步;
Android进阶必备Java高阶知识点
一、深入理解Java泛型
1、泛型的作用与定义
2、通配符与嵌套
3、泛型的上下边界
4、RxJava中深入理解泛型
二、注解
- 注解(ANNOTATIONS)概念、什么是注解
- 元注解;什么是元注解、元注解的使用
- 自定义注解
- 默认参数值(DEFAULT PARAMETER VALUES)
- 什么是APT,如何在Android Studio中构建一个APT项目?
- 插桩
- 反射
- Retrofit中的注解
三、并发编程
1、基础概念
1)CPU核心数、线程数
2)CPU时间片轮转机制
####2、线程之间的共享
1)synchronized内置锁
2)volatile 关键字
3)线程私有变量 ThreadLocal
3、线程间的协作
1)什么是CAS?
2)CAS(Compare And Swap)导致的ABA问题
4、线程池的使用
1)Java中的ThreadPoolExecutor类
2)深入剖析线程池实现原理
3)如何合理配置线程池的大小
四、数据传输与序列化
1、Serializable原理
1.概念
- 序列化:把Java对象转换为字节序列的过程。
- 反序列化:把字节序列恢复为Java对象的过程。
2.用途 对象的序列化主要有两种用途:
1)把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中。
2)在网络上传送对象的字节序列。
2、Parcelable的原理和使用方法
- Android源码中的Parcelable
3、Json
一种数据传输格式,与开发语言无关,轻量级。
一开始是javaScript的,但是后面比较流传,几乎所有语言都有相应的使用API。
五、Java虚拟机原理
1、垃圾回收
1)如何判断对象已“死”
2)回收方法区
3)垃圾回收算法
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
结语
看到这篇文章的人不知道有多少是和我一样的Android程序员。
35岁,这是我们这个行业普遍的失业高发阶段,这种情况下如果还不提升自己的技能,进阶发展,我想,很可能就是本行业的职业生涯的终点了。
我们要有危机意识,切莫等到一切都成定局时才开始追悔莫及。只要有规划的,有系统地学习,进阶提升自己并不难,给自己多充一点电,你才能走的更远。
千里之行始于足下。这是上小学时,那种一元钱一个的日记本上每一页下面都印刷有的一句话,当时只觉得这句话很短,后来渐渐长大才慢慢明白这句话的真正的含义。
有了学习的想法就赶快行动起来吧,不要被其他的事情牵绊住了前行的脚步。不要等到裁员时才开始担忧,不要等到面试前一晚才开始紧张,不要等到35岁甚至更晚才开始想起来要学习要进阶。
给大家一份系统的Android学习进阶资料,希望这份资料可以给大家提供帮助。
义。
有了学习的想法就赶快行动起来吧,不要被其他的事情牵绊住了前行的脚步。不要等到裁员时才开始担忧,不要等到面试前一晚才开始紧张,不要等到35岁甚至更晚才开始想起来要学习要进阶。
给大家一份系统的Android学习进阶资料,希望这份资料可以给大家提供帮助。
[外链图片转存中…(img-yb3SbR0W-1711883139721)]