1.一般情况下,java源文件名与类名相同,如果类名与源文件名不相同,javac编译时,跟的事源文件名(javac *.java),生成的字节码文件(*.class)与类名相同
2.公共类源文件名必须与类名相同
3.final常亮(不可变数据)定义名称每个字母都大写,不能自增自建
4.单行注释 "//" 多行注释 "/* */" javadoc 是生成java注释,(javadoc -d ./doc *.java存储注释,打开index.html)必须是public类,public/protected方法和变量,可以用html编译(<p><br>),带参数的的方法要用@param注释
5.JRE JAVA Runtime Enviroment java运行环境,包含JVM 和基本类库
6.JVM java Vitual Machine java虚拟机,包含JIT(即时编译器)可以把字节码文件翻译成机器指令,不同平台安装不同版本JVM,可以跨平台
7.java基础类库:java原有的类库
8.Byte字节=8个bit二进制位(16G=16*1024MByte) 1024=2的10次方
9.tomcat服务器默认编码格式是ISO-8859-1
10.GBK/GBK2312 中文编码,每个汉字对应2个字节
11.Unicode全球编码,包含utf-8 可变字节,数字英文占1个字节,一个汉字对应3个字节,日韩文可能占4-5个字节,utf-16 不可变字节,一个汉字和英文都对应2个字节
12.10进制转2进制 对2取余,倒序输出0x,8,16进制同理
13.2进制转10机制 00001010 0+1*2的1次方+0的2次方+1的3次方=10
14.负数是原码最高位变1,之后最高位不变其余的反码的补码(+1),计算机是以补码来计算
15.‘’不是字符,字符是单引号引起来的单个字符
16.""字符串可以是空值 不等于null
17.变量必须先赋值再使用
18.在类中定义的变量叫成员变量,在代码块中定义的变量叫局部变量
19.同一作用域中部能定义重名的变量
20.静态方法不能直接使用非静态成员,可以先new 这个类再使用类中成员变量
21.数据类型分为基本类型和引用类型两大类
22.基本类型数据都放栈内存,栈中的数据可以共享,引用类型(数组,对象)存放堆内存并又垃圾回收机器人管理,没有被引用的对象会在不定时被垃圾回收,所以java比较占内存
23.byte/short/char 这三种数据类型在进行运算之前,会先把自己提升为int再运算
24.大类型数据不能直接赋值给小类型数据(BYTE=INT是不对的),字面量数据默认int类型
25.在把int赋值给long类型时,隐含着一个自动类型转换,建议在int字面量后加上字符L(l),省去了自动类型转换这一步
26.float 4字节 总字面量精度7个(12345.67) double 8字节 总字面量精度15个 ,小数默认double类型,float需要在小数字面量后加F(f)
27.小数在计算机中采用近似值保存,不准确(2-1.1=0.899999),一般情况小数不直接判断是否与另一个小数相等
27.char类型采用utf-16,每个字符占2个字节
28.字符类型实际上储存的事这个字符对应的码值:'A' 65,'a' 97,'0' 48,回车 13,换行 10
29.因为字符存储的事码值,直接可以把一个整数赋值给字符类型变量(0-65535)
30.转义字符: \t Tab,\n 换行,\\ \,\' ',\" ",不能单独用“\”
31.boolean只能赋值t or f,不能0or1,并且不能和其他类型进行转换
32.自动转换可能精度丢失(比如int转float)
33.小数转整数,舍弃小数部分
34.大整数类型强转小整数类型,只把最后一个字节(short 最后2个字节)的数存到变量中(iint i=270,byte b=(byte)ii,bb=14(256+14))
35.整数可以强转字符
36.面试题:是否存在一个整数x,使得x+1<x成立? 存在(2147483647),整数超范围溢出
37.int相除,只保留整数,舍弃小数部分,除数不能为0,可以除0.0,无穷大,-0.0,-无穷大,0(-0)除以0.0,NaN
38.余数的符号与被除数符号一致
39. 前缀(++i)自变量先自增再运算,后缀(i++)自变量先运算再自增
40.自增自减/复合赋值都隐含着强制类型转换(byte b=10; b=b+1 不可以,b++/b+=5 是可以的)
41.java把内存分为栈区,堆区,方法区(方法区中有常量区)三块
42.Str1="abc" str2="abc" str3="ab"+"c" str4=new String("abc")
str1=str2=str3 <>str4(常量区中可以共享一样字符串的地址,new会在堆中分配一个储存空间再去常量区查找值,所以地址不同,“==”比较的是字符串内容的地址)
43.42.Str1="abc" str2="abc" str3="ab"+"c" str4=new String("abc")
str1.equals(str2).equals(str3).equals(str4)都是true(.equals比较的是字符串内容的值)
44.^异或(当左右2边不一样时为true,否则为false)
45.基本类型转换字符串(str=123 可以写成 str="" +123)
46.面试题:如何实现两个数的原地交换?
方法1:x=x+y;y=x-y;x=x-y;
方法2:x=x^y;y=x^y;x=x^y;
实际应用中,建议使用 int temp=x;x=y;y=temp;
47.Scanner 不能直接读取1个字符(char),但可以先以字符串读取,再调用String.charAt(0)读取第0个字符
48.System.currentTimeMillis 计算当前时间,返回1970-1-1午夜到现在的毫秒(世界协调时,晚8小时时差)
49.return 结束当前方法的执行
50.switch case default break没有先后顺序,switch表达式只能为int(short、byte、char)、String、枚举类型(不需要default),case后只能放常量(char可以放1个字符),不能重复,没有break,case穿透
51.枚举类型 enum,获取枚举里的值用枚举类型变量名.值,是一个类,有.class字节码文件
52.直接可以在代码中使用的类不用导包是因为这个类在JAVA.LANG包里
53.continue 结束本次循环,继续下次循环
54.字符串倒序排列:个位 num%10,十位num/10%10,百位num/10/10%10.......
获得字符串是str=str+余数,获得整数是int=int*10+余数
55.求第二高数的思路,第二高为之前第一高,业务逻辑先设定第二高,再设定第一高
56.求质数思路,判断这个数能不能被2-这个数-1整除,可以就是false不是质数
57:中断标签,名字随便取,break/continue加":"
58.数组初始化默认:int =0;String=null;boolean=false;char=0的字符
59.foreach 循环数组,只能读取数组元素,不能改变数组元素
60.数组逆序排列:首位互换,依次类推,for(int i=0;i<arr.length/2;i++) int t=arr[i];arr[i]=arr[arr.length-1-i];arr[arr.length-1-i]=t
61.eclipse ctrl+F11 快速运行
62.设置代码提示:window-preference-java-editor-contentAsistent在.后面输入a-z
63.如果复制过来的.java文件编码不一致,找到文件编辑txt,另存为utf-8 .java格式,再复制黏贴进esclipse的类中,直接打开不能运行
64.导入电脑上已经存在的项目到esclipse中:import-java-existing projects into workspace
65.包名格式:公司域名的倒叙.项目名.模块名
66.如果一个类定义在包中,这个类的完整类名就变为:包名.类名
67.完全数:可以被1和整除商的和(1,28,496,8128,130816,2096128,33550336)
68.debug:step F5 转到方法内部执行
step F7 从方法中返回
step over F6 执行下一条语句
Resume F8 执行到下一个断点
69.ctrl+shift——F
70.栈区分为方法栈和数据栈,在方法栈中定义的局部变量,可以看作是方法栈中分配的存储空间
71.在定义方法时,指定的参数称形式参数,给方法传递的参数为实际参数
72.方法重载:方法名相同,参数类型或个数不同
73.递归先找规律再确定结束条件
74.重命名:alt+shift+R
75.ctrl+1 快速修复
76.面向过程是以解决问题的步骤为核心,各个步骤之间都是紧密相关的
77.面向对象是以事物为中心,通过给对象发送消息解决问题
78.new是一个运算符,会在堆区中分配一块存储空间,把这块存储空间的起始地址赋值给变量
79.在不同包中能定义重名的类,在同包中不能定义重名的类
80.通过类定义了对象,如果不给对象的各个变量赋值,对象的各个成员变量默认赋值
String null ,int 0,double 0.0 , boolean false
81.构造代码块在每次NEW 之前执行,成员变量赋值其实是在构造方法体前面先执行,构造代码块和成员变量赋值哪个在前先处理哪个
82.快捷键:alt shift s 打开sourse
83.方法的形参与字段名相同,在方法体中采用就近原则,使用的是形参,或者用this.关键字来访问字段
84.在构造方法中this指的是new出来的对象,在实例方法中this指的是调用这个方法的类
85.this() 方法调用构造方法必须作为构造方法的第一条语句
86.形参参数是个类的话,如果在方法体中这个类new了,那么调用的实参和这个形参没有任何关系,所以要用this.类
87.面向对象三个特点:封装 继承 多态
88.is not visible一般是字段被私有化了,没权限使用
89.静态变量属于整个类,共享,存储在方法区,所有对象都可以访问到他
90.静态变量生成于类的创建,到这个运行结束,可以直接用类名.静态变量使用
91.静态方法只能直接使用静态成员,不能直接使用非静态成员,在实例方法可以使用静态成员,一般在定义工具类使用静态方法
92.静态构造方法不能创造,因为构造方法时在类创造时给对象赋值,而静态是和对象无关的
93.静态构造代码块只执行一次
94.静态内部类中不能直接使用外部类的非静态成员,可以使用外部类的静态成员
95.单利分为饿汉式和懒汉式设计模式,懒汉模式为了防止多线程,要在方法前加synchronized同步锁
96.虽然通过子类名或子类对象能访问到父类的静态成员和方法,但这不是继承(子类构造代码块中无执行)
97.构造方法不能被继承,父类如果没有无参构造方法,系统会报错,子类构造方法创建前,先创造父类构造方法
98.super()必须作为子类构造方法的第一条语句,在子类构造方法中,不能同时出现this()和super(),因为她们都必须作为第一条语句存在
99.重写规则:
1-子类方法的签名(方法名和方法参数列表)必须和父类方法签名一致
2-如果方法的返回值类型不是引用类型,子类方法的返回值类型必须和父类的一致
如果方法的返回值类型时引用类型,子类方法的返回值类型可以是父类方法返回值类型的子类
3-子类方法的访问权限可以大于或等于父类方法的访问权限
父类public 子类只能使用public
父类protected 子类可以protected/public
父类default 如果子类和父类在同包中,子类方法可以default/protected/public
父类default 如果子类和父类不在同包中,子类不能重写
父类private,子类不能重写
4-如果父类有异常抛出,子类重写的方法可以抛出父类异常或者父类异常的子异常
100.可以使用@Override来验证重写是否正确
101.克隆就是对象的深复制,在堆中
102.把对象转换字符串:String.valueOf(obj);
103.哈希码是10进制的
104.子类的toString()方法建议重写,并把类名改为this.getClass.getSimpleName能被继承
105.多态的四个条件:
1-继承
2-子类重写父类方法
3-让父类引用指向子类对象
4-通过父类引用调用被重写方法
所以子类实例变量不存在多态的问题,如果父类引用指向子类对象,但有和父类重名的变量,是指向父类的成员变量,不是子类的
106.抽象类不能实例化对象,但可以引用指向子类对象(向上造型)
107.抽象类中不一定有抽象方法
108.有抽象方法必须是抽象类
109.接口只有4个内容:
1-抽象方法
2-静态方法
3-Static final 常亮
4-default 方法
类实现了接口必须重写接口的所有抽象方法
110.接口中方法默认使用public abstract,不能加protect 和private
111.接口不仅可以继承,还可以实现多继承
112.在成员内部类中不能定义静态方法和静态成员变量
113.静态内部类中不能访问外部类成员变量和方法,和对象没有关系,可以访问静态变量
114.匿名内部类一般用于实例化抽象类和接口,可以重写外部类的抽象和实力方法
115.StringBuilder 线程不安全效率高 StringBuffer 线程安全效率低
116.StringBuilder 构造器默认存储16个字符,超过这个容量就16*2+2,
初始构造器可以在()里写字符串和字符串长度
117.append() 添加true 等于字符串后面拼加 true
118.append() 因为返回this,所以形成方法链,可以连写
119.//冒泡排序
public static void sort(int[] array){
for(int i=0;i<array.length;i++){
for(int j=0;j<array.length-1-i;j++){
if(array[j]>array[j+1]){
int temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
120.使用数组二分查找必须先把数组排序,速度快,最少一次,最多15次
121.Integer中自动封装int,但是[-128,127]中的数还是int类型,所以==是true,超出是false,为提高效率
122.DateFormat 是抽象类不能实例化,只能new SimpleDateFormat("yyyy年-MM月-dd日")
SimpleDateFormat 字母模式
字母 日期或时间元素 表示 示例
G Era 标志符 Text AD
y 年 Year 1996; 96
M 年中的月份 Month July; Jul; 07
w 年中的周数 Number 27
W 月份中的周数 Number 2
D 年中的天数 Number 189
d 月份中的天数 Number 10
F 月份中的星期 Number 2
E 星期中的天数 Text Tuesday; Tue
a Am/pm 标记 Text PM
H 一天中的小时数(0-23) Number 0
k 一天中的小时数(1-24) Number 24
K am/pm 中的小时数(0-11) Number 0
h am/pm 中的小时数(1-12) Number 12
m 小时中的分钟数 Number 30
s 分钟中的秒数 Number 55
S 毫秒数 Number 978
z 时区 General time zone Pacific Standard Time; PST; GMT-08:00
Z 时区 RFC 822 time zone -0800
123.Calendar是抽象类,只能new GregorianCalendar来实现类
124.GregorianCalendar月份1月从0开始,星期从周日开始算1
125.File 构造器可以用绝对路径,目录,目录对象加路径
126.异常分为checked 和unchecked,checked需要手动处理,编译不通过
127.catch顺序是异常类子类放前面,父类放后面
128.try catch finally return 顺序,finally一般不要加return ,会覆盖try catch的return
129.try catch finally return顺序
130.子类异常重写不能等级超过父类的异常,而且必须和父类在同类(Exception/RunTimeException)
131.引用类型4个字节
132.<<左移一位相当于乘以2,>>右移一位相当于除以2,>>>无符号位移,空位以0补齐
133.set 无序 不重复,list 有序 可重复
134.vector 底层也是数组实现,另外是线程安全的,效率低 ArrayList 和LinkedList 线程不安全 效率高
135.LinkList 分为单向和双向,双向第一个没头,最后一个没尾
136.HashMap 线程不安全效率高 HashTable 相反
137.Map Key不能重复,底层是数组+链表
138.HashCode相同但equals不一定相同,equals相同则HashCode肯定相同
139.for遍历list可以先判断这个数是否小于size的一半,小于就i++,大于就i--,在遍历就快很多
140.set的底层是map,所以set的值是不能重复的,另外也是无序的,所以没有get方法,必须使用iterator来遍历
141.对象就是封装和处理数据
142.javabean就是只有属性和get set方法的简单实体类,也叫po类
143.泛型不能使用在静态属性上,指定的类型不能是基本类型
144.泛型在接口不能用在全局常量上,只能用在方法上
145.子类中使用父类的属性按照父类定,子类新增方法按子类定
146.泛型没有多态,可以在申明引用时用"?"
147.泛型没有数组
148.自定义比较 实现comparator抽象类,并重写compare方法
149.字节流是二进制,可以处理一切,inputStream/outputStream
处理流,增加性能,在节点流之上
转换流,只能处理字节流,处理解码编码问题 2进制--字符 输入流为解码,字符--2进制 输出流为编码 inputStreamRead/outputStreamWriter150.输入流是反序列化 输出流是序列化 :objectInputStream/objectOutputStream,必须先序列化然后反序列化,不是所有对象都可以序列化,必须是写 java.io.serializable接口,是一个空接口,不需要序列化的在属性前加transient
151.System.out.print是用了print处理流,可以写成printStream ps=System.out ps.println();
152.类与类关系:依赖(方法)、关联(属性)、继承、实现
153.线程有合并线程join,暂停线程yield(静态方法,在哪个线程调用就暂停哪个线程),休眠线程sleep(静态方 法,保留锁)
154.线程优先级代表的是概率,不是绝对的顺序优先级
155.线程wait notify必须要先同步才能使用
156.在同一协议下,端口号不能重复,1024以下端口建议不用
157.JDBC mySql Driver: Class.forName("com.mysql.jdbc.driver")
158.JDBCDreiverManager:DriverManager.getConnection(),返回一个Connection对象
159.通过Connection对象获得Statement对象:con.creatStatement(),除了大批量,否则不建议,因为sql注入
160.通过Connection对象获得PrepareStatement对象:con.PrepareStatement(sql),建议使用,可以使用?占位符
161.PrepareStatement的Date是java.sql.Date
162.ResultSet一般使用While(rs.next){rs.getInt(1)...}
163.最后所有connection,prepareStatement,ResultSet都要关闭
164.增删改是DML语句
165.Create table是DDL语句
166.事务起始于DML语句,结束语Commit/Rollback语句或DDL/DCL语句或断开con
167.事务四大特性:原子性,一致性,隔离性,持久性
Spring
168.Spring是一站式框架:Web层:Spring MVC ,Service层:Spring ioc,dao层:Spring jdbcTamplate
169.Spring底层原理:xml配置文件,dom4j解析xml,工厂模式,反射
170.倒包要在web-inf的lib文件下,核心配置建议放在src文件下,名字建议ApplicationContext.xml
171.配置文件先复制引入beans约束代码
172.加载ApplicationContext ac=new ClassPathXmlApplicationContext(“bean.xml”) xml配置对象
173.单例就是同一个哈希地址
174.配置文件可以用bean标签 下的Construct-arg 标签注入有参构造的属性值,也可以用property value标签注入set方法的属性值,如果是注入对象可以用property ref标签
175.p名称空间注入:再约束里赋值xmlns标签,然后xmlns后面加:p,最后的bean改成p,然后在bean标签里直接加p:属性名=“”就可以
176.数组和list注入:在property标签下加list标签再加value标签
177.map注入:在property标签下加map标签再加entry标签再entry标签,里面写key和value
178.properties注入:在property标签下props标签,再加prop标签里面写key,外面写值
179.注释注入也要有新的约束,开启注释扫描(扫描类,方法,属性):context:compenent-scan 标签,base-package里面多个包可以加,或者只写包前缀
180.context:annotation-config 只能扫描属性注释,不建议用
181.在类中注释:@compenent(value=“str”) ,value相当于bean里的id
182.注释有4个:@compenent @Controller web层,@service 业务层,@repository 持久层
183.注释单多实例:类上加@scope(value=“prototype”),多实例
184.使用注释注入类属性值的话不需要创建set方法,直接在属性上面用注释实现:@AutoWired或@Resource(name=“str”),name指定的就是@compentent类的value值
185.AOP中的joinpoint连接点就是一个类中那些可以被增强的方法
186.AOP中的pointcut切入点就是实际上被增强的方法
187.AOP中的advance增强就是被增加增强的逻辑,分为5部分:前置,后置,异常,最终,环绕
188.AOP中的aspect切面就是把增强应用到具体的方法上,这个过程叫切面
189.AOP用aspectj框架来实现,有2种方式:xml配置和注解
190.表达式1:execution(访问修饰符 被增强类全路径.方法名(..)) 访问修饰符一般用*代表所有类型,类要全路径,也可以用*代表所有类,..代表所有参数,方法名也可以用*代表所有方法
191.配置1:先配置类的2个bean,2:配置aop:config标签,先配置切入点-aop:pointcut 中express=”execution(表达式)”标签,再配置切面-aop:aspect 标签 中ref=“增强类的id”,然后再加aop:before等配置增强类型,里面method=“增强的方法名”,再加pointcut-ref=“原切入点方法的id”
192.环绕加强在参数里需要加proceedjoinpoint引用,proceedjoinpoint.proceed()可以调用被增强的方法
193.log4j用来查看框架中的日志,log4j的properties文件复制到src目录下
Spring整合web项目
194.在web.xml指定spring位置:<context-param>
<param-name>ContextConfigLocation</param-name>
<param-value>classpath:bean.xml</param-value>
</context-param>
195.在web.xml配置监听器,绿色固定,需要先倒包ContextLoaderListener.jar:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
196.AOP注释 先开启AOP操作:<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
197.在增强类前写@Aspect,在增强方法前写@before/AfterReturning/Around/AfterThrowing(value="execution(表达式)")
198.AOP注释也是通过表达式execution()来表示
199.jdbcTemplate应用在spring 的dao层,从new DriverManagerDataSource 对象获取数据库对象,
200.jdbcTemplate如果要查询,需要自己封装
201.jdbcTemplate.queryForObject(sql,new rowMapper,obj..)查询记录一条记录,需要自己重新实现rowMapper接口,实现2个方面:获得ResultSet中的值,并把值封装进一个对象,返回该对象
202.jdbcTemplate查询所有记录使用jt.query(sql,rowmapper,obj)
203.service注入dao注入jdbcTemplate注入dataSource
204.Spring事务管理api中PlatformTransactionManager接口的实现类:org.springframework.jdbc.datasource.DataSourceTransactionManager
205.事务管理先要有约束,然后配置事务,<bean id="" class="org.springframework.jdbc.datarsource.DataSourceTransactionManager>在bean里面注入dataSource
206.事务的增强配置:<tx:advice id="" transaction-manager="事务配置的id"> 然后<tx:attributes> 然后<tx:method name="service里的方法名,方法名部分可以用*代替">
207.切面和AOP基本一样:<aop:config> <aop:pointcut expression="" id=""> <aop:advisor advice-ref="" pointcut-ref="">
208.用注解完成事务:
1,配置事务管理器 <bean id="" class="org.springframework.jdbc.datarsource.DataSourceTransactionManager>
2,开启注解事务 <tx:annotation-driven transaction-manager="事务管理器的id">
3,在需要事务的类前加注释@Transactional
SSH
209.STRUTS2 web层,Spring service层,Hibernate Dao层
210.web配置里面添加监听标签,再找到spring的xml文件,web配置过滤器
211.Struct2配置里面的action标签里class不需要写全路径,只要写Spring配置里Action的bean的id
212.Spring配置文件配置Hibernate对象:<bean id="" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> 然后注入dataSource<property name="" ref="datasource">再指定使用hb的核心配置文件位置<property name="configLocations" value="classpath:hb路径名称">
213.service注入的name是dao的接口,ref是dao实现类
214.在spring配置hbTemplate的时候<property name="sessionFactory" ref="">注入sessionFactory对象
215.hb需要配置事务把只读改成commit
216.分模块引用:<import resource="classpath:bean.xml">