java程序的执行过程
- 编写java程序
- 编写完的java程序,进行保存时自动将.java文件编译成.class文件
- 先启动虚拟机,虚拟机加载字节码对象.class文件,进行这个类的main方法开始执行
数据类型
- 基本数据类型
类型 | 描述 |
---|---|
byte | 占1个字节,范围-127-128,-27到27-1 |
short | 占2个字节,范围-215到215-1 |
int | 占4个字节,范围-231到231-1 |
long | 占8个字节,范围-263到263-1 |
float | 占4个字节,单精度 |
double | 占8字节,双精度度 |
char | 占2字节 |
boolean | 占1字节 |
- 引用数据类型
基本类型的字面值规则
- 整数的字面值是int类型
- byte、short、char三种比int小的整数,可以用范围内的值可以直接赋值
- 浮点数字字面值,是double类型
- 字面值的后缀:L表示long,F表示float,D表示double类型
- 字面值的前缀:0b表示二进制,0表示八进制,0x表示十六进制,\u表示char16机制
基本类型的运算规则
- 计算结果的数据类型,和算项的最大类型保持一致
- byte、short、char三种比int小的整数,运算时自动转化成int
- 整数运算溢出
- 浮点数计算不精确
- 浮点数的特殊值:
Java基础
1.验证JDK是否安装成功的命令:
Echo %JAVA_HOME%
Path
Java -version
2. 0 十进制 0b二进制 0x八进制 \u 十六进制
3.三目运算符进行条件的判断 1?2:3
4.断点测试:
添加断点
f11 启动调试
f6 单步执行
f5 进入方法
5.重载和重写的异同:
重载:(同名不同参)同名方法如果有不同的参数列表则视为重载,重载对返回值没有要求
重写:子类将父类的方法,在方法名,参数列表,返回类型都相同的情况下,对方法体进行了修改或重写.
区别:方法的重载和重写都是实现多态的方式,区别在于重载实现的是编译时的多态,而重写实现的是运行时的多态性.重载发生在一个类中,同名的方法如果有不同的参数列表则视为重载;重写发生在子类与父类之间,重写要求子类被重写的方法与父类被重写方法有相同的参数列表,有兼容的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则).重载对返回类型没有特殊要求,不能根据返回类型进行区分.
6.集合的相关知识
a. Collection接口:存储单列数据:
(1)List:单列有序集合(可以重复):
A、ArrayList:底层结构是数组,底层查询快,增删慢(非线程安全);
B、LinkedList:底层结构是链表型的,增删快,查询慢;
C、vector:底层结构是数组,线程安全的,增删慢,查询慢(不常用);
(2)Set:单列无序集合(不可重复):
A、HashSet:按照哈希算法来存取集合中的元素,存取速度比较快;
B、TreeSet:基于红黑树数据结构,实现元素的“自然排序”;
b.Map接口:存储键、值的双列数据集合:
A、HashMap:按照哈希算法来存取集合中的对象,通过比较哈希值大小快速查询(可存放null,非线程安全类);
B、LinkedHashMap:通过插入次序,或者最近最少使用(LRU)规则,依次查询;
C、TreeMap:基于红黑树数据结构,按照元素的Key值“自然排序”;
D、HashTable:类似与HashMap,线程安全,效率低,key、value不能为null。
哈希运算过程:
HashMap内部,使用 Entry[] 数组存放数据
数组默认初始容量 16
放满后容量翻倍+2
key.hashCode() 获得键的哈希值
用哈希值和数组长度,运算产生一个下标值 i
(3)新建Entry 对象来封装键值对数据
(4)将Entry对象,放在 i 位置
A.如果是空位置,直接放入
B.有数据,依次equals()比较是否相等
找到相等的,覆盖旧值
没有相等的,链表连接在一起
C.负载率、加载因子 0.75
新建翻倍容量的新数组
所有数据,重新执行哈希运算,放入新数组
D.jdk1.8链表长度到8,转成红黑树,树上的数据减少到6,转回成链表
7.数组:长度固定,查询快(访问方式单一,只能下标访问),增删数据操作繁琐
Java.util.arrays常用方法:
Arrays.toString(数组) 将数组数据,连接成字符串
Arrays.sort(数组) 数组排序
Array.binarySearch(数组,目标值) 二分查找,折半查找
Arrays.copyOf(数组,长度) 把数组复制成一个指定长度的新数组
8、字符串:创建长度不可变
方法:
CharAt(i) 获取指定位置的字符
Length() 字符串长度,字符的数量
indexOf(子串) 找第一个子串出现的起始位置,找不到返回-1
indexOf(子串,start) 从start位置向后查找
lastIndexOf(子串) 从后向前找
Substring(start) 截取start到末尾
Substring(start,end) 截取[start,end)范围
Trim() 去除两端空白字符
9、正则表达式:
\d 数字[0-9] \w 单词字符[a-zA-Z_0-9] \s 空白字符
? 0或一个 * 0到多个 + 1到多个 {n} 指定n个 {n,m} 指定n到m个
^ 匹配开始位置 $ 匹配结束位置 [a,b,c][1,2,3] 去前面一位后面一位 a1,b2,c3
String.matches(regex) 用来做匹配判断 split(regex) 用regex格式来拆分字符串
replaceAll(regex,子串) 用子串全部替换regex格式部分 replace
10、Integer的方法:
Integer.parseInt(“string”) 把字符串数转换成int,括号里可以添加机制(2,8,16)
Integer.toBinaryString(255) 转换为二进制 Integer.toOctalString(255) 转换为八进制
Integer.toHexString(255) 转换为16进制
11、instanceOf运行期类型识别
12、final修饰类,方法,变量 final类不能被继承,没有子类 final方法不能重写 final变量 值不可变; static: 使用场景>>>>>>共享数据,工具方法
13、访问控制符
名称 同类 同包 子类 任意
Public Y Y Y Y
Protected Y Y Y
[default] Y Y
private Y
14、Queue(FIFO) 方法:offer() peek() poll() addLast() getLast() removeFirst()
Stack(LIFO) 方法:push() pop() addFirst() removeFirst()
15、IO
文件:createNewFile() 新建文件 mkdirs() 逐层创建文件夹 delete() 删除文件
IsFile() 是否是文件 isDirectory() 是否是文件夹 getAbsolutePath() 完整路径,绝对路径
字节流:(1)FileInputStream,FileOutputStream 文件输入输出流,继承字节流
判断:while((n=in.read(new byte[8192]))!=-1)
(2)ObjectInputStream,ObjectOutputStream 对象序列化.反序列化
方法:writeObject(object) readObject() 被序列化的对象要实现serializable接口
//willtodo
字符流:
(1)InputStreamReader(文件流,编码方式),OutputStreamWriter(文件流,编码方式)
(2)字符流(按行读取):BufferedReader(字符流或文件流) printWriter(字符流或文件流)
判断:((line = in.readLine()) != null)
16、线程和进程
进程:是操作系统执行和调度的单元,是程序的关于一个数据集合的处理单元
线程:是cpu执行和调度的基本单元,线程是进程的执行单元,可以实现高并发
创建线程的方法:实现runnable接口,重写run方法
继承Thread,重写run方法
线程方法:thread.currentThread() thread.sleep() thread.yield() start() interrupt() join()
object的方法:wait() notify() notifyAll()
17、反射:
获取字节码对象:class.forName(“路径”) 类.class() 实例.getClass()
获取包名.类名:c1.getPackage().getName() c1.getName() 完整类名
c1.getSimpleName() 类名,不含包名
成员变量:getFields() getDeclaredFields() 包括私有 getField(变量名) getDeclaredField(变量名)
构造方法:getConstructors() 同上
方法:getMethods() 同上
18、数据库(mysql,oracle)
数据库插入数据:insert into 表名(列1,列2,…) values(值1,值2,…) 插入部分数据
Insert into 表名 values(值1,值2,…) 插入全部列数据
修改表记录:update 表名 set 修改字段名 where…
删除表记录:delete from 表名 where… 删除符合条件的记录
查询表记录:Select 字段名/* from 表名 where… 查询字段名部分/*表示查询全部
Where条件:like 模糊查询配合”%”,””使用”%”表示通配(0或多个字符) “”任意一个字符
In(value1,value2) 查询在value1或value2数据
Between x and y 在x和y之间(包含x和y)
Order by 排序的列 asc(升序)/desc(降序)
Group by 字段 按字段进行分组
聚合函数查询:max()/min() count()返回某列的行数(*表示查询记录数) sum() avg()
Ceil() 向上取整 floor() 向下取整 round() 向下取整 round() 随机数
日期函数:curdate() 返回当前日期(年月日) curtime() 返回当前时间(时分秒)
now() 当前日期和时间(年月日+时分秒) date_add() date_sub() 增减日期
Year().month().day().hour().minute().second()
添加外键:foreign key(dept_id) references dept(id)
多表连接查询:
两张及以上表:select …from A a,B b,C c 大字母为表名小为别名,表名长起别名
连接查询:内连接inner join…on… 左连接(相等列)
left join…on…(左全) 右连接 right join…on…(右全)
备份恢复数据库命令:mysqldump -uroot -p mydb1 > d:/mydb1.sql 输入密码 备份
Mysql -uroot -p mydb1 < d:/mydb1.sql 输入密码 恢复(恢复时需要提前建库)
19.JDBC操作数据库的步骤
1)加载数据库驱动2)获取连接器3)获取传输器4)传输器执行SQL5)处理结果集6)释放资源
事务:将一堆SQL绑定在一起执行,要么全部成功,要么全部失败
事务的并发读:
脏读(未提交数据),不可重复读(同一记录,数据不一致,针对修改操作)
幻读(同一张表两次查询不同,针对增加和删除操作)
事务四大特性:原子性,一致性,隔离性,持久性
事务隔离级别:READ UNCOMMITTED(读未提交数据)
READ COMMITTED(读已提交数据)
REPEATABLE READ(可重复读) SERIALIZABLE(串行化)
20、Html:  一个空格 &emsp 中文状态下空格
Input元素:type=”text/password/radio/checkbox/submit/reset/button”
Text(文本框) password(隐藏密码) Radio(单选框) checkbox(复选框)
submit(提交) reset(重置) button(普通按钮)/可以用value显示按钮上的值
Textarea 多行文本输入区域 属性:cols(输入框的宽度) rows(输入框的高度)
下拉选框:…
css引入三种形式:1)属性style形式引入2)head style形式引3)
css基础选择器:标签名(标签名选择器),.类名(类选择器),#id(id选择器)
21、Javascript
html中写js的方式:1)在script标签内部书写2)通过script标签引入外部的js文件(文件内写)
1、属性:(1)onclick属性(2)document.getElementById(id值)
innerHtml属性 获取元素内部的所有内容,同时可以为div元素设置内容
innerText:获取元素修饰的内容。
2、获取元素:(1)getElementById(2)getElementByName
(3)getElementsByTagName
3、value用来获取或设置输入框的值
4、创建元素:document.createElement 、appendChild方法、removeChild方法
5、文档就绪事件:document.ready()
jquery:文档就绪事件 (“div”)2)类选择器(“#Id”)
jQuery层级选择器:
1)后代选择器(“祖先元素>子元素”)
3)相邻兄弟选择器$(“大哥+小弟”) $(“two~div”)two元素后面所有的div兄弟元素
$(“#two”).prev(“div”) 匹配id为two的前一个相邻div元素(prevAll全部)next(nextAll)下一
22.servlet:动态web资源开发技术,在服务器上运行的Java程序
(1)servlet的声明周期:Servlet在第一次被访问时创建Servlet实例,创建之后服务器会立即调用init方法进行初始化的操作,之后Servlet实例会一直驻留在服务器的内存中,为后续的请求服务。只要有请求来访问这个Servlet,服务器就会调用service方法来处理请求;直到服务器关闭,或者WEB应用被移出容器,随着WEB应用的销毁,Servlet实例也会跟着销毁,在销毁之前服务器会调用destroy方法进行善后的处理。
总结:第一次访问时创建,服务器关闭或web应用销毁时,servlet销毁。
(2)request、response
request:a. 获取参数
request.getParameter(String name) request.getParameterValues(String name)
b.存域和转发
request.setAttribute(“name”,nameValue)
Request.getRequestDispatcher(“所转发到资源路径”).forward(request,response)
response:a.向客户端发送数据
response.getOutputStream(字节流) response.getWriter(字符流)
b.重定向和定时刷新
response.sendRedirect(“重定向路径”)
response.setHeader(“Refresh”,“10;url”)
23、jsp:动态资源开发技术
1.<% = 表达式 %> 2.<% 若干java片段 %>3.<%-- 注解–%>
js指令:<%@ page…%>:声明基本属性 <%@ include…%>: 包含
<%@ taglib…%>:引入标签库
jsp的九大内置对象和四大作用域
九大内置对象:request,response,session,page,
pagecontext,config,out,exception,application.
四大作用域:pagecontext,request,session,application
24、用threadLocal设置数据:
//这样做其实就是在操作同一个对象,如果需要实现多线程应该像下下面的注释一样,这样就针对于每一个线程创建一个独立的Person对象
final ThreadLocal t=new ThreadLocal(){
public Person initialValue() {
//return new Person();
return p;}
};
1)实际的通过ThreadLocal创建的副本是存储在每个线程自己的threadLocals中的;
2)为何threadLocals的类型ThreadLocalMap的键值为ThreadLocal对象,因为每个线程中可有多个threadLocal变量,就像上面代码中的longLocal和stringLocal;
3)在进行get之前,必须先set,否则会报空指针异常;
25、线程池:
(1)Executors.newCacheThreadPool():可缓存线程池,先查看池中有没有以前建立的线程,如果有,就直接使用。如果没有,就建一个新的线程加入池中,缓存型池子通常用于执行一些生存期很短的异步型任务
(2)Executors.newFixedThreadPool(int n):创建一个可重用固定个数的线程池,以共享的无界队列方式来运行这些线程。
(3)Executors.newScheduledThreadPool(int n):创建一个定长线程池,支持定时及周期性任务执行
(4)Executors.newSingleThreadExecutor():创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
线程池参数:
keepAliveTime:
当线程空闲时间达到keepAliveTime,该线程会退出,直到线程数量等于corePoolSize。
corePoolSize:核心线程数,需要使用mainLock同步更新
maxPoolSize:当线程数大于或等于核心线程,且任务队列已满时,线程池会创建新的线程,直到线程数量达到maxPoolSize。如果线程数已等于maxPoolSize,且任务队列已满,则已超出线程池的处理能力,线程池会拒绝处理任务而抛出异常
maximumPoolSize:最大线程数,需要使用mainLock同步更新
allowCoreThreadTimeout:设置核心线程空闲时候是否被回收,默认false
queueCapacity:任务队列容量
poolSize:当前线程数,需要使用mainLock同步更新
switch() {case 1:break;case 2:break;default:break;}:
switch中的default,一般用在最后,表示非以上的任何情况下而发生的情况,
我们一般习惯在他的后面加上个break。
26、== 和equals区别,开发过程中对于对象类型比较是否相等一般用StringUtils.equals(s1,s2)
操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用操作符。如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = newObject();变量obj是一个内存,new Object()是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用操作符进行比较。
equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。例如,对于下面的代码:
String a=new String(“foo”);
String b=new String(“foo”);
两条new语句创建了两个对象,然后用a/b这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即a和b中存储的数值是不相同的,所以,表达式ab将返回false,而这两个对象中的内容是相同的,所以,表达式a.equals(b)将返回true。在实际开发中,我们经常要比较传递进行来的字符串内容是否等,记住,字符串的比较基本上都是使用equals方法。
简单的说,==比较两个人是否究竟是真正同一个人,equals一般用来比较两个人在逻辑上是否相等(比如规定两人成年之后身高相同就算两人相同等等),想怎么定义就怎么定义,如果不覆盖equals方法的话,默认仍然是比较两人是否同一个人(废话,两个人都还处于胚胎状态,都没有具体特征,怎么可能在逻辑上比较)。
来源:CSDN
作者:余生追梦
链接:https://blog.csdn.net/weixin_45146962/article/details/100698358