java笔记随记
首记
软件的命名及路径尽量使用英文名,在测试软件失败后,可以尝试注销用户重登,在注册表中的信息就可以更新,否则有可能机器还是检测到原来的路径,导致软件或程序失败不变。
接口数组
arraylist和linkedlist
①在底层结构中,数组因为有下标的关系,在查询操作时可以快速的通过下标找到数据,但是因为数组
是线性结构,在数组中间增删数据时候都将后半部分的数据迁移
②链表的查询方式较为单一,不支持下标查询,只能通过链表顺序查询,这样的查询方式造成了查询缓 慢,但因为是采用链式结构,增删只需要改变底层的指针结构即可
- ArrayList的底层是数组,查询快,增删慢
- LinkedList的底层是链表,查询慢,增删快
hashtable和hashmap
- 都是继承了map
- hashtable不允许出现null值,而hashmap允许null可以作为key或者value
- 遍历方式上都可以使用iterator,但是hashtable还可以使用Enumeration
- 哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值
- 内部实现方式的数组的初始大小和扩容的方式不同。HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。
Java虚拟机内容
- 释放掉占据的内存空间是由gc完成,但是程序员无法明确强制其运行,该空间在不被引用的时候不一定会立即被释放,这取决于GC本身,无法由程序员通过代码控制。
零散基础
- ASCLL码含有1个字节,即8个bit(比特)位,标准的ascll码是有7个比特位,允许使用最高位扩展,因此一般的ASCLL有2^7 = 128个,扩展高位后有256个
- 静态变量的值是可以修改的,但只能被初始化一次
java基础篇
面向对象的五大基本原则
- 单一职责原则(SRP)
- 开放封闭原则(OCP)
- 里氏替换原则(LSP)
- 依赖倒置原则(DIP)
- 接口隔离原则(ISP)
重载和重写
方法重载是指同一个类中的多个方法具有相同的名字,但这些方法具有不同的参数列表,即参数的数量或参数类型不能完全相同
方法重写是存在子父类之间的,子类定义的方法与父类中的方法具有相同的方法名字,相同的参数表和相同的返回类型
- 方法没有继承一说,只有重载和重写。子类只可以调用父类的空参数构造函数而不是继承
final关键字
1.final修饰变量,则等同于常量
2.final修饰方法中的参数,称为最终参数。
3.final修饰类,则类不能被继承
4.final修饰方法,则方法不能被重写。
类方法static
-
类方法:使用static修饰(静态方法),属于整个类的,不是属于某个实例的,只能处理static域或调用static方法;
-
实例方法:属于对象的方法,由对象来调用。
区别:实例方法是建立实例才有的方法,类方法是直接可以使用类引用,不需要实例化就可以使用的方法,一般在项目中类方法都是设置为工具类使用的;
ps:类方法不是实例,没有this指针
// 这个是实例方法 void` `sum(``float` `x, ``float` `y) { a = max(x, y); b = min(x, y); } // 类方法 static float getMax(float x, float y) { float c; c = max(x, y) * max(x, y); return c; }
webService开发
-
JSP和servlet的内置对象及获得方式
-
out->response.getWriter
-
request ->Service方法中的req参数
-
response ->Service方法中的resp参数
-
session ->request.getSession
-
application ->getServletContext
-
exception ->Throwable
-
page ->this
-
pageContext ->PageContext
-
Config ->getServletConfig
-
-
在jsp开发中有四大域:①request、response ②applicaiton ③page ④session
-
session 和application的区别:
session和application都是作用于整个浏览器,不同的是session是不同客户登录时创建的,但是application是服务器启动时创建的,因为服务器启动时会先创建一个applicationContext,这个一般是放一些基本的配置,放入里面的信息是所有用户都可以访问的,作用于所有网页以及所有用户
线程篇
一些常见的线程即安全性
- Vector相当于一个线程安全的List
- HashMap是非线程安全的,其对应的线程安全类是HashTable
- Arraylist是非线程安全的,其对应的线程安全类是Vector
- StringBuffer是线程安全的,相当于一个线程安全的StringBuilder
- Properties实现了Map接口,是线程安全的
常见的线程启动方式
-
继承Thread
public class MyThread extends Thread{//继承Thread类 public void run(){ //重写run方法 Thread.slppe(1000); } } public class Main { public static void main(String[] args){ new MyThread().start();//创建并启动线程 new MyThread().run();//普通程序启动,没有线程执行 } }
这类方式较为容易接受,通过继承Thread实现多线程,需要记住的要点就是:启动线程是用start()方法,要是直接调用run()也会执行,但是程序变为普通执行,没有线程执行!
-
继承runnable接口
public class MyThread2 implements Runnable {//实现Runnable接口 public void run(){ //重写run方法 } } public class Main { public static void main(String[] args){ //创建并启动线程 MyThread2 myThread=new MyThread2(); Thread thread=new Thread(myThread); thread().start(); //或者 new Thread(new MyThread2()).start(); } }
创建Runnable实现类的实例,并用这个实例作为Thread的target来创建Thread对象,这个Thread对象才是真正的线程对象
子类父类的执行顺序
- 父类的静态代码块
- 子类的静态代码块
- 执行父类的构造代码块
- 执行父类的构造方法
- 执行子类的构造代码块
- 执行子类的构造方法
- 执行子类普通方法
struts2的工作流程
1、客户端浏览器发出HTTP请求.
2、根据web.xml配置,该请求被FilterDispatcher接收
3、根据struts.xml配置,找到需要调用的Action类和方法, 并通过IoC方式,将值注入给Aciton
4、Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。
5、Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面
6、返回HTTP响应到客户端浏览器