Java基础
文章平均质量分 90
从基本原理的角度来阐述Java基础知识,涵盖基本概念、设计、底层基本原理等各个方面
云里飞鸟轻轻摇摆
这个作者很懒,什么都没留下…
展开
-
Java集合深入解析(一)——集合的基本概念
Java集合框架、Java基础原创 2022-06-14 18:49:19 · 1706 阅读 · 0 评论 -
【深刻理解Java的序列化和反序列化】
序列化和反序列化原创 2022-02-20 23:57:19 · 518 阅读 · 0 评论 -
#Java算法设计与分析1--递归算法
1.递归算法1.1递归的概念所谓递归,就是程序方法在运行过程中自身调用自身。定义如下所示。fn(){ if(递归出口条件){ return x;}else{ //some codes…return fn();}}1.2递归的使用条件1.2.1 必须要有明确的递归出口所谓递归出口就是需要有明确的结束条件。1.2.2 每次递归都要使问题的规模减小1.2.3 递归的规模...原创 2019-01-09 07:33:03 · 498 阅读 · 0 评论 -
#架构师之性能优化篇--使用包装类的parseXXX()代替valuesOf()
valuesOf和parseXXX都是包装类的静态方法,都可以将字符串类型的数字转化为整型数据,但略有不同,我们来看下面这一段代码:String numStr1 = "127";String numStr2 = "127";System.out.println(Integer.valueOf(numStr1) == Integer.valueOf(numStr2));System.out....原创 2019-01-19 11:25:52 · 869 阅读 · 0 评论 -
#Eclipse中使用javap命令打出字节码虚指令(转)
1、Eclipse中Run->External Tools->External Tools Configurations,打开看到如下界面:2、右键点击Program->new,然后出现界面:3、然后配置Location、Working Directory、Arguments:Location:C:\Program Files\Java\jdk1.7.0_80\bin...转载 2019-01-18 02:31:24 · 216 阅读 · 0 评论 -
#源码分析篇--Java集合操作(9)重写顺序表的toString()方法
2.6.12 重写顺序表的toString()方法默认情况下,普通类都是继承了Object超类的toString(),这个方法如下所示:public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode());}在打印某个对象时,其实是省略了toString(),因...原创 2019-01-02 02:19:00 · 631 阅读 · 0 评论 -
# 源码分析篇--Java集合操作(8)根据源码设计一个顺序表
2.6.6 get(int index)方法我们知道,顺序表中的get方法通过元素的索引获取底层数组的元素。我们可以把该方法理解为顺序表的查询操作,该方法返回元素范型类型,源代码如下所示:public E get(int index) { //范围检查rangeCheck(index);return elementData(index);}rangeCheck(index);方法...原创 2019-01-02 02:12:33 · 174 阅读 · 0 评论 -
#数据结构--用Java实现一个顺序表
一个顺序表应该具有基本的增删改查功能,它最显著的特点是能够自动扩容,底层是基于数组实现的,下面我们来自己实现一个包含基本功能的顺序表。定义MyList接口,该接口声明了顺序表功能的基本方法:package com.yzh.maven.main;public interface MyList<E> { /*** * @functionName:add * @descrip...原创 2019-01-02 02:01:29 · 493 阅读 · 0 评论 -
源码分析篇--Java集合操作(7)自己实现一个add()方法
2.6.5 自己实现一个add()方法分析:add()方法涉及到扩容,扩容需要size(顺序表大小)、顺序表底层支持数组、默认容量大小以及默认的控元素数组四个必要属性,代码实现如下所示。package com.yzh.maven.main;/** * @className MyArrayList<E> * @description 创建一个顺序表 * @author yz...原创 2018-12-31 13:41:32 · 770 阅读 · 3 评论 -
源码分析篇--Java集合操作(6)顺序表的扩容原理
2.6.4 顺序表的扩容原理之add()方法的实现原理add()方法用于将元素动态添加到ArrayList容器中。将数据保存在list后,我们可以通过该list进行CRUD操作。我们知道,list(列表)的底层是由数组设计的,因此,数组具备了哪些优缺点,list就具备了哪些优缺点。我们知道,链表与数组是两种不同的数据结构,数据结构可以分为线性结构和非线性结构,在线性结构中,存储方式又分为连续存...原创 2018-12-31 13:35:18 · 557 阅读 · 0 评论 -
源码分析篇--Java集合操作(5)
2.6 ArrayList容器ArrayList类实现了List接口,它继承自AbstractList抽象类,继承机构如下所示:public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Seri...原创 2018-12-31 13:23:37 · 158 阅读 · 0 评论 -
源码分析篇--Java集合操作(4)
2、List的实现类List是一个接口,继承自Collection接口,包为java.util.*,由于继承的特性,因此,List接口具有了Collection接口的全部方法。但是,List本身又重新定义了这些方法:int size();boolean isEmpty();boolean contains(Object o);Iterator iterator();Object[] t...原创 2018-12-31 12:57:11 · 134 阅读 · 1 评论 -
源码分析篇--Java集合操作(3)
二、Collection接口Collection是一个集合顶层接口,位于java.util包下,继承了Iterable接口, public interface Collection extends Iterable { Iterable接口只有一个iterator()方法,如下所示。public interface Iterable<T> { /** * Ret...原创 2018-12-31 12:35:14 · 144 阅读 · 0 评论 -
源码分析篇--Java集合操作(2)
4、两大集合接口在Java集合中,有两大集合,一个是Collection接口及其实现类,另一个是Map接口及其实现类。下面给出这两种集合的框架图。如下所示。4.1Collection接口框架图4.2Map接口框架图从上面两个框架图可以看出,Cllection接口和Map接口是两大顶层接口。二者最为显著的区别是:Cllection接口的实现类及其子类的元素都是单一的,不可分割的元素,而M...原创 2018-12-31 12:27:40 · 158 阅读 · 0 评论 -
#Java集合框架--ArrayList容器的构造器
ArrayList类实现了List接口,它继承自AbstractList抽象类,继承机构如下所示:public class ArrayList extends AbstractListimplements List, RandomAccess, Cloneable, java.io.Serializable其中,AbstractList抽象类的继承结构如下所示:public abstrac...原创 2018-12-10 23:14:13 · 862 阅读 · 0 评论 -
#架构师之性能优化篇--遍历map最优方法entrySet的迭代方式
假设创建了如下的map:Map<String,String> map = new HashMap<String,String>();for(int i = 1001;i<149511;i++){ map.put(i+"",i+"");}遍历map有五种遍历方式,如下所示:2.1 通过增强型for遍历keySetlong start1 = System....原创 2019-01-20 23:45:18 · 715 阅读 · 1 评论 -
#架构师之性能优化篇--两个Integer类型比较大小
由于Integer是引用类型,因此比较大小使用equals方法,但是Integer与int类型比较时,会转化为int类型进行比较。对于-128-127之间的数据,可以使用==进行比较两个Integer类型数据的大小(因为此时使用的是缓存数据,数据的内存地址都是使用的缓存数据的内存地址),但是以外的数据需要使用equals()进行数据大小比较。...原创 2019-01-20 23:48:19 · 522 阅读 · 0 评论 -
#架构师之性能优化篇--String与StringBuffer的拼接
4 String与StringBuffer的拼接例 对下面的代码进行优化String str = "";for(int i = 0;i&lt;10;i++){str +=""+i;}说明:在java中,String的+拼接方式不适合使用在大量的拼接场合中。那么这是为什么呢?换句话说,+拼接符在拼接字符串的时候都做了什么呢?我们可以使用Java反编译工具来查看+拼接符到底做了些什么。首...原创 2019-01-20 23:51:40 · 459 阅读 · 0 评论 -
学会使用debug模式调试代码
在企业开发中,质量和效率显得尤为重要。学会通过debug模式调试代码是每一个开发的必修课。下面我通过一个案例来描述一下如何来调试、跟踪代码。步骤:在接口或方法的入口打上调试端点,如下所示。通过“debug as”运行代码,进入debug代码调试模式。下面介绍几个重要的调试技巧:step into(F5),进入函数内部调试、step over(F6),在当前函数步进调试、step retur...原创 2019-05-15 03:33:33 · 9120 阅读 · 0 评论 -
#数据结构--基于双端链表实现双端队列
4.8.3.5 源码package com.yzh.maven.entity;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import com.yzh.maven.base.abstracts.MyQueueAbstract;import com.yzh.maven.base.da...原创 2019-05-04 19:29:43 · 575 阅读 · 0 评论 -
#数据结构--基于数组实现双端队列
4.8.4.6 源码package com.yzh.maven.entity;import java.util.ConcurrentModificationException;import java.util.EmptyStackException;import com.yzh.maven.base.abstracts.MyQueueAbstract;import com.yzh.ma...原创 2019-05-04 19:27:14 · 450 阅读 · 0 评论 -
#经典面试题--全组合问题
给定一个非重复数数列,求该数列的全组合。例如,{1,2,3}的全组合为{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3}。这是一道非常经典的笔试题,可以通过递归来求解。这里我们可以利用上面已知的二进制方法来求解,我们可以将组合数中的每一个数标记为”1”,0表示未击中该组合数的任何数字,例如,110表示击中了该组合数的前两个数字,这样我们可以通过数组来取出这两个数字,从得到...原创 2019-05-04 19:24:47 · 460 阅读 · 0 评论 -
#栈--基于链表实现栈
3.4.2.2 基于本地创建的链表实现栈package com.yzh.maven.entity;import com.yzh.maven.base.dao.MyStackDao;public class MyLinkedStack<E> implements MyStackDao<E>{ private int size; private MyDobbleL...原创 2019-05-04 19:22:43 · 300 阅读 · 0 评论 -
#面试--单链表常见面试题汇总
2.7.4.3.8.1 找出单链表中的倒数第k个元素,实现该方法这是一道经典的笔试题,其实实现该方法十分简单。直接找倒数第k个元素似乎不太容易,要想找出倒数第k个元素,我们可以从第k个元素和倒数第k个元素的关系来获取倒数第k个元素。该关系如下所示。从上图可以看出来,倒数第k个节点的索引 = size – (k+1)。所以方法实现如下:/**@functionName reverseGe...原创 2019-05-04 18:57:22 · 735 阅读 · 0 评论 -
#Java源码分析--LinkedList容器之实现单链表(2)
2.7.4.2单链表add方法的实现2.7.4.2.1循环法但是,从上面链表添加元素的操作来看,一点也不觉得优雅,而且它将所有的节点数据信息全部暴露给外部了。在Java中,将数据信息暴露给外部已经违背它的设计特点—封装的完整性。那么,如何进行改进呢?实际上,我们可以这样考虑,由于第一个节点可以表示为头节点.getNext(),第二个节点可以表示为头节点.getNext().getNext(),...原创 2019-05-04 18:39:12 · 247 阅读 · 0 评论 -
#Java源码分析--LinkedList容器(1)
2.7.1 链表的概念链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作。2.7.2 链表的分类从链表的实现方式可以把链表分为单链表,循环链表,双向链表...原创 2019-05-04 18:25:42 · 152 阅读 · 0 评论 -
#架构师之性能优化篇--防止SQL注入攻击
要解决SQL注入攻击,首先必须要认识什么是SQL注入攻击。先来看一个例子:package com.yzh.maven.main;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.St...原创 2019-01-21 00:07:52 · 203 阅读 · 0 评论 -
#架构师之性能优化篇--应使用日志打印语句代替e.printStackTrace()
例try{ int i = 3/0;}catch(Exception e){ e.printStackTrace();}需要将其修改为日志打印异常的方式:private static final Logger logger = Logger.getLogger(TestA.class);try{ int i = 3/0;}catch(Exception e){ logger...原创 2019-01-21 00:06:24 · 5231 阅读 · 0 评论 -
#架构师之性能优化篇--不要在循环中使用try…catch…,应该把其放在最外层
除非需要在循环中进行特殊的捕获处理,否则禁止在循环内部使用try…catch…语句。正确的做法是在for循环外部进行异常捕获处理。原创 2019-01-21 00:05:05 · 3756 阅读 · 1 评论 -
#架构师之性能优化篇--不要在循环体内声明变量或对象
List<Object> myList = new ArrayList<Object>(); for(int k = 0;k<10;k++){ //注意即使是将str提到循环外声明拼接字符串还是会创建多个StringBuilder对象 String str = k+""; A a = new A(); a.set(s...原创 2019-01-21 00:02:26 · 1104 阅读 · 1 评论 -
#架构师之性能优化篇--ArrayList遍历最优化探究
你已经知道遍历ArrayList的方式有三种,分别是get(i)/size()、增强型for(forEach)和使用迭代器。那么这三种方式效率最高的是哪一种方式呢?List<String> list = new ArrayList<String>();List<String> list2 = new ArrayList<String>();Li...原创 2019-01-20 23:55:26 · 384 阅读 · 0 评论 -
#Java--范型匹配符
在创建集合对象的时候,要保证前后的泛型一致,或者创建集合时与前面的范型保持某种关系,如果不一致或不存在关系在编译时就会出错。例如,下面这句就会编译出错:List<Object> listTest = new ArrayList<String>();为什么会编译出错呢?这是因为ArrayList虽然是List的实现类,String是Object的实现类,但是Array...原创 2018-12-10 05:05:00 · 146 阅读 · 0 评论 -
#Java集合--ListIterator和Iterator迭代器的联系与区别
List的listIterator()方法会返回一个ListIterator迭代器对象,该迭代器的功能和Iterator迭代器基本相同,基本使用如下所示:ListIterator&lt;String&gt; iterator = list.listIterator(); for(;iterator.hasNext();){ String value = iterator.next(); S...原创 2018-12-03 00:10:37 · 412 阅读 · 0 评论 -
解决跨域的两种方案
一、跨域与同源策略跨域,通俗地讲,是指一个服务A的客户端请求另一个服务B的数据。下面给出了跨域的图示。在上面这个图中,描述了客户端与服务A关系,也就是说,客户端不允许对服务A以外的服务进行访问。这就是典型的跨域问题。通常同源策略与跨域紧密联系在一起。同源策略,它是由Netscape提出的一个著名的安全策略。现在所有支持JavaScript 的浏览器都会使用这个策略。所谓同源是指,域名,协议,...原创 2018-11-07 13:52:48 · 23598 阅读 · 2 评论 -
#5 redis开发指南--spring+springMVC+redis整合
1、配置pom.xml文件<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache...原创 2018-09-07 18:38:32 · 363 阅读 · 0 评论 -
#Java&面试--控制多线程安全与顺序执行
Condition类的signal则是唤醒被Condition类使用await作用的那个线程,它会有针对性的唤醒线程,而不是随机唤醒一个线程,以保证线程执行的顺序:package com.yzh.job.test;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import...原创 2018-09-18 13:09:25 · 169 阅读 · 0 评论 -
#Java&面试--多线程安全问题的三种解决方式
多线程安全问题可以用下面的案例来描述:package com.yzh.job.test;public class Thread3 { public static void main(String[] args) { Thread t1 = new Thread(){ @Override public void run(){ String str = "yuanzhih...原创 2018-09-18 04:58:43 · 409 阅读 · 0 评论 -
#面试--主线程与子线程的执行顺序
一般情况下,主线程总是优于子线程的执行,我们看一下下面的情况:package com.yzh.job.test;public class Thread2 { public static void main(String[] args) { Thread t1 = new Thread(new Runnable(){ @Override public void run() {...原创 2018-09-18 04:02:59 · 5683 阅读 · 1 评论 -
#4 redis开发指南--Java操作Redis
1、构建maven工程 略2、引入redis驱动jar包依赖<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version></depend原创 2018-09-07 02:12:36 · 132 阅读 · 0 评论 -
#1 mybatis实战系列--动态查询表数据
我们知道,在一般情况下,在查询数据时,是确定了表格名字的,这样一来,每一张表格基本都会对应一个实体类,但也有例外的情况,在某些特殊需求中,要求能够展示多张表的数据信息,这时我们是无法确定哪些表的,也能不可能建立多个实体类的,因此我们需要考虑动态查询表数据的方案。 一、映射xml文件的编写&lt;select id="queryDataMap" resultType="java.util....原创 2018-09-03 22:50:48 · 1965 阅读 · 1 评论