欢迎关注专栏《Java架构筑基》——专注于Java技术的研究与分享!

Java架构筑基​zhuanlan.zhihu.com

  • Java架构筑基——专注于Java技术的研究与分享!
  • 后续文章将首发此专栏!
  • 欢迎各位Java工程师朋友投稿和关注
  • # 链接 Java程序员福利"常用资料分享"

一、代码块加载顺序

  1. 静态代码块只会加载1次,在普通代码块前执行,会在类链接中的准备阶段执行
  2. 普通代码块每次new的时候都会加载,在构造方法前执行,其实是编译的时候,代码被放到构造函数前
  3. 构造函数每次new都会加载。构造函数默认前面是super0方法。默认会先调用父类的构造函数

二、类加载器双亲委派

1. 类的加载过程

①. 类的加载

class文件加入内存,生成class对象

②. 类的链接

  • 验证:验证class文件是否满足JVM规范
  • 准备:静态类变量默认初始化
  • 解析:常虽池的符号引用替换为直接引用

③. 类的初始化

类构造器(构造方法和静态代码块)初始化

2. 类的加载器

  • bootStrapClassLoader:核心加载器
  • ExtersionClassLoader:扩展加载器
  • SystemClassLoader:系统加载器
  • ApplicationClassLoader:应用加载器
  • 自定义加载器

3. 双亲委派

  • 保证加载的关是唯一的.只会有份所以向上由父类加载
  • 与Tomcat不满足双亲委派

三、String

1. Stringa= "adf"

  • adf存在于方法区的常量池,栈空间的a直接指向常量池的adf

2. String b = new String(" adf")

  • adf存在于常量池,堆空间生成对象,对象实际存储指向常量池adf的地址,栈空间的b指向堆空间的地址

3. Stringc= "adf" + "df";Stringd = "adfdf";Stringe= a +"df"

  • c和d栈都指向常量池的adfdf. e保存了堆中对象,对象指向的是常量池中的adfdf值
  • 直接常量操作,返回的地址是在常量池
  • 经过new或者不是纯常量操作,会进行一-次new在堆中生成对象, 对象在指向常量池中数据
  • final修饰的String也在常量池

4. final修饰,不可以被继承(不可以被修改)

  • 出于安全考虑,java很多类都用字符串来描述
  • 处于内存考虑,字符串被常用,共享同一块内存,减少内存使用量

5. 一般字符串的内部操作

  • 转成数组,toCharArray0
  • 数组操作变化值
  • String构造函数数组转为字符串

6. length0方法

  • 返回字符串的实际长度,字符串没有size0方法

四、Integer

1. 直接赋值或者ValueOf田

  • 享元模式,池的技术
  • -128~127是常量,在堆中只会有一个对象

2. new的话,是在堆中生成新对象

3. BigInteger是整形,任意大小

4. BigDecimal是浮点型,任意精度

五、注解

1. 元注解

  • 修饰注解
  • @Retention:注解的生命周期,Compile编译, class类对象, RunTimer运行时(此生命周期才可以用被反射拿到)
  • @Target:接口,类,方法,变量,构造器
  • @Inherited:注解具有继承性,随着类继承存在

2. 可重复注解, 类型注解

  • Java8新特性

六、集合

1. 存储单值

①. 数组

  • []初始化后长度不可以更改
  • 插入删除效率不高
  • 查找速度快
  • 只有length成员变量表示长度,没有其他的可用API

②. collection

A. set

a. 实现

treeset

  • 底层是treemap.数据是红黑树结构
  • 可以按属性进行排序,指定排序规则
  • 需要重写比较函数,被存数据继承comparable接口(数据是否相同按compareto决定)

linkedhashSet

  • 按添加的顺序有序
  • 底层也是linkedhashmap,数据+链表
  • 在原有的hashset的基础上增加了添加元素的链接关系,使添加数据有序(对频繁的遍历要比hashset快)

hashSet

  • 存储无序的
  • 底层是hashmap,也是数组+链表存的

b. 无序不可重复

c. linkedhashset和hashset的数据,一定要重写,并且要求hashcode方法和equals方法一致

  • hashcode决定了key存储位置
  • equals决定了key是否相等

B. list

a. 实现

arrayList线程不安全

  • 数组
  • 适用增删改少,遍历多

vector线程安全

  • 数组:stack继承于vector

linkedList

  • 链表
  • 使用增删改多,遍历少

b. 有序,可重复

2. 存储对值(map)

