Fork me on GitHub

Comparable与Comparator的区别

Comparable 是自然排序

Comparator 是定制排序

相同点:

  1. 都是用来实现集合中元素的比较、排序的
  2. 都可以使用Collections.sort()方法来对对象集合进行排序

不同点:

  1. Comparable位于java.lang包下,而Comparator则位于java.util包下
  2. Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序

总结

使用Comparable接口来实现对象之间的比较时,可以使这个类型(设为A)实现Comparable接口,并可以使用Collections.sort()方法来对A类型的List进行排序,之后可以通过a1.comparaTo(a2)来比较两个对象;

当使用Comparator接口来实现对象之间的比较时,只需要创建一个实现Comparator接口的比较器(设为AComparator),并将其传给Collections.sort()方法即可对A类型的List进行排序,之后也可以通过调用比较器AComparator.compare(a1, a2)来比较两个对象。

可以说一个是自己完成比较,一个是外部程序实现比较的差别而已

用 Comparator 是策略模式(strategy design pattern),就是不改变对象自身,而用一个策略对象(strategy object)来改变它的行为。

比如:你想对整数采用绝对值大小来排序,Integer 是不符合要求的,你不需要去修改 Integer 类(实际上你也不能这么做)去改变它的排序行为,这时候只要(也只有)使用一个实现了 Comparator 接口的对象来实现控制它的排序就行了。

两种方式,各有各的特点:使用Comparable方式比较时,我们将比较的规则写入了比较的类型中,其特点是高内聚。但如果哪天这个规则需要修改,那么我们必须修改这个类型的源代码。如果使用Comparator方式比较,那么我们不需要修改比较的类,其特点是易维护,但需要自定义一个比较器,后续比较规则的修改,仅仅是改这个比较器中的代码即可。

Comparable接口

Comparable是java.lang包下的一个接口,该接口里只有一个compareTo()方法:

1
2
3
4
5
6
package java.lang;
import java.util.*;

public interface Comparable<T> {
public int compareTo(T o);
}
阅读更多...

深入分析Java中的length和length()

在开始正文之前,请你快速回答如下问题:

在不使用任何带有自动补全功能IDE的情况下,如何获取一个数组的长度?以及,如何获取一个字符串的长度?

这个问题我问过不同水平的程序员,包括初级和中级水平的。他们都不能准确而自信地回答这个问题(如果你能很准确很自信的回答这个问题,那么证明针对这一知识点你比大多数中级程序员掌握的好)。由于现在很多IDE都有代码补全功能,这使得开发人员在很多问题上都理解的很肤浅。本文将介绍几个关于Java数组的关键概念。

上面问题的正确回答姿势应该是这样的:

1
2
3
4
5
int[] arr = new int[3]; //使用length获取数组的程序
System.out.println(arr.length);

String str = "abc";
System.out.println(str.length());//使用length()获取字符串的长度

那么问题来了,为什么数组有length属性,而字符串没有?或者,为什么字符串有length()方法,而数组没有?

为什么数组有length属性?

首先,数组是一个容器对象,其中包含固定数量的同一类型的值。一旦数组被创建,他的长度就是固定的了。数组的长度可以作为final实例变量的长度。因此,长度可以被视为一个数组的属性。

有两种创建数组的方法:

1、通过数组表达式创建数组。

2、通过初始化值创建数组。

阅读更多...

20岁无资本无未来(华文)

你学习一般,考上了现在的这所学校,成绩不算好,拿不到奖学金,上课不听讲,上自习不规律,考试靠突击,同学帮一把的话也能每科考到七八十分,但是与优秀总有很大距离。

你家境一般,父母都是普通员工,你在这个城市的生活费是每月一千二,没事下下馆子,一个月添件衣服,想买台相机,咬咬牙才能买双自己喜欢的鞋。

你几乎没有特长,不会弹吉他,不会弹钢琴,不会跳舞,不会画画,想学摄影却不会使用图片处理软件,想上台演出却没信心,学校晚会比赛的时候,你经常是站在台下围观的人群里的一员,你与聚光灯环绕的舞台几乎绝缘。

你长相一般,不算英俊或者不算美丽,身材不算臃肿但也没什么肌肉或者没什么曲线,平时只是稍稍打扮一下,看上去并不出众,只能算整洁,与人擦肩而过是对方不会多留意你一眼。

