Maven项目管理工具
Maven简介Maven全称是Apache Maven Project–Apache的优秀开源项目,Maven是java项目的构建和管理工具。Maven这个词翻译为“专家”或者“内行”,是跨平台的项目管理工具。Maven主要服务于Java平台的项目构建,依赖管理,项目信息管理等。
接下来是项目构建的过程,通常项目构建的过程分为这六个步骤:
理想的项目构建是高度自动化、跨平台,可重用的组件,使用Maven就可以帮助我们完成上述项目构建的完整过程。
再有就是依赖管理。所谓的依赖管理其实就是使用Maven来管理项目中所使用到的jar包,Maven管理的方式就是“自动下载项目所需要的jar包,统一管理jar包之间的依赖关系”。
注意Maven的使用依赖于Java,因此需要提前安装Java。
Maven的安装Maven的用途很大,这里简单说一下:1、用Maven可以方便的创建项目,基于archetype可以创建多种类型的java项目;2、Maven仓库对jar包(artifact)进行统一管理,避免jar文件的重复拷贝和版本冲突;3、团队开发,Maven管理项目的release(正式版本)和s ...
这就是java中的注解
对于注解相信大家都不陌生,因为初学者第一个注解就是@Override,用于标识重载方法。在Java EE开发过程中,注解更是无处不在,像经典的MVC设计模式就至少使用到了4个注解:@Component、@Repository、@Service和@Controller。现在问题来了,为什么要学习注解?它有什么优点,能解决什么问题?通过阅读本篇文章相信读者会有一个比较清晰的认识。
一个经常会遇到的例子在Java Web开发中,最早是使用XML的配置方式。举个例子来说,当开发者在Servlet中定义了LoginServlet类,接下来应该是去web.xml配置文件中增加LoginServlet类的访问映射,可能会使用如下代码:
12345678<servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>com.envy.servlet.LoginServlet</servlet-class></servlet><servlet-mappi ...
你好,我是java中的内部类
内部类平常用的还是挺多的,因此研究和总结内部类就显得非常重要。内部类,顾名思义就是将一个类的定义放在另一个类的内部进行,这就是内部类。内部类较难理解,但是功能强大,理解和运用内部类对提高编码水平有非常大的帮助。
初次邂逅—内部类存在的缘由举一个经常看到的例子:
1234567/**外部类**/public class Outer { /**内部类(内部是相对于外部而言)**/ class Inner{ //doSomething }}
现在问题来了,为何将一个类定义在某个类的内部,难道这不违反程序设计的单一职责原则吗?一个类定义在一个java源文件中不香吗?因此在使用内部类之前,了解使用内部类的理由显得尤为重要,个人觉得学知识带着目的来学,印象可能更深一些,毕竟有实际的例子来辅助记忆。
曾经读过一本书《Think in java》(像java一样思考),记得里面有一句关于内部类的话:”使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都 ...
java1.8新特性之stream
什么是Stream?Stream字面意思是流,在java中是指一个来自数据源的元素队列并支持聚合操作,存在于java.util包中,又或者说是能应用在一组元素上一次执行的操作序列。(stream是一个由特定类型对象组成的一个支持聚合操作的队列。)注意Java中的Stream并不会存储元素,而是按需计算。关于这个概念需要以下几点解释:1、数据源流的来源。 它可以是列表,集合,数组(java.util.Collection的子类),I/O channel, 产生器generator等(注意Map是不支持的);2、聚合操作。类似于SQL语句一样的操作, 如filter, map, reduce, find, match, sorted等。因此stream流和以前的Collection操作是完全不同, Stream操作还有两个非常基础的特征:Pipelining和内部迭代。
Pipelining也就是中间操作,它都会返回流对象本身。 这样多个操作的设计可以串联起不同的运算操作,进而形成一个管道, 如同流式风格(fluent style)。 这样做还可以对操作进行优化, 比如延迟执行(lazin ...
java泛型的那些事
学习泛型的理由首先明确为什么需要学习泛型?个人觉得至少有三个理由:1、使用泛型可以让你在声明类(或者创建方法)的时候不着急立即去指定它的类型,而是等到你实例化对象(或者方法调用)的时候才明确它的类型;2、避免通过使用Object类型来泛指java对象时,因类型强制向下转型时发生错误;3、可以毫无障碍的阅读Java相关源码。你经常遇到诸如Comparator<? super E> comparator和List<? extends Number>此类的代码,可能不太明白其中的含义,如果你学会了泛型,就毫无压力可以从容地面对那些代码了。
什么是泛型泛型不光是在java,在很多面向对象语言及各种设计模式中有广泛的应用。所谓的泛型,其实就是把类型“参数化”。
一提到参数,大家最熟悉的就是定义方法时的形参和调用方法时的实参。那么类型“参数化”到底怎么理解呢?顾名思义,类型“参数化”就是将类型由原来的具体类型,变成参数化的“类型”,有点类似于方法中的变量参数,不过此时是类型定义成参数形式(你可以理解为类型形参),然后在使用时传入具体的类型(也就是类型实参)。为什么这样操作呢 ...
Python高级编程(32):Python中的is和==的区别?
is和==的区别1、is 比较的是地址,注意小整数池和字符串,一般重复创建的时候会指向同一个对象。
123456789101112t1 = 123t2 = 123print(t1 is t2) # Trueprint(id(t1), id(t2)) # 1789477024 1789477024print("*********************************")l1 = [1,2,3]l2 = [1,2,3] # False,因为会重新声明一个对象# l2 = l1 # True,因为是赋值符号,就是指针指向print(l1 is l2) # Falseprint(id(l1), id(l2)) # 56509864 56511024
因为在python中存在intern机制,适用于小整数池和字符串,也就是说创建对象的时候会先在小整数池中查找,如果存在就返回,否则就会新建对象。记住仅仅适用于小整数池和字符串,对于list是不使用的
2、== 比较的是值,其实==重载了对象的__eq__方法,而这个方法比较的是对象的值。
12345678t ...
Python高级编程(31):Python中的变量是什么?
首先明确Python中的变量和Java中的变量是有本质区别的,在Java中在变量声明的时候需要指定数据类型,然后像虚拟机中申请内存,这个内存的大小其实和数据类型相关,这就好像是一个盒子,这个盒子能装什么其实已经确定下来。但是在Python中却不是这样的,Python中的变量本质上是一个指针,每个指针的大小都一样,它可以指向任意的对象,它保存的是对一个对象的引用。它本身并不会存放对象,它只是代表一个标签,通过这个标签可以找到具体存放对象的地方。你也可以将变量理解为一个便利贴。
a = 1 或者 a = ‘abc’的过程: 先在内存中创建一个int对象或者str对象,然后他们的值是1和abc,然后将a这个便利贴到它们身上,之后你访问a就相当于是在访问它们,非常类似于对象的引用。Python的动态性就是因为它的所有的变量的大小都是一样的,都代表了一个指针。其变量赋值的过程是,先声明对象,然后再建立关联引用。
1234567891011a = [1,2,3,4]b = aprint(id(a), id(b)) # b和a对应的是同一个对象print(a is b)b.append(5)pri ...
Python高级编程(30):dict和set的实现原理
我们为什么需要了解dict和set的实现原理呢?因为只有了解了其背后的实现原理,我们才能更好的的知道什么情况下使用dict以及set,这一点很重要,结合实际的情况使用不同的数据结构可能会产生很大的区别。
先通过一段测试代码了解一下它们性能之间的区别:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283from random import randintdef load_list_data(total_nums, target_nums): """ 从文件中读取数据,以list的方式返回 :param total_nums: 读取的数量 :param target_nums: 需要查询的数据的数量 """ all_data = [] ...
Python高级编程(29):set和frozenset
set是集合,frozenset则是不可变集合,集合的特点是无序和不重复,可以用于元素去重操作。
查看一下set的源码:
123456789def __init__(self, seq=()): # known special case of set.__init__ """ set() -> new empty set object set(iterable) -> new set object Build an unordered collection of unique elements. # (copied from class doc) """ pass
因此可以使用iterable对象作为参数,构建集合。
1234567891011121314151617181920212223242526s1 = set('abcd')s2 = set(['a', 'b', 'c', ...
Python高级编程(28):dict的子类
python中一切都可以被继承,dict自然不例外,但是我们并不建议大家去继承Python中的内置的像list,dict等数据结构,特别是用C语言写的数据结构,因为有些操作不会生效。1. 自定义一个字典时,不要直接继承自dict,因为有些操作会不生效
1234567891011121314class MyDict(dict): def __setitem__(self, key, value): # 重写父类的setitem方法,似乎并没有什么用 super(MyDict, self).__setitem__(key, value*5)# 首先明确下面两种方式其本质是一致的操作,都会调用__setitem__这个魔法函数mydict = MyDict(one=2)print(mydict)mydict['one'] =2print(mydict)# 运行结果:{'one': 2}{'one': 10}
也就是是说在某些情况下,用C语言写的Python内置 ...