一、static作用
static可以修饰内部类、方法、变量、代码块。
1、staic修饰的类是静态内部类,当声明一个事物是static时,就意味着这个域的方法不会与任何实例对象关联在一起,不用创建实例对象,就可以调用其static方法或者static域
类名.方法
2、static修饰的方法是静态方法,属于当前类,不属于某个对象,不能被重写,可以直接用类名来调用,不能用super或者this关键字。好处:可以在不创建任何对象的前提下调用。
3、修饰的变量是静态变量或者类变量,能够被所有的实例共享,在内存中只有一份,所有的实例对象的变量都指向它。
package demo;
public class aa {
public static class aaa{
static int a=0;
}
public static void main(String[] args) {
System.out.println(aaa.a);
}
}
4、修饰的代码块叫静态代码块,整个类加载的过程中只会执行一次。可以优化程序。
二、==和equals的区别
1、==:比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。
2、equals:比较两个对象的内容是否相等。
三、List集合的实现类有哪些?
主要有LinkedList、ArrayList、Vector。
1、ArrayList:底层依赖数组,查询效率高,做插入、删除效率低,线程不安全。
2、LinkedList:底层采用双向循环链表,增删效率高,查询效率低,线程不安全。
3、Vector:底层依赖数组,查询效率高(比ArrayList低,LinkedList高),增删效率低,线程安全。
三者的元素都是有序,可重复,允许null值的。
四、泛型的作用?
泛型的本质是参数化类型,所操作的数据类型作为一个参数,用在类、接口、方法的创建中。这些泛型类,泛型接口、泛型方法可以看作用指定类型作占位符,从而指定容器要持有什么类型的对象,而且由编译器来保证类型的正确性。这带来的好处:
1、类型安全:编译器可以在编译时验证类型。不符合参数类型的不能编译通过。
2、消除强制类型转换:消除源代码中的许多强制类型转换。增加了可读性。
另外补充一点:泛型方法使得方法能够独立于类而产生变化。通过使用泛型方法取代将整个类泛型化。对于一个static方法,在需要给它泛型化时,我们肯定不能通过给类加泛型实现,因为该静态方法是无法访问泛型类的类型参数,只能在该static方法上加泛型。例如:
public class aa {
public static <T> void f(T x) {
System.out.println(x.getClass().getName());
}
public static void main(String[] args) {
aa aa=new aa();
aa.f("11");//结果:java.lang.String
aa.f(11);//结果:java.lang.Integer
aa.f(111.1f);//结果:java.lang.Float
aa.f(111.1);//结果:java.lang.Double
}
}
五、String、StringBuffer、StringBuilder的区别:
1、String对象是不可变的,具有只读特性,指向他的任何引用都不可能改变他的值。任何一个看起来会修改String值的方法,实际上都是创建了一个全新的String对象,线程安全。
2、StringBuffer对象和StringBuilder对象是可变的,底层用字符数组保存字符变量,每次结果都会对对象本身进行操作,在改变对象引用(无新的对象生成)。
3、后两者有区别,StringBuffer是线程安全的,加了同步锁。部分代码如下:处理数据比StringBuilder慢一点。
public synchronized int capacity() {
return value.length;
}
4、StringBuilder是线程不安全的,底层没有加同步锁。
由于以上的区别,对使用提出以下意见:
如果要操作少量的数据用: String
2.单线程操作字符串缓冲区 下操作大量数据 :StringBuilder
3.多线程操作字符串缓冲区 下操作大量数据 : StringBuffer