Java的语法糖,就是编译器为了方便大家写代码,对于一些代码,做了一些简化的语法,可以让大家在平时写代码的时候,更方便写出容易阅读的代码,但是在编译完之后,编译器会把这些代码,再还原回来。在Java中,有1个大家最经常使用的语法糖,就是整形变量的自动装箱,Integer a = 10;很明显10不是一个对象,Integer是一个对象,不同的东西,不能赋值,为啥还可以这么做呢? 这个东西就是Java的语法糖。

Java中的语法糖有以下几种:

  1. 泛型(JDK1.5)

  2. 自动装箱和拆箱(JDK1.5)

  3. 变长参数(JDK1.5)

  4. 实现Iterable接口的foreach语法(JDK1.5)

  5. 接口AutoCloseable支持的try-with-resource用法(JDK1.7)

  6. switch支持枚举和String(JDK1.7)


查看全部


之前在网上看到了一篇关于RocketMQ的事务消息的文章,感觉讲的并不好,甚至有错误的地方,所以就想自己来写一篇文章,讲一讲我对与RocketMQ的事务消息的理解,不一定会正确,各位在看的时候,可以结合自己的思考,看看是否有一定的参考性,这里会单刀直入的讲解重点,而不会讲一些铺垫的东西,例如什么是RocketMQ,什么是事务消息,什么是事务等等,如果你遇到了一些名词,自己不是很理解,需要自己去其它地方学习下。

应用的场景

电商支付场景中,向DB中写入了订单信息,并且发送了1个MQ消息,通知其它系统处理积分、优惠券等服务,DB中的事物还是比较容易的,只要不是分库的,就好操作,相关的内容网上也很多,就不过多说了,现在假设数据库的事物是T1,发送MQ的事务消息是T2,那么伪代码就是如下:

1
2
3
执行T1(写DB)
if 成功
执行T2(发MQ)

如果你这么写,就会有很大的问题,因为T2有可能会失败,这样T1没有回滚,就出现了问题;也有可能是T2超时了,导致T2实际到底有没有成功,不知道,这个时候也会有问题。这里是1个基本的场景,所以理论上来说,是不能这么写代码的,那么要怎么写呢? RocketMQ给了一个事务消息的选项。

查看全部


对于新入门的程序员或者即将要学习计算机软件开发的人员来说,打好基础是非常关键的,但是我感觉网上的很多资料,对于什么是计算机基础,说的都比较官方和笼统,新人不愿意看;或者说的都是计算机操作系统、数据结构和算法等,这肯定没有错,但是对于新人来说,意义并不大,这篇文章将结合笔者多年的编程经验,给新手说清楚什么是基础?

不当杠精,接受现实

对于新手来说,有些知识是需要先死记硬背的,例如语法,一些成熟算法等,这些东西前期不需要纠结的太多,记住就行了,每个人其实都站在了巨人的肩膀上,无论你现在有什么样的成绩,以后打算取得什么样的成绩,都是在前人不断总结的经验上,再有其它的创新,所以接受一些既定的事实是非常重要的。这并不是让大家不要问为什么,而是强调,不能在牛角尖里出不来,知识在没有形成体系的时候,最好的建议就是加大知识的面,让自己的知识形成体系,先把语法之类的东西死记硬背下来,这是必须要经历的一个过程。前几年是进步最快的时候,需要不会的,先记下来,可能慢慢你就会了,知道了,理解了,懂了为什么了,有一种豁然开朗的感觉了,如果找不到这种感觉,那你需要找个前辈,请教一下。

1、基础就是计算机知识体系

什么是知识体系?简单来说就是你所掌握的知识,一种是理论性的研究,一种是建立在理论性的研究上的应用,对于计算机来说,数据结构和算法就是理论性质的研究,操作系统的进程调度就是建立在这种理论上的实际应用,所以要建立一套完整的知识体系,应当重点学习对理论的应用,注意,这里说的是对理论的应用,而不是对理论的研究。这里对于新手的建议就是,不要深入到各种复杂深奥的数据结构和算法中去,掌握计算的几种基本结构和算法就可以了,具体要掌握的几种最重要的理论,有下面几种:

查看全部


尽管上一篇的内容,对于初学者来说,已经算是稍微有点难度了,但是对于有一点工作经验的开发人员来说,仍然算不上有难度,所以这一篇将从面试的角度,总结一下需要了解的知识点,这一篇将只列知识点,不给答案,或者给一个大致的方向。如果要面试的人,也可以试着回答以下问题。如果你现在不想深入研究MYSQL,毕竟人的精力都是有限的,也可以把以下内容,放入到你的TODO LIST中去,以后再慢慢研究,我的建议是,每个编程的人,都应该有一个自己编程的笔记本,例如微软的ONE NOTE,印象笔记、苹果的备忘录(我正在用),然后有一个笔记,是专门存放要做的事情的,在任何时候,任何地点,遇到了不会的东西,立即放入TODO LIST中去。这也是一种编程思想,你想一下,消息队列(MQ)是不是就是这个思路,很多地方都是这个思路,这里就不一一列举了。

#### 1、索引篇
  • mysql哪些索引会命中,哪些不会命中?
  • 怎么查看mysql索引是否命中? explain查看执行计划
  • 联合索引哪些情况索引会命中? 哪些不会呢?
  • mysql底层索引是什么数据结构? B+树
  • 聚簇索引和覆盖索引有什么区别?
  • mysql索引为什么快?
  • mysql索引为什么用B+,而不是B树?
  • 建了索引一定就会快吗? 不是
  • 建了索引,且索引命中了,就一定会快吗?不是
  • varchar类型的列有100个长度,适合建索引吗? 如果不适合,怎么解决?
  • 哪些列适合建索引? 区分度大的列适合,像ID
  • 哪些列不适合建索引? SEX这种 text 长度大的varchar
  • varchar和char有什么区别?
  • 索引有什么坏处? 新增和更新、删除慢了点,占用磁盘空间大了点等等
  • 什么是慢SQL?怎么查看MYSQL的慢SQL?
  • 做过哪些MYSQL的查询优化?

查看全部


这一篇我们会讲解下mysql的一些稍微有点难度的内容,目前的互联网公司,面试的时候问mysql的时候也还是挺多的,不仅仅开发岗位,有些测试岗位在面试的时候,也需要会mysql,所以本篇比上一篇的基础篇要稍微难点。

主要会讲解以下内容:

  • 多表联合查询
  • 索引命中规则
  • 表结构设计三范式
  • 查询优化技巧

1、联合查询

多个表联合查询,是说查询的时候,同时查询2个或者2个以上的表,为什么要这么做呢?是因为数据都是按分类存储的,往往学生信息单独存储在一张表,学生成绩会存储在另外一张表,所以要同时查询出学生的姓名和成绩的时候,就需要联合2个表,同时查询。也可以先看看第3节的表结构设计三范式,加深一下理解。

查看全部


这篇文章主要讲解一下基础MYSQL,纯粹为新人准备的,老手可以直接略过。在真实的项目中,数据一般都是要落地到数据库进行存储的,例如你在购物网站购买了一个手机,那么购物网站需要把你购买手机的时间、价格、订单号、支付信息等存储起来,如果有积分,还会记录一下积分信息。明白了数据库的作用,我们再来看看MYSQL这个关系数据库的一些基本操作。

#### 这一篇我们将会讲解以下内容:
  • DDL:创建表、删除表、增加列等修改表的结构。
  • DML:新增、删除、修改、查询,俗称的增删改查,也被人戏称为CRUD,如果你刚开始工作,一般都是干CRUD的工作,如果你已经多年经验,绝对不要还只是CRUD。
  • INDEX:索引相关

基本概念

  • 数据库 存储数据的一个软件,mysql是其中一种,你可以把数据库想象成1个Excel。
  • 关系型数据库 数据库的数据都是规定好的格式。
  • SQL 规定好格式和语法的语句,可以从数据库中查询指定的数据,例如根据订单号查询订单信息。
  • 表 数据是存放在表中的,可以想象成1个Excel表的1个sheet。
  • 列 列是存在于表中的,可以想象成Excel中的sheet的一列,关系型数据库中每一列数据的类型都是相同的,不可以不同。

