Java基础知识汇总

前言

之所以要写这篇博客,其中一个非常重要的原因就是发现好多好多的基础知识点都忘了,以至于我都计划每天看javaapi,然后找题目来做,强行补充基础,毕竟两年开发时间内,只用到一部分java知识,有一些非常重要但也容易被忽略的东西也顺便在些记录一下。越走到后面,这些基础知识显得尤为重要,所以必须拿起当年学Java的激情,好好地再过一遍这些东西,并记录下来,权当备忘录。

汇总

基本数据类型

Java的类型包括基本类型和引用类型,基本类型包括boolean和数值类型,引用类型包括类、接口和数组类型以及特殊的null类型
Java的八种基本类型
这里写图片描述

整型
类型位数范围默认值
byte8-2^7-2^7-10
short16-2^15-2^15-10
int32-2^31-2^31-10
long64-2^63-2^63-10

整型的位数是非常重要的,特别是在定义数据库字段长段里,容易产生越界超范围问题。值得引起重视。
此外,int是基本数据类型,用来定义整型数据。而Integer是一个类,定义了整型有关变量和方法,可以方便调用。
而且在运算时,byte和short都会提升为int类型,要注意强制转化。遵循的原则是小转大不用强转,大转小需要强转
Java一律采用Unicode编码方式,每个字符无论中文还是英文字符都占用2个字节。

优先级

优先级:单目 >运算>移位>比较>按位>逻辑>三目 >赋值 ,其中只有单目、三目、赋值是从右到左的,即淡云一笔,安洛三幅

String,StringBuilder,StringBuffer

String是字符串常量,为不可变对象,一旦被创建,就不能修改它的值。对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去。String 是final类,即不能被继承。

StringBuffer是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象,另外它只能通过构造函数来建立。StringBuffer是线程安全的。

StringBuilder是线程不安全,其余使用上和StringBuffer类似,但速度上会稍快些。

CharSequence是一个接口,有length( ),charAt( int index),subSequence(int start,int end)等api调用,String,StringBuffer,StringBuilder都实现了CharSequence接口

用new创建的字符串在堆区,Java中的字符串在字符串常量区(如果常量区存在某个String,就直接取,没有的话才开辟新的空间),函数中的临时变量在栈区

代码执行

初始化过程

总体规则是先静态后普通,先父类后子类,非静态初始化块执行在构造函数之前
初始化过程:
1. 初始化父类中的静态成员变量和静态代码块;
2. 初始化子类中的静态成员变量和静态代码块;
3. 初始化父类的普通成员变量和代码块,再执行父类的构造方法;
4. 初始化子类的普通成员变量和代码块,再执行子类的构造方法;

默认构造函数

事实上只有在我们没有显示声明任何构造方法时java才会为我们提供一个默认的无参构造函数。普通的类方法是可以和类名同名的,和构造方法唯一的区分就是,构造方法没有返回值

集合

集合线程安全

集合中线程安全的类有:vector,stack,hashtable,enumeration,Properties继承自hashtable也是线程安全的。除此之外均是非线程安全的类与接口,需要指出的:arrayList和LinkedList都是线程不安全的

集合分类

List,Set,Map在java.util包下都是接口
List有两个实现类:ArrayList和LinkedList
Set有两个实现类:HashSet和LinkedHashSet
AbstractSet实现了Set

hashMap

hashmap使用的是链地址法解决哈希冲突
HashMap不能保证元素的顺序,
HashMap能够将键设为null,也可以将值设为null,
与之对应的是Hashtable,(注意大小写:不是HashTable),Hashtable不能将键和值设为null,否则运行时会报空指针异常错误;
hashmap在产生太多碰撞的时候,会进行扩容,扩容导致性能消耗的点在于:需要把原来的数据重新计算他们在新数组中的位置,并放进去。
这里写图片描述

循环删除元素

list循环删除符合条件的元素,用for循环或者foreach会产生遗漏或造成并发错误,需要使用iterator迭代器来循环移除 iterator.remove

TreeMap

TreeMap 是根据 key 排序的map,默认升序,也可以用比较器重新指定排序规则。

    Map<String,String> map = new TreeMap<>(new Comparator<String>(){
            public int compare(String o1,String o2){
                return  o2.compareTo(o1); //用正负表示大小值
            }
        });
        //以上4行可用下面一行lambda表达式代替
        //Map<String,String> map1 = new TreeMap<>((o1,o2)->o2.compareTo(o1));

HTTP协议相关

HttpServletRequest

HttpServletRequest继承自ServletRequest。客户端浏览器发出的请求被封装成为一个HttpServletRequest对象。对象包含了所有的信息包括请求的地址,请求的参数,提交的数据,上传的文件客户端的ip甚至客户端操作系统都包含在其内。典型的有
1. request.getCookies( )
2. request.getHeader(String s)
3. request.getContextPath( )
4. request.getServletPath( )

