![](https://img-blog.csdnimg.cn/20200311162434894.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java基础学习
文章平均质量分 86
记录关于学习Java的历程
编程芝士
字节跳动后端工程师,测控专业转程序员,努力努力,为了家人和蝈蝈!
展开
-
【Java学习记录】 目录
这里记录了学习Java基础的过程。列出目录方便从这里直接查找,目前仍然在学习中,博客和目录都会一直更新。【Java学习记录】一 Java中的继承【Java学习记录】二 Java中数组的简单操作【Java学习记录】三 Java中的面向对象内存分析【Java学习记录】四 Java中的垃圾回收【Java学习记录】五 Java中的this关键字【Java学习记录】六 Java中的s...原创 2019-06-04 12:35:57 · 473 阅读 · 3 评论 -
ConcurrentHashMap底层详解(图解扩容)(JDK1.8)
数据结构使用数组+链表+红黑树来实现,利用 CAS + synchronized 来保证并发更新的安全源码分析put方法 public V put(K key, V value) { return putVal(key, value, false); } final V putVal(K key, V value, boolean onlyIfAbsent) { if (key == null || value == null) throw原创 2020-06-13 23:32:50 · 28822 阅读 · 29 评论 -
ConcurrentHashMap底层详解(JDK1.7)
为什么要使用ConcurrentHashMapHashMap是线程不安全的,因为在put操作时可能会出现数据被覆盖的情况(JDK8),在JDK7中还存在扩容时产生死循环的问题。。而使用线程安全的HashTable效率又非常低下,因此可以使用ConcurrentHashMap。HashTable效率低下是因为使用synchronized来保证线程安全。当一个线程访问HashTable的同步方法,其他线程也访问HashTable的同步方法时,会进入阻塞或轮询状态。如线程1使用put进行元素添加,线程2不但原创 2020-06-11 20:09:24 · 10471 阅读 · 0 评论 -
图解HashMap为什么线程不安全?
HashMap的线程不安全主要体现在下面两个方面:1.在JDK1.7中,当并发执行扩容操作时会造成环形链和数据丢失的情况。2.在JDK1.8中,在并发执行put操作时会发生数据覆盖的情况。原创 2020-06-10 16:43:01 · 31092 阅读 · 13 评论 -
【Redis】集群
什么是集群集群就是使用网络将若干台计算机连接到一起,并且提供同一的管理方式,使其对外呈现单机的服务效果。集群作用分散单台服务器的访问压力,实现负载均衡分散单台服务器的存储压力,实现可扩展性降低单台服务器宕机带来的灾难性的影响Redis集群结构设计Redis会将所有的服务器的存储空间等分切割为16384份,切割后的每一个空间称之为一个槽当需要存储数据时,首先将该数据通过RCR16(循环冗余校验)生成的值与16384取模,得到结果按照key计算得到的结果,存储至对应的槽中当有新的服务器加原创 2020-05-30 22:25:46 · 192 阅读 · 1 评论 -
【Java基础】正则表达式
作用在编写字符串处理程序时,经常会遇到查找符合某种规则的字符串,正则表达式就是用于描述这些规则的工具,或者说正则表达式是用来指定字符串模式的。下面是一个简单的例子:[Jj]ava.+它可以匹配符合下面形式的字符串:第一个字母是J或者j 下面的三个字符是ava 字符串的剩余部分可以是任意个字符串语法因此需要定义一些语法来理解正则表达式的含义。一个字符类是可选的字符集合,用括号括起,例如[Jj ], [0-町、[A-Za-z]或者[^0-9] 。这里“-”表示一个范围,而“原创 2020-05-11 08:25:10 · 306 阅读 · 0 评论 -
最详细HashMap底层详解(附常见面试题)
Map家族先来看看HashMap在Map这个大家族中的位置。这四种比较常见:HashMap , Hashtable , LinkedHashMap,TreeMapHashMap存取速度快,它根据键的hashcode值存储数据,线程不安全,只有一个键允许为null,对值没有限制,对数据进行遍历的话读取的随机的。如果想要同步,可以用Collections的synchronizedMap方法使H...原创 2020-05-01 23:59:08 · 7385 阅读 · 2 评论 -
JQuery是什么
jQuery是什么概念: 一个JavaScript框架。简化JS开发jQuery是一个快速、简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架)。jQuery设计的宗旨是“write Less,Do More”,即倡导写更少的代码,做更多的事情。它封装JavaScript常用的功能代码,提供一种简便的JavaScri...原创 2020-04-25 23:31:59 · 2974 阅读 · 0 评论 -
【java基础】 LinkedList总结
LinkedList总结底层实现LinkedList的继承关系如下图所示:源码:public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable{ tra...原创 2020-04-22 15:14:39 · 185 阅读 · 0 评论 -
【Java基础】 Junit 单元测试
测试的分类测试可以分为黑盒测试和白盒测试。黑盒测试黑盒测试又叫功能测试或基于需求规格说明书的功能测试。该类测试注重于测试软件的功能性需求。完全不考虑程序内部的逻辑结构和内部特性。白盒测试白盒测试又称透明盒测试或基于代码的测试。白盒测试是一种测试用例设计方法,盒子指的是被测试的软件,白盒指的是盒子是可视的,即清楚盒子内部的东西以及里面是如何运作的。Junit 测试就是白盒测...原创 2020-03-10 17:07:30 · 743 阅读 · 0 评论 -
【Java基础】 注解
1.什么是注解1.1概念说明程序的,给计算机看的。什么是注释:用文字描述程序的,给程序员看的。百度上的解释:Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制,是一种代码级别的说明。Java 语言中的类、方法、变量、参数和包等都可以被标注。和 Javadoc 不同,Java 标注可以通过反射获取标注内容。在编译器生成类文件时,标注可...原创 2020-03-06 21:50:25 · 1513 阅读 · 0 评论 -
【Java基础】 反射机制
1.反射:框架设计的灵魂1.1框架是半成品的软件,可以在框架的基础上进行软件开发,简化编码。学习框架并不需要了解反射,但是要是想自己写一个框架,那么就要对反射机制有很深入的了解。1.2反射概念:将类的各个组成部分封装成为其他对象,这就是反射机制。反射的好处:可以在程序运行过程中,操作这些对象。 可以解耦,提高程序的可扩展性。Java代码在计算机中经历的三个阶段(1)...原创 2020-03-04 00:09:15 · 798 阅读 · 0 评论 -
【Java学习记录】一 Java中的继承
概念面向对象程序设计语言有三大特性:封装、继承和多态性。继承是面向对象语言的重要特征之一,没有继承的语言只能被称作“使用对象的语言”。继承是非常简单而强大的设计思想,它提供了我们代码重用和程序组织的有力工具。类是规则,用来制造对象的规则。我们不断地定义类,用定义的类制造一些对象。类定义了对象的属性和行为,就像图纸决定了房子要盖成什么样子。一张图纸可以盖很多房子,它们都是相同的房子,但是...原创 2019-03-25 22:49:40 · 326 阅读 · 0 评论 -
【Java学习记录】二 Java中数组的简单操作
数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中存储的。在java 中,声明一个数组时,不能直接限定数组长度,只有在创建实例化对象时,才能对给定数组长度.。数组的基本使用public class TestArry { public stat...原创 2019-05-01 11:31:44 · 328 阅读 · 0 评论 -
【Java学习记录】三 Java中的面向对象内存分析
Java虚拟机的内存大致可以分为三个区域:栈stack、堆heap、方法区method area。栈的特点如下:1. 栈描述的是方法执行的内存模型。每个方法被调用都会创建一个栈帧(存储局部变量、操作数、方法出口等)2. JVM为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变量等)3. 栈属于线程私有,不能实现线程间的共享!4. 栈的存储特性是“先进后出,后进...原创 2019-05-02 22:14:31 · 161 阅读 · 0 评论 -
【Java学习记录】四 Java中的垃圾回收
垃圾回收的意义Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有“作用域”的概念,只有对象的引用才有“作用域”。垃圾回收可以有效的防止内存泄露,有效的使用空闲的内存。c++的垃圾回收是人工的,工作量大,但是可控性高。java是自动化的,但是可...原创 2019-05-02 23:24:46 · 253 阅读 · 0 评论 -
【Java学习记录】五 Java中的this关键字
对象创建的过程构造方法是创建Java对象的重要途径,通过new关键字调用构造器时,构造器也确实返回该类的对象,但这个对象并不是完全由构造器负责创建。创建一个对象分为如下四步: 1. 分配对象空间,并将对象成员变量初始化为0或空 2. 执行属性值的显示初始化 3. 执行构造方法 4. 返回对象的地址给相关的变量this的本质this的本质就是“创建好的对象的地址...原创 2019-05-03 14:02:42 · 692 阅读 · 0 评论 -
【Java学习记录】六 Java中的static关键字
今天学习了java中的static关键字的用法,在这里做一下总结。在类中,用static声明的成员变量为静态成员变量,也称为类变量。 类变量的生命周期和类相同,在整个应用程序执行期间都有效。它有如下特点:1. 为该类的公用变量,属于类,被该类的所有实例共享,在类被载入时被显式初始化。2. 对于该类的所有对象来说,static成员变量只有一份。被该类的所有对象共享!!3. 一般用“类...原创 2019-05-03 22:52:50 · 210 阅读 · 0 评论 -
【Java学习记录】七 Java中的参数传递机制
概念参数传递一般有两种,一种是“传值”,另一种是“传地址值”。对象的传递是引用传递,也就是传地址,原始类型数据(int,String等)传递是值传递,也就是拷贝一份传进去。传值是指在调用方法时,把参数的值传递给方法,而传地址值则是给方法提供参数的地址值。下面我通过例子来验证。1.普通的值传递public class User1 { public static ...原创 2019-05-04 23:07:18 · 295 阅读 · 0 评论 -
【Java学习记录】八 JAVA中方法的重写(覆盖)override与重载overload
重写在java中有很多的继承,继承下来的有变量、方法。在有一些子类要实现的方法中,方法名、传的参数、返回值跟父类中的方法一样,但具体实现又跟父类的不一样,这时候我们就需要重写父类的方法。子类通过重写父类的方法,可以用自身的行为替换父类的行为,即外壳不变,核心重写!方法的重写是实现多态的必要条件。方法的重写需要符合下面的三个要点:1.“==”:方法名、形参列表相同。2.“≤”:返回...原创 2019-05-06 13:27:14 · 209 阅读 · 0 评论 -
【Java学习记录】九 Java中的“==”和equal
”==”“==”代表比较双方是否相同。如果是基本类型则表示值相等,如果是引用类型则表示地址相等即是同一个对象。相同为true,不相同为false;基本数据类型(也称原始数据类型) :byte,short,char,int,long,float,double,boolean。equal()所有的java类均继承Ojbect,equals是Object的方法。我们看看equals是怎样实现...原创 2019-05-08 13:15:01 · 1087 阅读 · 0 评论 -
【Java学习记录】十 Java中super关键字
如果创建出一个具体的子类并且需要覆盖掉某个方法,该方法被覆盖掉后该子类又想使用父类的该方法怎么办?super关键词可以让你在子类中调用父类的方法或属性。super是直接父类对象的引用。可以通过super来访问父类中被子类覆盖的方法或属性。使用super调用普通方法,语句没有位置限制,可以在子类中随便调用。若是构造方法的第一行代码没有显式的调用super(...)或者this(....原创 2019-05-08 22:48:47 · 177 阅读 · 0 评论 -
【Java学习记录】十一 Java中的封装
封装需要让用户知道的才暴露出来,不需要让用户知道的全部隐藏起来,这就是封装。说的专业一点,封装就是把对象的属性和操作结合为一个独立的整体,并尽可能隐藏对象的内部实现细节。要访问该类的代码和数据,必须通过严格的接口控制。对象都有属性,比如人类,有姓名,有年龄,这些其实都是隐私,不会轻易告诉任何人。那既然所有人的姓名、年龄、性别都是隐私,也就是人类的这些属性是隐私的,对不对。在Java中,这些...原创 2019-05-09 09:20:45 · 138 阅读 · 0 评论 -
【Java学习记录】十二 Java中的多态
多态的三个要点: 1. 多态是方法的多态,不是属性的多态(多态与属性无关)。 2. 多态的存在要有3个必要条件:继承,方法重写,父类引用指向子类对象。 3. 父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了。多态的弊端,就是:不能使用子类特有的成员属性和子类特有的成员方法。父类Animalclass Animal {...原创 2019-05-10 23:03:41 · 195 阅读 · 0 评论 -
【Java学习记录】十三 Java中的final关键字
final关键字的作用比较好理解,分为以下几点:1. 修饰变量: 被他修饰的变量不可改变。一旦赋了初值,就不能被重新赋值。finalintSPEED=10;2. 修饰方法:该方法不可被子类重写。但是可以被重载!finalvoidstudy(){...}3. 修饰类: 修饰的类不能被继承。比如:Math、String等。finalclass...原创 2019-05-11 11:09:16 · 115 阅读 · 0 评论 -
【Java学习记录】十四 Java中的抽象类和抽象方法
概念当父类的某些方法不确定时,可以用abstract关键字来修饰该方法[抽象方法],用abstract来修饰该类[抽象类]。这种类专门用来作为父类。抽象类有点类似于模板的作用,其目的就是根据它的格式来创建和修改新的类,但是不能直接由抽象类创建对象,只能通过先创建他们的子类,再由子类来创建对象,也就是说,抽象类是不能用new运算符来创建实例对象的类,它可以作为父类被它的所有子类所共享。父类是...原创 2019-05-15 12:57:03 · 221 阅读 · 0 评论 -
【Java学习记录】十五 Java中的接口
概念上一部分已经学过抽象类,接口的结构与抽象类分厂类似,而接口是比“抽象类”还“抽象”的“抽象类”,抽象类中还允许出现普通的方法,而接口中的方法全部都是抽象方法。接口全面地专业地实现了:规范和具体实现的分离。接口的本质是契约,就像我们人间的法律一样。制定好后大家都遵守。接口与抽象类的具体不同:1.接口的数据成员都是静态的,并且必须初始化。2.接口中的方法必须全部声明为abstrac...原创 2019-05-15 14:31:05 · 180 阅读 · 0 评论 -
【Java学习记录】十六 数组的初始化方式
这结的内容非常简单而且基础。数组的初始化方式总共有三种:静态初始化、动态初始化、默认初始化。下面针对这三种方式分别讲解。静态初始化直接在定义数组的同时就为数组元素分配空间并赋值。示例:int[]a={1,2,3};//静态初始化基本类型数组;Man[]mans={newMan(1,1),newMan(2,2)};//静态初始化引用...原创 2019-05-20 13:03:18 · 567 阅读 · 0 评论 -
【Java学习记录】十七 练习题
题目1public class Test { public static void main(String[] args) { int i = 0; int j = 0; int k = 0; for(int x = 0; x < 7; x++){ if((++i > 3) &...原创 2019-05-21 08:53:46 · 784 阅读 · 0 评论 -
【Java学习记录】十八 包装类
什么是包装类Java是面向对象的语言,但并不是“纯面向对象”的,因为我们经常用到的基本数据类型就不是对象。例如java中的数据类型int,double等不是就对象,无法通过向上转型获取到Object提供的方法,而像String却可以,只因为String是一个对象而不是一个类型。为了让基本类型也具有对象的特征,就出现了包装类型。Java在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样...原创 2019-05-23 18:50:37 · 145 阅读 · 0 评论 -
【Java学习记录】十九 String类
String类String 类对象代表不可变的Unicode字符序列,因此我们可以将String对象称为“不可变对象”。什么叫做“不可变对象”呢?指的是对象内部的成员变量的值无法再改变。可以看一下它的源码:我们发现字符串内容全部存储到value[]数组中,而变量value是final类型的,也就是常量(即只能被赋值一次)。 这就是“不可变对象”的典型定义方式。查看JDK的文档就会...原创 2019-05-23 23:27:34 · 182 阅读 · 0 评论 -
【Java学习记录】二十 时间相关类
在计算机世界,我们把1970 年 1 月 1 日 00:00:00定为基准时间,每个度量单位是毫秒(1秒的千分之一)。为什么要从1970年1月1日0时0分0秒开始呢?原来 Unix 就是在那个时代产生的,1969 年发布的雏形,最早是基于硬件 60Hz 的时间计数。1971年底出版的《Unix Programmer's Manual》里定义的 Unix Time 是以 1971年1月1日0...原创 2019-05-24 09:25:27 · 176 阅读 · 0 评论 -
【Java学习记录】二十一 集合(容器)
初识容器开发和学习中需要时刻和数据打交道,如何组织这些数据是我们编程中重要的内容。 我们一般通过“容器”来容纳和管理数据。那什么是“集合”呢?生活中的容器不难理解,是用来容纳物体的,如锅碗瓢盆、箱子和包等。程序中的“集合”也有类似的功能,就是用来容纳和管理数据。数组就是一种容器,可以在其中放置对象或基本类型数据。数组的优势:是一种简单的线性序列,可以快速地访问数组元素,效率高。如果从...原创 2019-05-25 16:19:15 · 161 阅读 · 0 评论 -
【Java学习记录】二十二 泛型
泛型泛型可以帮助我们建立类型安全的集合。在使用了泛型的集合中,遍历时不必进行强制类型转换。JDK提供了支持泛型的编译器,将运行时的类型检查提前到了编译时执行,提高了代码可读性和安全性。泛型相当于标签,本质就是“数据类型的参数化”。 一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参...原创 2019-05-25 17:16:14 · 153 阅读 · 0 评论 -
【Java学习记录】二十三 List特点和常用方法
Collection 表示一组对象,它是集中、收集的意思。Collection接口的两个子接口是List、Set接口。由于List、Set是Collection的子接口,意味着所有List、Set的实现类都有Collection的方法:List与ArrayList区别List是一个接口,而ArrayList是List接口的一个实现类。ArrayList类继承并实现了List接口。...原创 2019-05-25 20:11:30 · 189 阅读 · 0 评论 -
【Java学习记录】二十四 手写实现LinkedList
LinkedList底层用双向链表实现的存储。特点:查询效率低,增删效率高,线程不安全。 双向链表也叫双链表,是链表的一种,它的每个数据节点中都有两个指针,分别指向前一个节点和后一个节点。 所以,从双向链表中的任意一个节点开始,都可以很方便地找到所有节点。 关于双向链表,可以参考我之前的一篇文章《数据结构--链表》双向链表自定义一个链表:package ...原创 2019-06-03 14:20:30 · 168 阅读 · 0 评论 -
【Java学习记录】二十五 Map接口
现实生活中,我们经常需要成对存储某些信息。比如,我们使用的微信,一个手机号只能对应一个微信账户。这就是一种成对存储的关系。Map就是用来存储“键(key)-值(value) 对”的。 Map类中存储的“键值对”通过键来标识,所以“键对象”不能重复。Map 接口的实现类有HashMap、TreeMap、HashTable、Properties等。Map接口常用方法一个简单的例子测试一下常...原创 2019-06-03 22:59:17 · 129 阅读 · 0 评论 -
【Java基础】 多线程基础
期末考试的终结代表了研一生活的结束,一年真的很快就过去了,接下来就是专门搞科研的研二了,希望自己能够静下心来好好学。1.什么是多线程多线程是Java语言的重要特性,大量应用于网络编程、服务器端程序的开发,最常见的UI界面底层原理、操作系统底层原理都大量使用了多线程。程序“程序(Program)”是一个静态的概念,一般对应于操作系统中的一个可执行文件,是含有指令和数据的文件,被存储在...原创 2019-06-25 22:59:25 · 149 阅读 · 0 评论 -
【Java基础】多线程的创建
Java 提供了三种创建线程的方法:通过实现 Runnable 接口; 通过继承 Thread 类本身; 通过 Callable 和 Future 创建线程。继承Thread类该方法是创建一个新的类,该类继承 Thread 类,然后创建一个该类的实例。继承类必须重写 run() 方法,该方法是新线程的入口点。它也必须调用 start() 方法才能执行。该方法尽管被列为一种多线程实现方...原创 2019-06-29 22:50:33 · 154 阅读 · 0 评论 -
【Java学习记录】二十八 线程的停止方式
线程终止的情况有以下几种:1.线程正常执行完毕之后退出,也就是当run()方法完成之后线程终止。2.由于外部干涉而终止,例如加入标识。3. 使用interrupt方法中断线程。注意:不要使用stopdestory等方法,因为极为不安全。1.线程正常执行完毕之后退出在 run() 方法执行完毕后,该线程就终止了,这种正常的情况就不需要再说。2.由于外部干涉而终止由...原创 2019-07-15 22:52:12 · 133 阅读 · 0 评论