你的感情也是一般,有时候会遇见自己心仪的那个人,但是总抓不住机会,眨眼间那个人就被其他人俘获,你就开始伤心、抱怨,但是几天之后又开始寻找新的心上人,就这样看着一个个心上人走过,直到你毕业,与其中任何一个都没有发展。 总之,你没有什么特别的地方 ,就和周围的千万个普通人一样。

你不甘心拿不到奖学金,看见别人得奖学金的时候你会说那完全是突击的结果,于是你开始上自习,不过你只坚持了一星期。

你不甘心自己的父辈平平,于是你批评讽刺自己周围的“官二代”、“富二代”,立志要努力学习争取成功,也好让自己的孩子成为“富二代”,你的热情持续了一个星期。

阅读更多...

大型网站架构演化历程

本文转载自公众号 Hollis

大型网站的挑战主要来自庞大的用户,高并发的访问和海量数据,任何简单的业务一旦需要处理数以P计的数据和面对数以亿计的用户,问题就会变得棘手。大型网站架构主要就是解决这类问题。更多内容也可以阅读各大互联网公司架构演进之路汇总、大型网站架构技术一览两篇文章。

本文内容大部分来自《大型网站技术架构》,这本书很值得一看,强烈推荐。

大型网站系统的特点

高并发,大流量

需要面对高并发用户,大流量访问。Google 日均 PV 35 亿,日 IP 访问数 3 亿;腾讯 QQ 的最大在线用户数 1.4 亿(2011年数据)。

高可用

系统 7 x 24 小时不间断服务。

海量数据

需要存储、管理海量数据,需要使用大量服务器。Facebook 每周上传的照片数量接近 10 亿,百度收录的网页数目有数百亿,Google 有近百万台服务器为全球用户提供服务。

阅读更多...

58赶集的mysql军规

本文转载自公众号 架构师之路

总是在灾难发生后,才想起容灾的重要性。

总是在吃过亏后,才记得曾经有人提醒过。

一,核心军规

  • 不在数据库做计算,cpu计算务必移至业务层
  • 控制单表数据量,单表记录控制在千万级
  • 控制列数量,字段数控制在20以内
  • 平衡范式与冗余,为提高效率可以牺牲范式设计,冗余数据
  • 拒绝3B(big),大sql,大事务,大批量

二,字段类军规

  • 用好数值类型
    tinyint(1Byte)
    smallint(2Byte)
    mediumint(3Byte)
    int(4Byte)
    bigint(8Byte)
    bad case:int(1)/int(11)
阅读更多...

注解ResponseBody 和 注解RequestBody 的作用

先提一嘴 @RequestMapping(“url”),这里的 url写的是请求路径的一部分,一般作用在 Controller的方法上,作为请求的映射地址。

代码:

1
2
3
4
5
6
7
8
@RequestMapping(value = "/test")//类级别映射,可以没有,一般用于减少书写量
public class myController {
//方法级别映射,必须有,那么这个方法的访问地址就是/test/aaa,请求到的页面就是test.jsp【当然,这里的.jsp需要在配置文件中配置】
@RequestMapping(value = "/aaa")
public String getMyName() {
return "test";
}
}

那么@ResponseBody呢?

1
2
3
@ResponseBody是作用在方法上的,@ResponseBody 表示该方法的返回结果直接写入 HTTP response body 中,一般在异步获取数据时使用【也就是AJAX】,在使用 @RequestMapping后,返回值通常解析为跳转路径,但是加上 @ResponseBody 后返回结果不会被解析为跳转路径,而是直接写入 HTTP response body 中。 比如异步获取 json 数据,加上 @ResponseBody 后,会直接返回 json 数据。

@RequestBody 将 HTTP 请求正文插入方法中,使用适合的 HttpMessageConverter 将请求体写入某个对象。

举个例子:

阅读更多...

赠与今年的大学毕业生(胡适)

这一两个星期里,各地的大学都有毕业的班次,都有很多的毕业生离开学校去开始他们的成人事业。学生的生活是一种享有特殊优待的生活,不妨幼稚一点,不妨吵吵闹闹,社会都能纵容他们,不肯严格的要他们负行为的责任。现在他们要撑起自己的肩膀来挑他们自己的担子了。在这个国难最紧急的年头,他们的担子真不轻! 我们祝他们的成功,同时也不忍不依据我们自己的经验,赠与他们几句送行的赠言——虽未必是救命毫毛,也许作个防身的锦囊罢!