①. hashMap线程不安全

  • 底层树数组+链表
  • java8后,数组+链表/红黑树,链表长度大于8的时候转红黑树
  • 复合的数据需要重写hashcode和equals方法
  • 多线程下死循环
    • 主要是rehash函数
    • 内部链表重写计算的时候,多线程下会出现环
    • 链表的环造成get数据的时候会出现死循环

②. linkedHashMap线程不安全

  • 底层是数组+链表/红黑树
  • 根据添加数据的顺序,有指针关联添加的数据,数据按添加顺序有序
  • 复合的数据需要重写hashcode和equals方法

③. concurrentHashMap分段锁线程安全

  • 复合的数据需要重写hashcode和equals方法
  • java1.7是数据的分段锁
  • java1.8是CAS实现的

④. hashTable线程安全

  • 方法用Synchronize修饰的
  • 不能有null的key和值
  • 复合的数据需要重写hashcode和equals方法
  • 子类: Properties 取配置文件的数据

⑤. treeMap有序的

  • 底层是红黑树结构
  • 存储的数据需要实现Comparable接口

⑥. key是无序的,不可以重复,使用set存储所有的key; Entry是无序, 可重复

⑦. 扩容

  • 容量的0.75的时候,会扩容,扩为原来的两倍,将数据拷贝到新的空间
  • Jdk7. Jdk8默认初始数组大小是16
  • Jdk8当链表长度超过8,就改用红黑树存储
  • Jdk8底层是Node[]数组,Jdk是Entry[数组
  • 最大容量2的30次方

3. collections

集合相关的静态方法集

4. 排序

  • 自然排序:实现comparable重写compareTo(Object o)方法(随处可用的比较)
  • 定制排序:实现comparator重写compare(Object o1,Object o2)方法(临时性的比较)

5. sizeQ方法

返回的是元素的个数,集合是没有length方法的

6. 数组和集合的相互转换

  • toArray0集合变数组
  • Arrays.asList ()数组变集合(注意,存的数据要是对象)

7. 集合遍历方式

  • for循环
  • iteraton迭代器
  • foreach方式
  • java8新特性,streem流

8. 通配符?

List<?>

  • 可以写入null,不能写入数据
  • 可以读数据
  • List<? super A>; List<? extends A>有限制条件的通配符

七、反射

1. 动态语言的特性,拿到运行时对象的状态类信息,class对象, 增加了代码的灵活性

2. 缺点:执行效率低,性能差

3. 功能

①. 拿到运行时对象的类信息

②. 根据运行时对象信息创建对象

③. 根据运行时对象信息使用其方法

④. 根据运行时对象信息修改成员,修改私有成员

⑤. 动态代理

  • 创建一个实现接DInvocationHandler的类,它必须实现invoke方法
  • 创建需要被代理接口和实现类
  • 通过Pry)的I态nnewporvatalasloaderlader Cass iterfaces. InocationHander h)创建个代理
  • 通过代理调用方法
  • 生成的动态代理关会调用nvocationHandler实现类中的invoke方法
  • invoke方法中我们可以选择执行被代理实现类的方法,并在其前后进行处理

4. 拿到class对象

  • 类名.class
  • 对象.getClass0
  • Class类的静态方法forName0
  • ClassLoader对象的IoadClass0方法获取

5. class对象的作用

  • Constructor拿到类的构造函数,实例化对象
  • Field拿到类的属性
  • Method拿到类的方法(Invoke调用方法)

6. 提升反射使用的效率

  • 尽量不要getMethods0后再遍历筛选,而直接用getMethod(methodName)来根据方法名获取方法
  • forName获取类对象,使用缓存

八、lambda表达式

1. 实质:作为接口的实例

2. 接口需要是函数式接口

  • 接口中只有一个抽象函数
  • 可以用注解声明接口,@FunctionInterface
  • util.function包下有大量的函数式接门

九、= =和equals

1. = =

  • 基本数据类型比较值
  • 引用类型比较地址

2. equals

  • 比较的是引用类型
  • 重写过的quls比较的是地址obiec的原生方法批比较的是地址

# 链接 Java程序员福利"常用资料分享"

