java应该算是我接触编程的第一门语言,记得当时学习的时候,很多的东西不是特别的理解,跟着老师的节奏一直学着,但是越学到后面就发现前面那些懵懂的东西突然恍然大悟。所以小伙伴们,当你看完所有的时候,你对java的理解肯定又有不一样的东西!
依稀记得刚开始学习java的八大基本数据类型,那个时候老师让我们务必去背这些东西,那段时间感觉回到了小学背乘法口诀表一样,之后学习的是if和for的逻辑语句和一些基本特征,然后做一些逻辑的题目,那个时候感觉哥伦布发现了新大陆一般的好奇和喜悦!其实java的学习也是其乐无穷的。下面我会根据我的理解整理并总结一下自己所学的知识,希望这些总结能给你们带来一些帮助,同时也给我带来一些帮助!
1.Object类
这应该是java类的祖类,所有的类,数组都是使用Object作为超类,其有几个重要的方法,第一个是tostring方法,平时我们System.out.println()输出对象的地址,其实调用的是tostring方法(),输出地址值是没有意义的,所以很多时候我们会重写tostring方法,这样返回的就是成员的变量值。第二个应该就是equals的方法,在比较两个对象的时候,Object的equals方法容易抛出空指针异常,而Objects类中的equals方法就优化了这个问题。在很多的面试的时候,面试官基本上都会问“==”和“equals”的区别。
2.Collection
提到这个容器,就想到一些常用的方法,比如add,clear,remove,isEmpty,contains ,size,toArray。还有就是迭代器的接口iterator,他的遍历方式就是先判断是否有元素,如果有就取出,循环这个过程,直到所有元素取出,其方法有hasNext和next,前者判断是否有下一个元素,有则返回true;后者向下移动一个位置,并返回移动后的当前元素。最后还有就是两个很重要的子接口list和set。两者都是继承Collection,前者有先后顺序,具有整数索引并允许重复元素。而后者不包含重复元素,不保证元素先后顺序并无索引。
3.Map
Map是一个双列集合,key和value的键值对,每个键映射一个值,Key不能重复,要保证唯一性。Map的两种遍历方式,第一种键找值,keySet方式是通过所有的键存储到Set集合中,迭代器遍历Set集合,遍历过程中取出Set集合的元素,其实就是Map中的键,最后通过get方法,通过键获取到值。第二种键值对,entrySet方式是通过entrySet(),取出键值对的对应关系对象 (Entry接口实现类对象)存储到Set集合,遍历Set集合,遍历Set过程中,取出的是Entry接口实现类的对象,通过实现类对象,调用方法getKey,getValue获取键值对。
HashMap
HashMap其实是面试官问得最多的数据结构,在这里简单的介绍一下,他的底层数据结构就是哈希表,链表➕数组,每当数据进来的时候,hash算法都会计算这个key在数组的地址值,如果key的地址值相同的数据,就会形成链表一样的数据挂在数组上面。如果大家还想再去深入了解这个,可以去观看敖丙的hashmap的那篇文章,里面详细的介绍了hashmap。
4.异常机制
在我们编写代码的时候,都会考虑到,如果程序在执行的过程中,出现的非正常的情况,最终会导致JVM的非正常停止。java.lang.Throwable是java中所有异常和错误的父类,有两个子类。Error(错误):所有错误的父类,非常严重,不修改源代码,不能执行,所以遇到这种情况,我们是无法处理的。Exception(异常):表示异常,异常产生后程序员可以通过代码的方式纠正,使程序继续运行,是必须要处理的。一般解决异常,我们会用throw抛出异常和try...catch捕获一场并进行处理。在我们企业级的项目中,异常一般我们都会选择抛出异常并且自定义异常,在spring项目里,我们都会用枚举定义异常,用切面接受并处理异常。
5.线程
提到线程,我就想到了进程,很多时候当我们不能手动关闭一个电脑上的程序的时候,我们都会打开任务管理器,里面都能看到所有的进程。其实进程就是电脑里正在运行的应用程序而线程是则是这个应用程序里有多少个任务正在运行。线程要从他的创建说起,线程的创建一共有三种:继承Thread类,实现方法run(),不可以抛异常并无返回值;实现Runnable接口,实现方法run(),不可以抛异常并无返回值;实现Callable接口,接口中要覆盖的方法是publiccall(),可以抛异常且以有返回值。在项目里,我们一般使用的都是多线程,对线程的运行原理其实就是cpu随机式抢占式的调度,而每个线程具有独立的栈内存,并具有独立性。多线程的创建方式,一般有四种:缓存线程池的创建,固定长度的线程池的创建,定时线程的线程池的创建,单线程的线程池的创建。而多线程有四种同步机制:互斥锁,条件变量,信号灯,异步信号;最后一点,线程也有几种可用状态:新建,可运行,运行,阻塞,死亡。
6.Lambda表达式
Lambda就是JDK1.8的新特性的一种,一种新的思想,函数式编程的思想,感觉Lambda的代码编写更加的简介,省略了中间的过程,举个例子,以前我们遍历一个集合的时候,使用for,基本for里面是条件,然后下面是你想要执行的方法。而Lamdba使用->直接指向你要执行的方法。Lambda使用的前提必须是保证接口当中有且仅有一个抽象方法需要被覆盖重写并且必须有上下文推导。
7.Stream流
Stream流其实是一个集合元素的函数模型,它并不是集合,也不是数据结构,其本身并不存储任何元素(或其地址值)。他有几种常用的方法:forEach,count,filter,limit,skip,map,concat。Stream流遍历他不会像for遍历先把所有的都遍历出来之后才执行方法,而是遍历到执行方法就结束了,不会占用多余的内存。
8.File类
File其实就是文件和目录路径名的抽象表示,每一个 File 对象都需要跟一个硬盘的 文件或者文件夹路径进行关联.一般都是通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。四种获取方法:String getAbsolutePath():返回此File的绝对路径名字符串;String getPath() :将此File转换为路径名字符串。(构造路径) ;String getName() :返回由此File表示的文件或目录的名称;long length() :返回由此File表示的文件的长度。路径一般有真实路径和绝对路径,三种Boolean判断文件的方法。两种目录的打印:public String[] list() :返回一个String数组,表示该File目录中的所有子文件或目录;public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录。
9.IO流
在说IO流之前,先说一下URL,每个文件在互联网中都有唯一的一个URL,定位互联网中的资源,而我们平时做的就是资源的交互,一交互就会形成流,而IO流就是其中的一种,名为阻塞流,必须完成IO的操作之后才会返回。其流向分为输入流和输出流,格式类型分为字节流和字符流。平时使用IO的字节字符流操作文件之外,还会使用属性集Properties,他可保存在流中或从流中加载。我们java经常把文件变成自定义对象存储并使用,我们在创建流对象的时候,就会有缓冲流,他会创建一个内置的默认大小的缓冲区数组。文件和对象的转换,我们称之为序列化和反序列化。字符和字节的转换就会形成转换流。
10.网络编程
资源与资源之间交互多了之后,就会形成网络,所以网络编程的知识就会变得尤为重要。对于网络编程的基础,我们了解软件架构和网络三要素基本上就可以有一个笼统的概念。软件架构的话,分为c/s和b/s,c/s就是客户端和服务器之间的结构,而b/s就是浏览器和服务器之间的结构。网络三要素的话,就是IP地址、端口和协议。IP地址就是每台电脑在互联网中的地址,端口就是电脑里每个服务或者说是进程的入口,协议就是通信的规则,协议分为TCP和UDP两种协议,TCP就是在网络传输前,先建立好链接。再进行数据的传输,所以就有了三次握手也就是三次客户端和服务端的交互。而UDP就是直接传输,所以不能保证数据的完整性。在java里,有两个类实现TCP的程序,一个是java.net.Socket,创建 Socket 对象,两者建立连接开始通信。另一个是java.net.ServerSocket,创建 ServerSocket 对象,相当于开启一个服务,并等待客户端的连接。
11.Junit
在我们用java代码完成一个需求的时候,我们一般都会用测试去测一下代码的可行性。而Junit就是这样的一个测试框架,要了解这个测试框架,能够基本使用的话,我们需要了解他的原理和注解的使用,如果要了解他的原理的话,先要了解java代码的运行,一般java代码写完之后,我们去运行的话,这些源码会先形成class的文件,也就是我们说的编译,然后在运行!而Junit他可以通过反射能够获得java中的成员属性、成员方法和构造方法。然后我们通过@Before、@Test、@After注解来完成测试!
12.数据库
在说数据库的话,我想到我在网上看到的一篇文章,一个面试阿里的人,被问到如何向7岁的妹妹描述数据库的概念。我也想了一下,如果按照我此刻的理解,我可能会跟妹妹说,数据库他就像一本本书,就像你在幼儿园看的书一样,你会看到有动物的书,有植物的书,有故事的书,数据库的表就和这些书一样。而每本书的页码就是数据库里表的外键,你能够最快再次找到你想要看的那一页,而书的目录就是数据库里表的索引,你能够在这里看到整本书的简介。常见的数据库有很多,而我使用较多的就是mysql,在使用之前,我们要下载、安装并登陆。
数据库的创建和表的创建、增删改查
1.使用SQL语句操作数据库:创建数据库: CREATE DATABASE 数据库名;查看所有数据库: SHOW DATABASES;删除数据库: DROP DATABASE 数据库名;切换数据库: USE 数据库名;2.使用SQL语句操作表结构:创建表: CREATE TABLE 表名 (字段名 类型, 字段名 类型, ...);查看所有表: SHOW TABLES;修改表: ALTER TABLE 表名;修改表名: REANME TABLE 表名 TO 新表名;删除表: DROP TABLE 表名;3.使用SQL语句进行数据的添加修改和删除的操作:添加数据: INSERT INTO 表名 (字段名) VALUES (值);修改数据: UPDATE 表名 SET 字段名=新的值 WHERE 条件;删除数据: DELETE FROM 表名 WHERE 条件;4.使用SQL语句简单查询数据:SELECT 字段名1, 字段名2, ... FROM 表名。后面会给大家介绍约束、多表查询和事务操作!
13.JDBC
在前面我们介绍了数据库,那我们如果使用java代码访问数据库呢?这显然是一个问题,在以前有很多的客户端访问数据库的方式,方式多了之后就会变得很麻烦,后来所有的数据库厂商都统一用JDBC操作数据库的规范。而使用JDBC的话也很简单,第一步导入JDBC驱动Jar包,MYSQL的话就是com.mysql.jdbc.Driver,第二步使用DriverManager注册驱动,第三步使用Connection建立连接,第四步使用Statement执行SQL语句的对象,第四步使用ResultSet结果集或一张虚拟表。后面有了spring之后,使用模版方法模式,就可以直接使用JdbcTemplate!
14.Linux基础与部署
在前面介绍过了一些软件方面的知识,一台计算机肯定是硬件➕软件才能运行,如何管理硬件和软件之间的连接呢?这个时候就有了系统。系统也有其发展历程,目前在服务器系统比较流行的可能就是Linux,想要使用Linux的话,先要了解他的安装流程,首先准备虚拟机软件,准备Linux操作系统,按照步骤安装。接下来就是要了解Linux的一些命令,因为我们在服务器部署的时候,基本不会使用桌面,所以这个时候Linux的命令就会变得尤为的重要。在当前项目的部署,几乎都会使用镜像部署,这样方面在不同的服务器搭建项目。
15.java web
在前面我介绍了两种软件架构,而B/S就是浏览器和服务器的交互,那么问题来了,java代码如何让两者更好的交互呢?这个时候就引入了web,他就是一个用javaEE技术来实现的一个容器,可以制作游戏,网页,软件。web资源分为静态资源和动态资源,前者是服务器中不会改变的资源,后者是服务器中动态生成的数据。web服务器有很多,我简单介绍一下我使用较多的一个小型并免费的服务器-tomcat。要了解他的下载安装和项目部署。接下来就是在idea上完成web项目的创建和部署。
16.Servlet
前面说到web项目的创建和部署,接下来就说一下web项目代码的编写,Servlet是一个JavaWeb开发中的一个小程序。他处理客户端向服务端数据的接受处理和响应。首先编写一个普通Java类,实现Serlet接口,重写所有抽象方法。然后在service方法中书写代码处理业务。接下来在web.xml中配置Servlet,最后就是启动tomcat,通过映射路径访问这个Servlet资源。因为继承Servlet需要重写所有的抽象方法,GenericServlet很好的优化了这一点。实现GenericServlet接口,就节省了重写所有抽象方法。前面说到网络的交互需要用到协议,而目前比较流行的一种协议就是Http,而HttpServlet中的service方法统一接收所有的客户端发送的HTTP请求,这个时候就形成的最优版。第一步书写一个普通的Java类FormServlet,继承HttpServlet;第二步重写doGet和doPost方法并在方法里处理业务;第三步在web.xml中配置FormServlet;最后启动tomcat,使用FormServlet的映射路径,就可以用get或者post访问FormServlet。
注解开发
当请求越来越多的时候,web.xml中配置过多servlet不便于管理,就会容易出错。这个时候注解开发使得开发更敏捷,效率更高。第一步:创建一个普通类继承HttpServlet,重写doGet和doPost方法;第二步:在类上面添加注解@WebServlet;第三步:配置注解@WebServlet的值(映射路径);当注解过多的时候,就可以使用模版注解进行开发!
17.http&request
http是一种网络协议,结构包括请求报文和响应报文,请求报文是浏览器给服务器发送的请求数据的格式,主要包括请求行,请求头,请求体。请求行里有此次请求的方式,访问的路径和协议的版本,而请求头和请求体包含了服务器,网络连接,数据存活等一些参数。响应报文是服务器给客户端(浏览器)响应的数据格式,主要包括响应行,响应头和响应体。request有几个常用的API可以获得请求方式的类型,完整的URL和IP地址。request有其生命周期,每一次请求都会创建一个新的request对象,只存活于一次请求期间。request还有域对象及其作用,他是一个容器,主要用于数据传输使用的,内置了map集合并有setAttribute,getAttribute和removeAttribute方法。
请求转发重定向和异步同步
请求转发的话就是在服务器内部,将本次请求传递给另外一个Servlet或html,实现业务逻辑的跳转。因为在不同servlet可以共享request域中的数据,所以能够实现这种跳转。重定向的话就是服务器通过响应设置,让浏览器重新发送一次请求到指定的url。实现资源的跳转。其实就是服务器在接受到第一次请求的时候,响应给浏览器让浏览器再次请求另外的服务器处理此次业务。基本上很多的登陆都是使用重定向实现的!而同步异步的话,同步就是发送一个请求,需要等待响应返回,然后才能够发送下一个请求,如果该请求没有响应,不能发送下一个请求,客户端会处于一直等待过程中。而异步就是发送一个请求,不需要等待响应返回,随时可以再发送下一个请求,即不需要等待。
18.HttpServletResponse
HTTP响应报文指的是服务器给客户端(浏览器)响应数据的数据格式,组成部分为响应行,响应头和响应体。响应行的第一行一般为协议/版本号和状态码,响应头以key:value的形式给客户端(浏览器)发送响应参数,而响应体就是此次响应的具体数据。基本上一次请求对应一次响应。在面试中可能问的比较多的可能就是get请求和post请求的区别,一般分三个纬度说明一下,get请求的数据长度有限制而post请求没有;get请求没有包含请求体而post包含;get请求数据暴露在数据栏而post请求没有。所以平时我们提交表单的时候使用post请求!
19.cookie&session
在了解cookie和session之前,先说一下会话,其实会话就是由多次请求和响应组成的一次网络上的活动;因为他能够在多次请求和响应之间共享,所以能够解决数据存储的问题。而cookie和session就是会话技术。先说一下cookie,他是服务器在客户端(浏览器)存储数据的技术,如果没有手动设置最大的存活时间,默认为一次会话时间,关闭浏览器后就消失,如果设置最大的存活时间,那关闭浏览器也不会消失。能为服务端标识用户提供依据,减轻了服务端数据存储的压力。session是服务器为每个访问这个服务器的客户端用户创建的一个容器,这个容器中存储的数据能够在多个request之间实现共享,服务器为每个访问这个服务器的客户端用户创建的一个容器。因为session是存在服务端,所以持久化就会变得重要的多。首先在Servlet中手动创建JESSIONID,然后手动设置JESSIONID的存活时间,最后将JESSIONID相应给浏览器。
20.jsp
因为封装的思想,这个时候有人就在想能不能把html和java都封装在一起,能够一起写入,前面介绍了java的web的Servlet,而重点对Servlet的封装就能解决这一问题。这个时候jsp就闪亮登场。他是一个动态网页技术,其本质是一个Servlet。我们先说他的四大域,request和session前面已经讲过了,page域的话指的是当前JSP页面,其中存储的数据只在当前页面有效而application域指的是服务启动后整个项目对应的ServletContext域。接下来就是熟练的在域中取值和运算。因为代码的冗余,不同web厂商标签库的不同导致编写的难度增加,这个时候JSTL就解决了这一问题。由四个定制标记库(core、format、xml 和 sql)和一对通用标记库验证器(ScriptFreeTLV和PermittedTaglibsTLV)组成。把JSTL的jar包放到web项目的WEB-INF目录下lib文件夹里,然后导入到项目里,最后通过taglib标签引入JSTL资源即可。
21.Filter过滤器
Filter是一个能够拦截客户端与服务端请求和响应的web组件,就是在在请求到达客户端要访问的web资源前拦截请求,能够解决一些非法字符,登陆权限,中文乱码等一些问题。首先要在web.xml文件中配置Filter的类路径,然后配置拦截的Servlet的映射路径。他的生命周期是在当服务器启动的时候,过滤器就被初始化了,执行过滤器的init方法,然后当一个请求的路径是满足过滤器的配置路径,就会执行一次过滤器的方法。最后当服务器停止的时候,销毁过滤器,执行过滤器的destory方法。如果使用注解开发的话,在你需要拦截的接口上添加WebFilter注解即可。在后面我们会学到Spring,他里面的切面的拦截就是使用的Filter!
22.jQuery
jquery其实是一个jsp的框架,他里面的插件非常多并有相对应的解决方案。要了解他的话,首先了解他的三大核心语法,五大选择器,五大操作和事件。其三大核心语法就是$("选择器"), $(callback),$(html)。五大选择器的话:一些元素,id和类组成的基本选择器;标签之间的层级关系的层级选择器;根据标签属性过滤的属性过滤选择器;根据标签所处的位置及特性进行过滤的基本过滤选择器;根据表单对象的属性对选中的标签进行过滤的表单对象属性过滤选择器。五大操作的话:使用jquery对象,获取标签的value属性值或者设置标签value属性值的操作;获取两个标签之间的内容的操作;使用jquery操作标签属性的操作;通过操作Class属性动态控制.class对应的样式的操作;给标签添加style或删除style属性的操作。最后就是事件:有着许许多多的事件,每种事件触发的环境都不同。首先我们要绑定事件,第一种就是把事件当做标签的一个属性,注册到标签中,第二种就是获取标签对象,对这个对象绑定事件。然后就可以在事件里写入你想要的方法。
23.AJAX
ajax其实就是异步 JavaScript和XML的操作,他可以在不重新加载整个网页的情况下,对网页的某部分进行更新。jsp原生的ajax首先要创建Ajax引擎对象,然后为Ajax引擎对象绑定监听,接下来绑定提交地址,最后发送请求响应数据。jquery对他进行了封装,再使用的话,会有三种常用的方式,第一种GET请求,jQuery.get([settings])里面包括请求地址,异步或同步的请求方式,请求数据,数据类型,和成功失败后的回调函数。第二种POST请求,jQuery.post([settings])里面包括的和上面一样。第三种AJAX请求,jQuery.ajax([settings])里面除了上面的还有请求类型,默认为“GET”。
24.JSON
JSON是一种数据交换的格式,独立于编程语言的文本格式来存储和表示数据,所以现在成为主流的数据交换语言。json对象有三种数据格式:第一种对象类型的{name:value};第二种数组/集合类型的{value};第三种混合类型的[{},{}]或{name:[]...}。他有四种常见的工具:第一种Jsonlib,Java类库需要导入的jar包较多;第二种Gson,google提供的一个简单的json转换工具;第三种也是目前最常用的Fastjson,alibaba技术团队提供的一个高性能的json转换工具,听说最近源码泄漏出了很多问题,开始有人弃用。第四种Jackson,开源免费的json转换工具,springmvc转换默认使用jackson。
25.Redis
前面介绍了数据库,严格来说他是一个关系型数据库,使用的表结构,只支持基础类型,只能应用于硬盘。而接下来我们要介绍的是非关系型数据库NOSQL,严格来说不是一种数据库,应该是一种数据结构化存储方法的集合,可以是文档或者键值对等。使用灵活,可以使用硬盘或者内存作为载体。主流的NOSQL有四种类型,第一种键值(Key-Value)存储数据库,有️TokyoCabinet/Tyrant、Redis、Voldemort、BerkeleyDB应用于内容缓存,主要用于处理大量数据的高访问负载;第二种列存储数据库,有Cassandra,HBase,Riak应用于分布式的文件系统;第三种文档型数据库,有CouchDB、MongoDB应用于Web应用;第四种图形(Graph)数据库,有Neo4J、InfoGrid、InfiniteGraph应用于社交网络。接下来我们简单的讲一下其中的一种redis,他通常支持五种数据类型:String、hash、list、set、sortedset。基本使用的话,第一步设置ip地址和端口;第二步设置数据;第三步获得数据;最后释放资源。因为redis创建和销毁很消耗性能,所以就有了redis连接池。首先配置他的连接池信息,然后编写连接池工具,最后就可以用此工具来使用redis。