你们毕业之后,可走的路不出这几条:绝少数的人还可以在国内或国外的研究院继续作学术研究;少数的人可以寻着相当的职业;此外还有做官,办党,革命三条路;此外就是在家享福或者失业闲居了。第一条继续求学之路,我们可以不讨论。走其余几条路的人,都不能没有堕落的危险。堕落的方式很多,总括起来,约有这两大类:

第一是容易抛弃学生时代的求知识的欲望。你们到了实际社会里,往往所用非所学,往往所学全无用处,往往可以完全用不着学问,而一样可以胡乱混饭吃,混官做。在这种环境里,即使向来抱有求知识学问的决心的人,也不免心灰意懒,把求知的欲望渐渐冷淡下去。况且学问是要有相当的设备的;书籍,试验室,师友的切磋指导,闲暇的工夫,都不是一个平常要糊口养家的人所能容易办到的。没有做学问的环境,又谁能怪我们抛弃学问呢?

第二是容易抛弃学生时代的理想的人生的追求。少年人初次与冷酷的社会接触,容易感觉理想与事实相去太远,容易发生悲观和失望。多年怀抱的人生理想,改造的热诚,奋斗的勇气,到此时候,好像全不是那么一回事。渺小的个人在那强烈的社会炉火里,往往经不起长时期的烤炼就镕化了,一点高尚的理想不久就幻灭了。抱着改造社会的梦想而来,往往是弃甲曳兵而走,或者做了恶势力的俘虏。你在那俘虏牢狱里,回想那少年气壮时代的种种理想主义,好像都成了自误误人的迷梦!从此以后,你就甘心放弃理想人生的追求,甘心做现成社会的顺民了。

要防御这两方面的堕落,一面要保持我们求知识的欲望,一面要保持我们对于理想人生的追求。有什么好法子呢?依我个人的观察和经验,有三种防身的药方是值得一试的。

阅读更多...

深入解析Java垃圾回收机制

转载自 深入解析Java垃圾回收机制

  • 引入垃圾回收
  • 哪些内存需要回收?
  • 引用计数法
  • 可达性分析
  • 如何回收
  • Marking 标记
  • Normal Deletion 清除
  • Deletion with Compacting 压缩
  • 为什么需要分代收集?
  • JVM的分代
  • 新生代
  • 老年代
  • 永久代
  • 分代垃圾收集过程详述

1. 引入垃圾回收

程序计数器、 虚拟机栈、 本地方法栈3个区域随线程而生,随线程而灭;栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。 每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的(尽管在运行期会由JIT编译器进行一些优化,但在本章基于概念模型的讨论中,大体上可以认为是编译期可知的),因此这几个区域的内存分配和回收都具备确定性,在这几个区域内就不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟随着回收了。 而Java堆和方法区则不一样,一个接口中的多个实现类需要的内存可能不一样,一个方法中的多个分支需要的内存也可能不一样,我们只有在程序处于运行期间时才能知道会创建哪些对象,这部分内存的分配和回收都是动态的,垃圾收集器所关注的是这部分内存—–《深入理解Java虚拟机》

自动垃圾回收机制就是寻找Java堆中的对象,并对对象进行分类判别,寻找出正在使用的对象和已经不会使用的对象,然后把那些不会使用的对象从堆上清除。

自动垃圾回收机制就是要解决三个问题:

  • 那些内存需要回收?
  • 什么时候回收?
  • 如何回收?
阅读更多...

什么是TCP/IP协议?

本文转载自公众号[技术特工队],作者整理了一些TCP/IP协议簇中需要必知必会的十大问题,既是面试高频问题,又是程序员必备基础素养。

一、TCP/IP模型

TCP/IP协议模型(Transmission Control Protocol/Internet Protocol),包含了一系列构成互联网基础的网络协议,是Internet的核心协议。

基于TCP/IP的参考模型将协议分成四个层次,它们分别是链路层、网络层、传输层和应用层。下图表示TCP/IP模型与OSI模型各层的对照关系。

mark

阅读更多...
  • Copyrights © 2015-2023 高行行
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信