每周总结[1] 20190918-0925

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颠倒回去,恢复入栈的顺序。
这时两个的不同之处。

发布了47 篇原创文章 · 获赞 1 · 访问量 1289

猜你喜欢

转载自blog.csdn.net/weixin_41750142/article/details/101473657