HttpServletResponse继承了ServletResponse接口,并提供了与Http协议有关的方法,这些方法的主要功能是设置HTTP状态码和管理Cookie。比如设置响应的content类型response.setContentType(“text/html;charset=utf-8”);

创建Servlet的实例是由Servlet容器来完成的,且创建Servlet实例是在初始化方法init()之前

异常相关

异常机制

Java语言中的异常处理包括声明异常、抛出异常、捕获异常和处理异常四个环节。
try是用于检测被包住的语句块是否出现异常,如果有异常,则抛出异常,并执行catch语句。
cacth用于捕获从try中抛出的异常并作出处理。
finally语句块是不管有没有出现异常都要执行的内容。
对于finally,有return的情况需要注意:
1、不管有木有出现异常,finally块中代码都会执行;
2、当try和catch中有return时,finally仍然会执行;
3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,不管finally中的代码怎么样,返回的值都不会改变,仍然是之前保存的值),所以函数返回值是在finally执行前确定的;
4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。

错误情况Throwable

这里写图片描述
都是Throwable的子类:
1.Exception(异常) :是程序本身可以处理的异常。
2.Error(错误): 是程序无法处理的错误。这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,一般不需要程序处理。
3.检查异常(编译器要求必须处置的异常) : 除了Error,RuntimeException及其子类以外,其他的Exception类及其子类都属于可查异常。这种异常的特点是Java编译器会检查它,也就是说,当程序中可能出现这类异常,要么用try-catch语句捕获它,要么用throws子句声明抛出它,否则编译不会通过。
4.非检查异常(编译器不要求处置的异常): 包括运行时异常(RuntimeException与其子类)和错误(Error)。

throw和throws

throw用于抛出异常。
throws关键字可以在方法上声明该方法要抛出的异常,然后在方法内部通过throw抛出异常对象。

Ant和Maven

Ant和Maven都是基于Java的构建(build)工具。理论上来说,有些类似于(Unix)C中的make ,但没有make的缺陷。Ant是软件构建工具,Maven的定位是软件项目管理和理解工具。
Ant没有自主生命周期,Maven有自主生命周期
Ant特点 ›
没有一个约定的目录结构,必须明确让ant做什么,什么时候做,然后编译,打包,›没有生命周期,必须定义目标及其实现的任务序列 ›没有集成依赖管理
Maven特点
›拥有约定,知道你的代码在哪里,放到哪里去 ›拥有一个生命周期,例如执行 mvn install 就可以自动执行编译,测试,打包等构建过程 ›只需要定义一个pom.xml,然后把源码放到默认的目录,Maven帮你处理其他事情 ›拥有依赖管理,仓库管理

反射机制

主要功能

Java反射机制主要提供了以下功能:
1. 在运行时判断任意一个对象所属的类;
2. 在运行时构造任意一个类的对象
3. 在运行时判断任意一个类所具有的成员变量和方法;
4. 在运行时调用任意一个对象的方法;
5. 生成动态代理。

反射破坏代码的封装性,破坏原有的访问修饰符访问限制

Spring

Spring介绍

Spring Framework是一个开源的Java/Java EE全功能栈(full-stack)的应用程序框架,Spring中包含的关键特性:
1.强大的基于JavaBeans的采用控制翻转(Inversion of Control,IoC)原则的配置管理,使得应用程序的组建更加快捷简易。
2.一个可用于从applet到Java EE等不同运行环境的核心Bean工厂。
数据库事务的一般化抽象层,允许声明式(Declarative)事务管理器,简化事务的划分使之与底层无关。
3.内建的针对JTA和单个JDBC数据源的一般化策略,使Spring的事务支持不要求Java EE环境,这与一般的JTA或者EJB CMT相反。
4.JDBC 抽象层提供了有针对性的异常等级(不再从SQL异常中提取原始代码),简化了错误处理,大大减少了程序员的编码量。再次利用JDBC时,你无需再写出另一个’终止’(finally)模块。并且面向JDBC的异常与Spring通用数据访问对象(Data Access Object)异常等级相一致。
5.以资源容器,DAO实现和事务策略等形式与Hibernate,JDO和iBATIS SQL Maps集成。利用众多的翻转控制方便特性来全面支持,解决了许多典型的Hibernate集成问题。所有这些全部遵从Spring通用事务处理和通用数据访问对象异常等级规范。
6.灵活的基于核心Spring功能的MVC网页应用程序框架。开发者通过策略接口将拥有对该框架的高度控制,因而该框架将适应于多种呈现(View)技术,例如JSP、FreeMarker、Velocity、Tiles、iText以及POI。值得注意的是,Spring中间层可以轻易地结合于任何基于MVC框架的网页层,例如Struts、WebWork或Tapestry。
7.提供诸如事务管理等服务的面向方面编程框架。