查看全部


CAS是compare and swap的简称,将指定内存地址的内容与所给的某个值相比,如果相等,则将其内容替换为所给的另一个值,这是1个原子操作,不可被中断,在Java中,AQS用到了CAS,所以一系列的锁、AtomicInteger、synchronized等,都用到了CAS,CPU通过总线和内存进行数据传输,既然CAS要修改内存上的值,需要锁总线吗?这将会涉及到MESI缓存一致性协议。

MESI协议

现代CPU都有L1,L2和L3的3级缓存,L3一般是多个核心共享,L1和L2是核心单独访问的,既然有缓存,就会产生缓存不一致的情况,MESI协议就是用来保证缓存一致性的协议。

查看全部


这篇文章,将会详细的列出来新手入门需要学习的Java基础知识,这些知识,是必须要掌握的,而且不能学的半盆子水平,要深入学习原理,然后才能在以后使用的时候,得心应手。

String篇

string会伴随Java开发的一生,几乎每天都会用到,所以要去研究这个类,目前作为新手入门,要理解的是如下内容:

  • string底层是什么 它不是基本类型,对吧,它是用哪种基本类型实现的
  • string的比较问题 str1 == str2 和 str1.equals(str2)的区别
  • 字符串的拼接问题 str = str1 + str2 + str3 这里会延伸到StringBuffer和StringBuilder
  • 字符串的子字符串 即substring() 要学会使用
  • 字符串和各种类型的转换,例如string转int int转string等 long和double float这些都要会
  • 字符串的hash和equals方法,可能在某些情况下要重写,该怎么重写,这里其实会涉及到List的contains方法的使用
  • 大写转小写 或反向怎么实现
  • 判断字符串是否为空 可以用apache的StringUtils
  • trim()方法,去除字符串2边的空格

查看全部


这是入门系列的第2篇,这1篇会继续上一篇的主题,来讨论一下日常写代码中,应当注意的地方,以及怎么写出高质量的代码,容易看懂,容易维护,稳定且不容易报错,容易二次开发的代码。还是想再次推荐一下Effective Java这本书,所以用这本书做了封面,并不是只需要看这1本书,作为程序员,会看很多本书,但是这本书,绝对是Java新手的首选,没有之一。

## Math.min(int a, int b)方法的必要性

Math.min(a,b)方法,会返回a和b之中的较小的值。如果对java.lang.Math类中的这个方法不熟悉,也没有关系,这里并不想讨论方法的重载,也不想讨论怎么比较2个double类型或者2个float类型在获取最小值时候的不同(如果你是编程新手,建议你去学习下怎么比较2个double值),返回2个整型值中的较小的值,代码非常的简单,例如可以这么写:

1
2
3
int min(int a,int b) {
return a > b ? b : a;
}

那么,问题来了,我为什么要把这么简单的1个功能,做出来1个方法呢?干嘛要调用1个方法,而不是直接在调用Math.min(a,b)的方法,直接写这段逻辑呢?

查看全部


这篇文章给新入门的程序员看的,高手就不要看了,对于刚开始参加工作,或者在大学学习了计算机的编程知识,不管是学的C语言,还是JAVA,还是C# 等等,都迫切的想要提高自己,这篇文章将结合本人多年的编程经验,说一说新手在编程中,应当注意的一些事项。这些代码,可能工作了很多年的程序员还在写,有可能你也在写,有可能是你不得不这么做,看完了这篇文章,相信你对程序 员为什么写出了屎山一样的代码,就知道点原因了。这可能是一个沉重的话题,不该新手来承担,每个程序员优不要随意的写if else,那么代码就更好维护了。

你真的学会了if else 了吗?

场景1,我们有1个变量的值type:

type =0 表示A种情况 type=1 表示另外一种情况,可能会有更多的情况,在不用switch的情况下,你会有以下2种写法(java版本的,且省略了大括号,你们写代码的时候,即使只有1行代码,也要写{}):

推荐写法:

1
2
3
4
5
if(type == 0)
do something;
else if(type == 1)
do something
throw new RuntimeException("类型错误,请检查:" + type);

查看全部