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

110d43cac9669e269d47b8f174490df2.png

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

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

一、代码块加载顺序

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

二、类加载器双亲委派

1. 类的加载过程

①. 类的加载

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

②. 类的链接

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

③. 类的初始化

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

2. 类的加载器

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

3. 双亲委派

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

424572d1b821001c5309506068f71bb2.png

三、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方法

aa86e398ad8e9233e63bc02a794bb75f.png

四、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. 有序,可重复

cee349f932a2cad38ee6d2cff7fd2f88.png

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次方

38dc2e20b707eb02b6df0cba84665139.png

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获取类对象,使用缓存

e6a1338c0a653af9bff3c70c5a057d6a.png

八、lambda表达式

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

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

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

九、= =和equals

1. = =

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

2. equals

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

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

18a956f6db35fa27c4884439e51da35f.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332407.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Maven的构件坐标(GAV)

groupld 定义了项目属于哪个组&#xff0c;这个组往往和项目所在的组织或公司存在关联。譬如在 googlecode 上建立了一个名为 myapp 的项目&#xff0c;那么 groupld 就应该是 com.googlecode.myapp&#xff0c;如果你的公司是 htlwk&#xff0c;有一个项目为qpw&#xff0c;那…

rails jquery_Spring与Rails的jQuery UJS

rails jquery我一直想尝试一下是否可以在Spring Boot项目中使用Rails的jQuery UJS 。 jquery-ujs中的UJS代表简洁的JavaScript 。 我非常喜欢UJS如何将事件处理程序连接到标记有HTML5 data-*属性的合格DOM元素。 我发现自己希望看到更多在Spring Boot Web应用程序中使用的这种方…

python读word文档doc公文标题_python – 从word doc中提取标题文本

我试图从MS Word文档(.docx文件)中的标题(任何级别)中提取文本.目前我正在尝试使用python-docx来解决,但不幸的是我仍然无法弄清楚它是否在阅读之后是否可行(也许我错了). 我试图在线寻找解决方案,但没有发现我的任务特定.如果有人可以在这里指导我,那将是很棒的. 解决方法: 基…

序列化和反序列化的学习

文章目录序列化构造方法方法使用步骤反序列化构造方法方法使用步骤序列化 把内存中的对象以流的方式写入到文件中&#xff0c;这叫序列化&#xff0c;也叫“写对象” 使用 ObjectOutputStream 写入对象中的数据&#xff0c;这个流叫对象字节输出流&#xff0c;也叫对象的序列化…

java开发展望怎么写_Java开发趋势:2019年展望

java开发展望怎么写在这篇文章中&#xff0c;我们将发表一篇有关2019年Java开发趋势的综合文章。您是否知道Java自上世纪问世以来&#xff0c;现在已在100亿个设备上运行 &#xff1f; 它是数十年来最受欢迎的编码语言&#xff0c;但是在最近几个月中&#xff0c;Java经历了一些…

dml语句包括哪些_MySQL数据操作(DML)语句,入门掌握这些足够了

DML是(Data Manipulation Languages)数据定义语言的缩写主要包括表记录的插入insert、更新update、删除select插入记录insert into table(field1,field2,...fieldn) values(value1,value2,...value)如&#xff1a;向表 emp 中插入以下记录:---------------------------| ename …

Servlet 的实例对象

Servlet 实例是由 Servlet 容器自动创建&#xff0c;也可以说是由 Web Server 创建的。 当请求到达服务器的时候&#xff0c;或者在 web.xml 中配置了 init 方法的时候&#xff0c;容器就会自动创建 Servlet 实例。 如果在 web.xml 中配置了 init 方法&#xff0c;那么启动服…

java 手动装箱拆箱对象_将旧对象装箱可自动关闭

java 手动装箱拆箱对象从Java 7开始&#xff0c;我们可以使用try-with-resources并自动关闭任何实现Autocloseable接口的对象。 如果资源是 Autocloseable 。 一些类需要一些总结&#xff0c;但不是Autocloseable 。 这些主要是某些遗留框架中的旧类&#xff0c;仍然妨碍我们前…

delphi查看源码版本_[Mybatis]-IDEA导入Mybatis源码