另外,Spring并没有提供日志系统,我们需要使用AOP(面向切面编程)的方式,借助Spring与日志系统log4j实现我们自己的日志系统。

Struct框架

Struct基础知识

在Struts框架中如果要使用Validation作验证的话,用DynaValidatorActionForm 动态验证表单
Struct1单例,Struct2多例

Hibernate

hibernate的优化策略

优化Hibernate所鼓励的7大措施:
1.使用双向一对多关联,不使用单向一对多
2.灵活使用单向一对多关联
3.不用一对一,使用多对一代替
4.配置对象缓存,不使用集合缓存
5.一对多使用Bag,多对多集合使用Set
6.继承使用显示多态
7.消除大表,分散表关联,使用二级缓存

Object和Condition的一些方法

Object中有wait、notify、notifyAll
Condition中有await、signal、signalAll用于代替Object内的对应方法
wait()、notify()和notifyAll()是 Object类 中的方法
从这三个方法的文字描述可以知道以下几点信息:
1)wait()、notify()和notifyAll()方法是本地方法,并且为final方法,无法被重写。
2)调用某个对象的wait()方法能让当前线程阻塞,并且当前线程必须拥有此对象的monitor(即锁)
3)调用某个对象的notify()方法能够唤醒一个正在等待这个对象的monitor的线程,如果有多个线程都在等待这个对象的monitor,则只能唤醒其中一个线程;
4)调用notifyAll()方法能够唤醒所有正在等待这个对象的monitor的线程;
有朋友可能会有疑问:为何这三个不是Thread类声明中的方法,而是Object类中声明的方法(当然由于Thread类继承了Object类,所以Thread也可以调用者三个方法)?其实这个问题很简单,由于每个对象都拥有monitor(即锁),所以让当前线程等待某个对象的锁,当然应该通过这个对象来操作了。而不是用当前线程来操作,因为当前线程可能会等待多个线程的锁,如果通过线程来操作,就非常复杂了。

Condition是在java 1.5中才出现的,它用来替代传统的Object的wait()、notify()实现线程间的协作,相比使用Object的wait()、notify(),使用Condition1的await()、signal()这种方式实现线程间协作更加安全和高效。因此通常来说比较推荐使用Condition,在阻塞队列那一篇博文中就讲述到了,阻塞队列实际上是使用了Condition来模拟线程间协作。

JavaWeb

servlet基础知识

Servlet的生命周期分为5个阶段:加载、创建、初始化、处理客户请求、卸载。
(1)加载:容器通过类加载器使用servlet类对应的文件加载servlet
(2)创建:通过调用servlet构造函数创建一个servlet对象
(3)初始化:调用init方法初始化
(4)处理客户请求:每当有一个客户请求,容器会创建一个线程来处理客户请求
(5)卸载:调用destroy方法让servlet自己释放其占用的资源

servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet,并且移植率低。需要import javax的包

Servlet与JSP九大内置对象的关系:

JSP对象 怎样获得
out->response.getWriter
request ->Service方法中的req参数
response ->Service方法中的resp参数
session ->request.getSession
application ->getServletContext
exception ->Throwable
page ->this
pageContext ->PageContext
Config ->getServletConfig

JSP

JSP分页代码顺序:
1. count(*)得到总记录数
2. 计算总页数
3. 获取所有记录(个人感觉这一步不需要,可以直接获取指定页数数据)

redirect与forward

redirect:请求重定向:客户端行为,本质上为2次请求,地址栏改变,前一次请求对象消失。举例:你去银行办事(forward.jsp),结果告诉你少带了东西,你得先去公安局办(index.html)临时身份证,这时你就会走出银行,自己前往公安局,地址栏变为index.html.
forward:请求转发:服务器行为,地址栏不变。举例:你把钱包落在出租车上,你去警察局(forward.jsp)报案,警察局说钱包落在某某公司的出租车上(index.html),这时你不用亲自去找某某公司的出租车,警察局让出租车自己给你送来,你只要在警察局等就行。所以地址栏不变,依然为forward.jsp

JDBC

载驱动方法

1.Class.forName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”);
2. DriverManager.registerDriver(new com.mysql.jdbc.Driver());
3.System.setProperty(“jdbc.drivers”, “com.mysql.jdbc.Driver”);

文件

输入输出

这里写图片描述
这里写图片描述

Socket

getLocalAddress()返回的是本地的ip地址
getInetAddress()返回的是连接的ip地址

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值