1.内部类
1.声明非静态内部类对象的方法: 外部类名.内部类名 对象名=new 外部类名().new 内部类名();
2.声明静态内部类对象的方法: 外部类名.内部类名 对象名=new 外部类.内部类名();
3.在匿名类中使用外部的局部变量,外部的局部变量必须修饰为final
4.外部类访问内部类:必须建立内部类的对象
内部类访问外部类:内部类可以直接访问外部类的成员包括私有成员,因为外部类持有内部类的引用(外部类.this.变量)
2.if语句与布尔一起使用
Boolean修饰的变量为包装类型,初始化值为false,进行赋值时会调用Boolean.valueOf(boolean b)方法自动拆箱为基本数据类型,因此赋值后旗值为真,输出文本true。如果使用==比较,则输出文本false.if的语句比较,除布尔值外的其他类型都不能使用赋值语句,否则会提示无法转成布尔值。
3.join方法
程序在main线程中调用t1线程的join方法,则main线程放弃cpu控制权,并返回t1线程继续执行直到线程t1执行完毕
所以结果是t1线程执行完后,才到主线程执行,相当于在main线程中同步t1线程,t1执行完了,main线程才有执行的机会。
join方法中如果传入参数,则表示这样的意思:如果A线程中掉用B线程的join(10),则表示A线程会等待B线程执行10毫秒,10毫秒过后,A、B线程并行执行。需要注意的是,jdk规定,join(0)的意思不是A线程等待B线程0秒,而是A线程等待B线程无限时间,直到B线程执行完毕,即join(0)等价于join()。
4.List的删除
对于List而言,想要移除元素,要不然就用迭代器。要不然就从后往前删除。
万万不可从前往后删,会出现角标越界。
5.关于抽象类和接口
1.抽象类可以在不提供接口方法实现的情况下实现接口。
2.子类继承抽象类父类必须重写父类中的抽象方法,如果子类也为抽象类则不用重写父类中的抽象方法。
6.值传递和引用传递
值传递是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量.
引用传递一般是对于对象型变量而言的,传递的是该对象地址的一个副本, 并不是原对象本身 。
一般认为,java内的基础类型数据传递都是值传递. java中实例对象的传递是引用传递
7.解释HashMap的容量为什么是2的n次幂?
- 提高操作运算效率(位运算效率 > 取模运算效率)
- 减少碰撞,数据均匀分布,提高HashMap查询效率
8.MyBatis中大于和小于号的转义写法
https://blog.csdn.net/zhou520yue520/article/details/82586665
9.mybatis中$和#的区别
1.#{}会将传进来的参数转换成单引号的形式,如:select * from user where name = 'csdn';因此#{}可以防止sql注入。
2.而不是#
10.intValue(),Valueof(),parseInt()
intValue()是把Integer对象类型变成int的基础数据类型; parseInt()是把String 变成int的基础数据类型; Valueof()是把String 转化成Integer对象类型;
11.同步方法和同步代码块的区别
同步方法默认用this或者当前类class对象作为锁;
同步代码块可以选择以什么来加锁,比同步方法要更细颗粒度,我们可以选择只同步会发生同步问题的部分代码而不是整个方法;
同步方法使用关键字 synchronized修饰方法,而同步代码块主要是修饰需要进行同步的代码,用 synchronized(object){代码内容}进行修饰;
12.在监视器(Monitor)内部,是如何做线程同步的
监视器和锁在Java虚拟机中是一块使用的。监视器监视一块同步代码块,确保一次只有一个线程执行同步代码块。每一个监视器都和一个对象引用相关联。线程在获取锁之前不允许执行同步代码。
13.ReenTrantLock 实现交流
使用 ReenTrantLock.newCondition() 获取一个 Condition 类对象,然后 Condition 的 await(),signal() 以及 signalAll() 分别对应上面的三个方法。
14.TreeMap
TreeMap通过红黑树实现Map接口的类,key不可以为null,会报NullPointerException异常,value可以为null。
15.Iterator和ListIterator的区别
Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。
Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。
ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等,Iterator只能用来删除元素。
16.hashmap的resize()方法
当hashmap中的元素越来越多的时候,碰撞的几率也就越来越高(因为数组的长度是固定的),所以为了提高查询的效率,就要对hashmap的数组进行扩容
hashmap的初始化initailCapacity是16,负载因子loadFactor的值是0.75,有这样一个公式:initailCapacityloadFactor=HashMap的容量,HashMap每次put操作是都会检查一遍 size(当前容量)>initailCapacityloadFactor 是否成立。如果不成立则HashMap扩容为以前的两倍(数组扩成两倍),
然后重新计算每个元素在数组中的位置,然后再进行存储。这是一个十分消耗性能的操作。
所以如果能根据业务预估出HashMap的容量,应该在创建的时候指定容量,那么可以避免resize().