java基础
遗忘点,难点
1.ASCII码表中,48—0,65—A,97------a,32------空格
2.``System.out.println(–a);
System.out.println(a–);
结果是不同的,
3.逻辑与(&)和短路与(&&)的区别:逻辑与的判断方式是:
从左到右依次判断,直到结尾(逻辑全程运算)
短路与的判断方式是:
从左到右依次判断,直到出现false为止将不再判断,直接得到结果为false(短路遇false就停)
4. switch 语句中的变量类型可以是: byte、short、int 或者 char。从 Java SE 7 开始,switch 支持字符串 String 类型了,同时 case 标签必须为字符串常量或字面量。
switch 语句可以包含一个 default 分支,该分支一般是 switch 语句的最后一个分支(可以在任何位置,但建议在最后一个)。default 在没有 case 语句的值和变量值相等的时候执行。default 分支不需要 break 语句。
5.方法重写时,重写方法的异常抛出不能大于父类的方法的异常。
6.return,break,continue之间的区别
7.单例模式:第一种------饿汉式(直接创建本类对象,提供使用)
第二种------懒汉式(先不创建对象,等到需要的时候再进行创建)是对一种饿汉式的优化(1)融入延迟加载的思想,.不会再第一时间加载资源,创建对象,而是等到需要使用的时候再来判断加载。(2)解决线程安全隐患,在操作共享数据的时候加锁。
第三种------DoubeCheckedLocking
创建类DoubleCheckedLockingDemo
/**
* volatile,弱锁(1.只能修饰变量。
* 2.且只保证原子的可见性,不保证原子性。
* 3.不会造成线程阻塞.
* 4.不会被编译器优化。
* 5.本质就是告诉JVM当前变量在寄存器(工作内存)中的值是不确定的,需要从主内存中读取)
* 可见性:做的任何改变,其他对象都知道
* synchronized ,强锁
* 原子性:要成功都成功,要失败都失败
* 单例模式
* @author tarena
*双重校验锁
*/
public class DoubleCheckedLockingDemo {
//1.创建构造方法并且私有化;
private DoubleCheckedLockingDemo() {
}
//2.创建该类的对象,懒
private static volatile DoubleCheckedLockingDemo singleton;
//3.提供一个方法,让其他可以来获取该对象
public static DoubleCheckedLockingDemo getSingle() {
System.out.println("执行了。");
if(singleton==null) {
synchronized (DoubleCheckedLockingDemo.class) {
if(singleton==null){
singleton=new DoubleCheckedLockingDemo();
} }
}
return singleton;
}
}
创建多线程类TestDoubleCheckedLocking 来检验单例是否正确。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class TestDoubleCheckedLocking implements Runnable{
public static void main(String[] args) {
//
TestDoubleCheckedLocking t1=new TestDoubleCheckedLocking();
ExecutorService pool = Executors.newFixedThreadPool(10);
pool.execute(t1);
pool.execute(t1);
pool.execute(t1);
pool.execute(t1);
pool.execute(t1);
}
@Override
public void run() {
// TODO Auto-generated method stub
DoubleCheckedLockingDemo single1 = DoubleCheckedLockingDemo.getSingle();
DoubleCheckedLockingDemo single2 = DoubleCheckedLockingDemo.getSingle();
System.out.println(Thread.currentThread().getName()+(single1==single2));
}
}
第四种----------枚举,单例的特殊写法。
8.synchronized、volatile、ReentrantReadWriteLock的区别
9.接口与接口之间可以多继承,类与类只能单继承(子类继承抽象类,要么子类为抽象类,要么重写父类所有抽象方法),类可以实现多个接口且必须重写所有接口方法,或者变成抽象类。接口没有构造方法,实现接口的类的super(),可能调用的是顶级父类OBJECT的构造方法。
10.接口里没有成员变量,都是常量。所以,你定义一个变量没有写修饰符时,默认会加上:public static final
11.接口里的方法,默认就都是抽象的,如果你不写明是abstract的,那会自动补齐 public abstract
12.StringBuffer底层是依赖了一个字符数组才能存储字符数据 的,该字符串数组默认 的初始容量是16,自动增长1倍+2。
ArrayList相当于在没指定initialCapacity时就是会使用延迟分配对象数组空间,当第一次插入元素时才分配10(默认)个对象空间。假如有20个数据需要添加,那么会分别在第一次的时候,将ArrayList的容量变为10;之后扩容会按照1.5倍增长。也就是当添加第11个数据的时候,Arraylist继续扩容变为10*1.5=15;当添加第16个数据时,继续扩容变为15 * 1.5 =22个
ArrayList没有对外暴露其容量个数,查看源码我们可以知道,实际其值存放在elementData对象数组中,那我们只需拿到这个数组的长度,观察其值变化了几次就知道其扩容了多少次。怎么获取呢?只能用反射技术了。
默认的负载因子大小为0.75,当一个map填满了75%的bucket时候,和其它集合类(如ArrayList等)一样,将会创建原来HashMap大小的两倍的bucket数组,初始容量是2^4.
反序列化,读的方法,在读到最后一个为NULL的时候会抛出异常 EOEFException.
SOCKET服务器端的单个字节读取流,在判断返回值-1的时候会抛出异常。
OI流中复制粘贴,输出流的时候,按照数组的大小来写入,必须每次写数组大小的实际长度,否则会出现多写的BUG
如何把对象强制转化为LIST对象集合。
13.----
1.oop特征---------封装(安全性),继承(代码复用性),多态(灵活性),他们的特征和优点是什么?
2.集合
—collection
—list
----set
----map集合
3.BIO,NIO,AIO
4.反射
5.JVM原理
6.算法
错题bug集
1.运算问题
int x=4;
System.out.println("value is"+((x>4)?99.9:9));
//输出结果为 value is 9.0(运算结果显示为大的数据类型)
2.String的构造方法,和运算
String str=null;
System.out.println(str);//输出为null
//System.out.println(str.length());//会报空指针异常,因为 str为空
String str1=new String();
System.out.println(str1);//打印的是空白,String重写了ToString方法。
System.out.println(str1.length());//打印的是0
String str2=str+str1;//相当于null+“”,任意的跟字符串相加,最后转化为字符串,所以Str2的值是“null”
System.out.println("相加后的值:"+str2);//null
System.out.println("相加后的长度"+str2.length());//打印长度为4
3.兔子数列的实现。冒泡排序。文件读取,再筛选。控制台输入一行字符,得到对应字符出现的次数。
4.在反射时,获取私有属性必须用getDeclared***,在设置属性值的时候必须暴力设置私有属性可见,否则要报错。
5.在用GIT串代码,出现
常用的GIT命令操作:
链接: 文章目录.
知识补充.