java list有序还是无序_最详细的Java学习点知识脑图,从基础到进阶,看完还有啥你不懂的...相关推荐

  1. java list有序还是无序_牛批!2w字的Java集合框架面试题精华集(2020最新版),赶紧收藏。...

    一个多月前,作者和一些小伙伴决定做一系列的 Java 知识点常见重要问题的小册,方便用来夯实基础!小册的标准就一个,那就是:取精华,取重点.每一本小册,我们都会充分关注我们所总结的知识点是否达到这个标 ...

  2. java犀牛是什么意思_深入浅出Rhino:Java与JS互操作

    2011年10月6日,一年一度的JavaOne大会隆重举行.JavaOne2011大会的主题之一介绍针对不同Java平台的产品路线图,这其中包括移动版(ME,Micro Edition).标准版(SE ...

  3. java 嵌入式 类型工具库_你常用的Java工具库都有哪些?

    Java命令行选项解析之Commons-CLI & Args4J & JCommander详细内容 Java调用Native API之JNA详细内容 Java执行SSH/SCP之JSc ...

  4. java 头尾 队列_超详细的java集合讲解

    1 集合 1.1 为什么会出现集合框架 [1] 之前的数组作为容器时,不能自动拓容 [2] 数值在进行添加和删除操作时,需要开发者自己实现添加和删除. 1.2 Collection接口 1.2.1 C ...

  5. hashmap是有序还是无序_说实话,你要是看完这篇 HashMap ,和面试官扯皮真的就没问题了!

    文章来源:看完这篇 HashMap ,和面试官扯皮就没问题了 原文作者:cxuan 来源平台:微信公众号 (如果你没有时间细抠本文,可以直接看 HashMap 概述,能让你对 HashMap 有个大致 ...

  6. java寻找最大的字母_【LeetCode(Java) - 744】寻找比目标字母大的最小字母

    [LeetCode(Java) - 744]寻找比目标字母大的最小字母 [LeetCode(Java) - 744]寻找比目标字母大的最小字母 文章目录 1.题目描述 2.解题思路 3.解题代码 1. ...

  7. java分页中显示更多_早期更多失败– Java 8

    java分页中显示更多 快速失败或早期失败是一种软件工程概念,旨在通过在不应该发生的事情发生时立即停止执行来防止复杂问题的发生. 在之前的博客文章和演示中,我将详细介绍这种方法的优点,在此博客文章中, ...

  8. java国际化 英语的标识符_(转)Java 国际化

    1. Java国际化简介 Java既然作为一个跨平台的语言就必然要在各种不同的语言环境中使用, 为了解决这个问题Java给我们提供了一个工具类ResourceBundle, 帮助我们实现Java的国际 ...

  9. Java游戏里面的星球大战_星球大战手机游戏-JAVA程序算法

    内容简介: 毕业设计 星球大战手机游戏-JAVA程序算法,共18页,9196字 摘 要 近年来,随着各种不同设备,尤其是移动通信设备的飞速发展诞生了一项新的开发技术-J2ME.它定位在消费性电子产品的 ...

最新文章

  1. 马上 2018 年了,该不该下定决心转型AI呢?
  2. hdu2846(2009多校第四场) 字典树
  3. Yii 1.1.4发布,高性能的PHP框架
  4. wordpress.org手动安装主题
  5. 01. Node js Hello world
  6. Docker上部署GitLab , 搭建私有Git仓库 (基于Docker镜像sameersbn/docker-gitlab)
  7. 挖掘频繁模式、关联和相关性:基本概念和方法
  8. 关于eclipse环境启动不成功的问题解决方法
  9. initrd.img处理
  10. Factorization Machine 1
  11. 投身管理工作(项目经理修炼手册正文的开头)
  12. 纪念我的第一次面试——华为研发类面试
  13. c语言代码后return0表示什么意思,return 0是什么意思 ?
  14. golang 实现苹果内购服务端验证
  15. Latex + vscode + SumatraPdf配置的一些历程
  16. 火影忍者新忍出击服务器正在维修,火影忍者手游更新公告 新忍出击资源翻倍...
  17. 19 分布式缓存集群的伸缩性设计
  18. 多米诺骨牌上演:三箭资本崩盘始末
  19. 赵小楼《天道》《遥远的救世主》深度解析(41)芮小丹的恋爱观背后的文化属性
  20. Hi3516CV500/Hi3516AV300/Hi3516DV300 SDK编译

热门文章

  1. rabbitmq 传递文件_使用RabbitMQ进行消息传递
  2. java api 开发_Java开发人员应该知道的前20个库和API
  3. java名 java_Java Syncrhonisers
  4. 博科光纤交换机java_带有光纤的可扩展,健壮和标准的Java Web服务
  5. JMetro 5.5版发布
  6. lucene 搜索_使用Lucene的搜索服务器搜索Jira问题
  7. 开源软件加密授权方案_身份验证和授权作为开源解决方案服务
  8. OAuth2,JWT,Open-ID Connect和其他令人困惑的事物
  9. Java EE 7中的WebSocket客户端API
  10. java中文件处理之图片_在Java 7中处理文件