1、八大基本数据类型,byte、boolean占1字节,char、short占2字节,int、float占4,long、double占8
2、unicode编码: 前缀加 \u ,如 char c='\u005d';
3、自增: num1=1;
num2=num1++; 执行顺序:num2=num1;num1=num1+1;
num2=++num1; 执行顺序:num1=num1+1;num2=num1;
例子: int x=3; int y = (x++)+5; ==> x=4;y=8;
4、运算符优先级: () --> !,++,-- --> *,/,% --> +,- --> <,<=,>,>= --> ==,!= -->&& --> || --> =,+=,*=,/=,%=,-=
5、可变参数的方法:public void aa(int... n){for(int i:n){}} 调用: aa(1),aa(1,2) 多个参数都可
注意,当有 aa(int n)函数, 则会调用没可变参数的方法
6、父子类调用顺序: 父类静态代码块-》子类静态代码块-》父类构造代码 -》父类无参构造方法
静态代码块:类中 static{ } 括起来的代码 ; 构造代码块: 类中 { } 括起来的代码
7、构造方法中 this、super不能并存,因为都要放在第一行
8、父类构造方法不能被继承和重写
9、final修饰的对象不能修改其引用,即不能再new,但是可以修改其属性值
10、获取内部类对象实例,方法1: new 外部类.new 内部类
如 Person是Eye的外部类,创Eye实例: Person.Eye myeye = new Person().new Eye();
方法2:Person中提供获取Eye实例的方法,该方法 new Eye();
获取静态内部类对象实例, new 外部类.内部类 ,如 new Person.Eye(); //注意写法
11、静态内部类,即 static修饰的内部类,只能访问外部类的静态成员,访问非静态成员需要先new出外部类实例。
12、异常:Throwable 分 Error和Exception,Error为虚拟机错误,内存溢出,死锁
Exception:检查异常(代码中一定要try catch)和RuntimeException
RuntimeException:空指针、数组下标越界、算术异常、类型转换异常
13、try、catch、finally 三个都有return返回值,调用该函数最终将返回的是 finally 中的值
14、throw 自己声明抛出异常,throws在方法上抛出异常
15、包装类对象的比较
Integer a=new Integer(100); Integer b=new Integer(100); a==b --> false
Integer a1=100; a1==100 -->true
Integer a2=100; a1==a2 -->true
Integer a3=200; a3==200 -->true
Integer a4=200; a3==a4 -->false
总结:第一个是因为new出了两个对象,引用不同;第二个及第四个发生了类型转换,最终比较相同;Integer a2=100,当值在-128~127的时候jdk做了优化不会新建对象,但是200会新建对象,导致第三相同但第五不同。
16、float定义的数据要 f 结尾,double以d结尾,d可忽略。
17、String a1="aaa"; String a2="aaa"; String a3=new String("aaa"); String a4= String("aaa");
a1、a2在常量池,对应同一个; a3、a4在堆,对应两个对象
18、StringBuffer 线程安全、StringBuilder 不安全,但性能快。
19、集合:Collection、Map
Collection分:List(LinkedList、ArrayList)、Set(HashSet)、Queue(LinkedList); Map:HaspMap
20、Set:元素无序,不可重复的集合
HashSet只允许有一个null元素,良好的存取和查找性能。
迭代器: Iterator it = set.iterator();
21、HashSet:通过hashCode及equals两个函数对比两个对象是否相等
先通过hash算法找到对应值的hash值,从而确定放到对应的哪个桶中,然后在该桶通过equals比较与桶中其他元素是否相等,不等则添加进桶中,相等不放。
22、HashSet通过遍历去删除集合中某些元素将会报错。可以通过将满足条件的元素先添加到另一个新set集合,然后通过removeAll方法将这些元素移除。
23、线程五种状态:new、runnable、running、blocked、dead
24、线程的join方法,Thread中该方法定义 public final void join(),即不可重写,该方法表示其他线程需要等待调用该方法的线程执行完成之后才能获取cpu进行执行。即执行到这句时该线程将一直执行到结束,才将cpu还给其他线程去争抢。join方法可带参数表示将执行调用方法的毫秒数。
25、线程优先级:定义为1-10的整数,超出这个范围就抛错,默认为5。10的优先级是最高的。
可通过 Thread.currentThread().getPriority() 查看当前执行的线程的优先级。
也可以通过线程的 getPriority() 、setPriority(xxx) 来获取和设置线程的优先级。
26、线程间的通信涉及到 wait() 、notify()、 notifyAll()
wait():中断线程执行使其进入等待状态
notify():唤醒某个正在等待的线程,notifyAll():唤醒所有等待的线程
27、字节输入输出流:
InputStream : FileInputStream、PipedInputStream、FilterInputStream (BufferedInputStream、DataInputStream)、ObjectInputStream、SequenceInuptStream、ByteArrayInputStream、StringBufferInputStream
OutputStream : FileOutputStream、PipedOutputStream、FilterOutputStream (BufferedOutputStream、DataOutputStream)、ObjectOutputStream、ByteArrayOutputStream
28、FileInputStream : 主要方法 read()读一个字节,read(byte[] b)读最多b.length个字节,read(byte[] b,int off,int len)从off开始读最多len个字节,这些方法都返回 int 。
FileOutputStream : 主要方法 write(int b)写一个字节,write(byte[] b)从b写最多b.length个字节到文本,write(byte[] b,int off,int len)从b数组的off开始写最多len个字节到文本,这些方法都返回 void 。
29、字节流使用:
(1)读:
FileInputStream fis=new FileInputStream("xxx");
单字节读:
int n=fis.read(); //由于编码原因,n打印出来的可能会与文本内容显示不同,如文本2这里n为50,可以通过 (chat)n 显示出其字符
while((n=fis.read())!=-1){ (chat)n; } //读全文
多字节读:
byte[] b=new byte[1000];
fis.read(b); new String(b);
(2)写:
FileOutputStream fos=new FileOutputStream("xxx");
fos.write(50); //由于编码原因,文本中看到写入的内容为2, fos.write('a');
new FileOutputStream("xxx",true); //构造函数加多true表示追加,默认覆盖
(3)拷贝:
while((n=fis.read(b))!=-1){ fos.write(b,0,n); }
(4)缓冲流:读、写到缓存区的字节到达一定数量才真正进行读写
BufferedInputStream(InputStream in)、BufferedInputStream(InputStream in,int size)
BufferedOutputStream(OutputStream out)、BufferedOutputStream(OutputStream out,int size)
BufferedOutputStream使用结束要调一次 flush()跟close() 方法,这两个方法都会把缓冲区的字节马上写到文本中。
30、字符输入输出流 : Reader 、 Writer
Reader:BufferedReader、ChatArrayReader、StringReader、InputStreamReader、PipedReader、FilterReader
Writer:BufferedWriter、ChatArrayWriter、StringWriter、OutputStreamWriter、PipedWriter、FilterWriter
31、InputStreamReader(OutputStreamWriter类似):
(1)构造函数:
InputStreamReader(InputStream in); InputStreamReader(InputStream in,Charset cs);
InputStreamReader(InputStream in,CharsetDecoder dec); InputStreamReader(InputStream in,String charsetName);
(2)方法:getEncoding() //获取编码格式 read(); //读一个字符 read(char[] c,int off,int len); //读len个字符到char数组,数组从off开始赋值。
32、InputStreamReader使用:
FileInputStream fis=new FileInputStream("xxx"); InputStreamReader isr = new InputStreamReader(fis); int n=0; char[] c = new char[10]; while((n=isr.read(char))!=-1){ String s=new String(char,0,n); }InputStreamReader和OutputStreamWriter的结合使用,如下,进行文件复制等操作的时候读写字符流的编码格式要设置一致
FileInputStream fis=new FileInputStream("xxx"); InputStreamReader isr = new InputStreamReader(fis,GBK); FileOutputStream fos=new FileOutputStream("xxx.bak"); OutputStreamWriter osw = new OutputStreamWriter(fos,GBK);33、对象系列化 ObjectInputStream //对象输入流 ObjectOutputStream //对象输出流
系列化:把java对象转换为字节序列的过程 反系列化:把字节序列转换为java对象的过程
使用这两个流对对象进行系列化和反系列化操作,被系列化的对象必须实现 Serializable 接口
People p = new People(); //要被系列化的对象 FileOutputStream fos=new FileOutputStream("xxx"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(p); //将对象写到文件中 oos.flush(); FileInputStream fis=new FileInputStream("xxx"); ObjectInputStream ois = new ObjectInputStream(fis); People pp = (People)ois.readObject(); //读取对象34、servlet在请求接口最前面加如下代码设置编码:
response.setCharacterEncoding("UTF-8"); //HttpServletResponse设置服务器端以UTF-8编码进行输出 response.setContentType("text/html;charset=UTF-8"); //HttpServletResponse设置浏览器以UTF-8编码进行接收,解决中文乱码问题