1.通配符的上限,下限
首先引入泛型的使用:
public class A<T>
{private T t;
public A(T t)
{this.t=t;}
}
通配符"?"表示任意类型。可以指定泛型上限,如:
public class B<? extends Number>
{A a=new A(8);}
是会报错的,因为使用"extends"关键字,规定了泛型上限为Number,"?"表示的类型必须是Number的子类,而子类不可以接受父类类型的参数。
还可以指定泛型下限,如:
public class C<? super String>
{A a=new A("ohh");}
是可以的,因为使用"super"关键字,规定了泛型下限为"Sting",那么"?"表示的类型必须是String的父类,作为父类,是可以接受各种子类的数据的。
即:设置泛型上限只可用在声明,但不能修改,而下限用在方法参数时可以修改内容。
2. 所有数值类的父类:Number.
数值类:Integer,Byte,Long,Short,Double,Float
数值类有个范围:-128~127,在这个范围以外的数值是会被重新开辟空间存储的。
数值类是有缓存机制的。在-128~127之间的数字会被缓存,而范围之外的数据,会生成新的对象。
Integer a=100;
Integer b=100;
Systrm.out.println(a==b);
//运行结果为true
Integer c=2999;
Integer d=2999;
Systrm.out.println(c==d);
//运行结果为false
数值类判断值相等时要用equals()方法而不是"=="。
3. 编译型/解释型语言:
写好的代码先被编译器编译,但不是被编译成机器语言,而是编译成字节码(*.class),运行时,由JVM(Java虚拟机)将字节码一行一行地解释成机器码。
对于不同的操作系统有不同的虚拟机,因此说是真正实现跨平台。
4.泛型
- 是不存在泛型数组的。
- 泛型只存在于编译阶段,在进入JVM之前,泛型信息会被擦除。——类型擦除。
字节码中已没有泛型相关的信息。
5.泛型接口的实现
interface <T> ITheGeneric
{}
有两种实现方式.
(1)
第一种,类实现接口时,仍沿用泛型,如:
class Realize<T> implements ITheGeneric
{private T t;
public Realize(T t)
{this.t=t;}}
在类实例化对象时才声明具体类型。
Realize<Integer> r=new Realize();
写错了。应该是ITheGeneric r=new Realize();
(2)
第二种,实现类种就声明具体类型。
class Realize<Integer> implements ITheGenric
{}
写错了。应该是class Realize implements ITheGenric{}
这样在类实例化对象时不需要再声明具体类型。
6. 非线程安全/线程安全
ArrayList /Vector
StringBuilder/StringBuffer
HashMap /HashTable
非线程安全指的是,在多个线程同时操作一个对象(共享数据)时出现问题。
非线程安全指的是多线程操作同一个对象时可能会出现问题。
而线程安全是指操作同一个对象不会出现问题。
线程安全必须使用很多的synronized关键字来同步控制,这样必然导致性能的降低。
7. 线程
Thread类和Runable接口,其中Thread类是实现了Runable接口的。
8.单元测试需要放在 public class中。
9. float与double
float都是转化为doule类型参与运算的。
10. 栈的实现
基于数组:需要Object类型的数组,Maxsize,CurrentSize。
基于链表:需要Node类,需要CurrientSize.
11.队列的实现
栈Stack是泛型类,队列Queue是接口,一般用其实现类LinkedList.
栈的方法有:push(E item);
pop()//返回栈顶值并出栈
empty();
peek();
队列的方法有:
add(E e) offer(E e)
remove() poll()
peek()
其中,add和remove方法在遇到队列满和空时会抛出异常,而pull和方法只返回false.
为节约空间,可以用循环队列,多出一个空间用来区分队满和队空。
12. import包要放在package后面
13. 树的高度,深度
高度:从叶子往上算。
深度:从根往下算。
14.树的优势:方便查找。
15.完全二叉树的特点:除了最后一层以外都是满的。
16.循环语句中注意循环条件。
比如:
int size=stack.size();
for(int i=0;i<size;i++)
{stack.pop();}
和
for(int i=0;i<stack.size();i++)
{stack.pop();}
是不同的,易出错。
17.递归调用需要先写终止条件。
18.注意用栈实现队列和用队列实现栈的区别:
(1)
用栈实现队列:两个栈,实现出队操作:当栈A中元素依次出栈并入到栈B中,剩下一个元素时,该元素出栈即相当于队列的出队操作。重复即可。
(2)
用队列实现栈:两个队列,栈的出栈操作:当队列A中全部元素依次出队并入到队B中,即完成了顺序的颠倒,此时将B出队,即相当于出栈操作,而出队后还需要再将队B颠倒回去,恢复入栈的顺序。
这时两个的不同之处。