该系列文章针对 Mybatis 3.5.1 版本一、下载 Mybatis 源码step1、下载 Mybatis-3.5.1 源码Mybatis 源码仓库地址下载版本信息如下&#xff1a;下载后进行解压&#xff0c;并打开 pom 文件&#xff0c;查看pom 中的父级依赖&#xff0c;如下&#xff1a;根据上述版本信息&#x…

Struts项目中,检测用户名是否被占用/查询账户名称是否被占用/查询账户名称是否已被注册/检查用户名是否被注册

在客户端无法检测注册用户名是否被占用&#xff0c;这需要查询数据库&#xff0c;所以是服务器端负责这块。 实现思路大致描述&#xff1a; 注册表单中添加自动检测用户名是否被占用的功能&#xff0c;其实就是利用 ajax 向服务器发送请求&#xff0c;并带着用户输入的用户名过…

羽毛球双打区域_测试双打简介

羽毛球双打区域当您编写单元测试时&#xff0c;您会遇到许多协作者&#xff0c;而且他们都有非常特殊的行为&#xff0c;知道在正确的时间必须使用哪种测试两倍可以使您的生活更轻松。 假 第一个是Dummy对象&#xff0c;它是最简单的一个&#xff0c;Dummy只是您为满足构造函数…

可为空的对象必须具有一个值_前端:这里有8个常见的JavaScript经典问题,总有一个你不会的...

参考前端小智&#xff1a;https://juejin.im/post/5d2d146bf265da1b9163c5c91.了解函数提升使用var关键字声明的变量在JavaScript中会被提升&#xff0c;并在内存中分配值undefined。 但初始化恰发生在你给变量赋值的地方。 另外&#xff0c;var声明的变量是函数作用域的&#…

Struts2的配置文件struts.xml详解

<?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd"> <struts><!-- 所有匹…

hibernate教程_Hibernate多对多教程

hibernate教程介绍&#xff1a; 在本教程中&#xff0c;我们将学习使用Hibernate ManyToMany注释定义和使用多对多实体关联。 上下文构建&#xff1a; 为了继续学习本教程&#xff0c;我们假设我们有两个实体– 雇员和资格&#xff1a; 众所周知&#xff0c;一名员工可以拥有…

python常用命令格式_python常用命令有哪些

原标题&#xff1a;python常用命令有哪些 Python是一种计算机程序设计语言。是一种动态的、面向对象的脚本语言。它包含了许多命令来帮助我们实现各种各有的功能&#xff0c;接下来在文章中为大家分享【推荐课程&#xff1a;Python教程】 &#xff08;1&#xff09;打开csv文件…

java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.LoopTag

开发工具&#xff1a;IntelliJ IDEA for Mac 开发项目&#xff1a;struts2-demo 构建工件&#xff1a;Maven 问题描述&#xff1a;在 jsp 中使用了 jstl 标签 <c:forEach>&#xff0c;浏览器访问 Action 组件提示错误&#xff1a; java.lang.ClassNotFoundException: ja…

latex 多行公式_Markdown中输入多行并列的公式

本篇旨在以两个Markdown文件编辑器-Typora与Visual Code Studio为例&#xff0c; 说明对于多行并列公式不同的处理方式。Latex中输入多行并列公式在latex文件编辑器中使用align环境输入多行并列的公式&#xff0c; 如下例&#xff1a;begin{align} x & v_0costheta t y &am…

java 常规类的可见性_Java 12常规可用性

java 常规类的可见性马克雷因霍尔德&#xff08;Mark Reinhold&#xff09; 今天宣布 &#xff0c;“ Java 12的参考实现JDK 12现在已全面上市。” Reinhold在该公告中指出&#xff0c;“可以从https://jdk.java.net/12获得来自Oracle的GPL许可的OpenJDK构建&#xff0c;并且“…

python支持复数以及相关的运算吗_Python: 复数的数学运算

写的最新的网络认证方案代码遇到了一个难题&#xff0c;唯一的解决办法就是使用复数空间&#xff0c;需要使用复数来执行一些计算操作。 复数可以用使用函数complex(real, imag) 或者是带有后缀j 的浮点数来指定。 比如&#xff1a; >>> a complex(2, 4) >>>…