shijinglu2018

1.final关键字的特点

final修饰变量时,在堆内存中的地址是不变的,但对象的内容是可变的。//思考,找例子

 

2.静态变量的特点

实例变量是用对象引用,要先实例化对象,而静态变量属于类,只要类加载了,就可通过类名

直接调用。

 

3.静态方法(一块内存,且内存共享)是否可以调用非静态方法?

不可以,会报错,而非static方法是可以访问静态方法的。

//写个例子,一个main方法一个普通方法一个静态方法

 

4.equals与==的区别

equals是判断两对象内容相等,==是判断值是否相等,

如果判断引用类型(比如String或其它引用类型)则判断内存地址是否相同。

//看以往的笔记或找例子

/*字符串比较*/

public class StringCompareTest {

    public static void main(String[] args) {

        String s1 = "abc中文";

        String s2 = "abc中文";

        String s3 = new String("abc中文");

        System.out.println(s1 == s2);//true,在常量池中有同一块空间,因为内容相等,所以不会再申请

        System.out.println(s1.equals(s2));//true

        System.out.println("----------");

        System.out.println(s1 == s3);//false

        System.out.println(s1.equals(s3));//true

    }

}

 

5.equals与hashCode的区别与关系。

比如为什么它们之间存在着充分不必要关系?另外,…

 

6.int和Integer的区别?

Integer是引用类型,默认值是null,而int是值类型,默认值为0,Integer是

int的包装类型。

 

7.private变量是否可以被继承?父类的private方法是否可以被子类调用?

//写个例子

public class Father {

    private String name;//私有属性

    private char sex;

    

    public void tell(){

        System.out.println(name+sex);

    }

    

    private void speak(){

        System.out.println(name+"is speaking!");

    }

public class Child extends Father {

 

}

 

/**

 * 定义测试类

 * @author CBS

 */

public class Test {

 

    public static void main(String[] args) {

        

        Child c=new Child();

        c.tell();//tell方法是可以用的

        //c.speak();//报错,父类的私有方法不可见

    }

 

}

//子类不能继承父类的私有属性,但是如果子类中公有的方法影响到了父类私有属性,那么私有属性是能够被子类使用的,父类的私有方法不可以直接被使用。

 

9.private/public/default/protected的区别?

private的权限最小,可以理解为当前类权限。‘4’

public的权限最大,跨类甚至跨包访问。‘1’

protected不可以跨包访问,所以也近似包权限,但可以访问不同的子孙‘2’

default(有的也用friendly表示),可以理解为包权限。‘3’

 

10.重写和重载的区别?

重载是同一个类中,方法名相同,但参数类型或个数不同,与返回值无关。

重写是多个类中,产生继承的关系,父类与子类的方法相同,一般情况下

子类的访问权限大于等于父类的权限。

 

//以前书上看过重载是编译时多态,重写是运行时多态.正确.

 

 

11.接口和抽象类的区别?

区别:定义接口的关键字是interface  定义抽象类的关键字是abstract

接口中的成员不能私有,抽象类可以。

接口中定义的成员,是final public static类型,抽象类没有。

接口中不能有普通方法,抽象类可以有。

抽象类不可以修饰属性和构造方法。

public abstract class Person{

 private String name;

 private int age;

 private char gender;//不能用abstract来修饰属性

 public Person(){//不能用abstract来修饰它

 

 }

 public String getName(){

  return name;

 }

 public void setName(String name){

  this.name=name;

 }

 public void print(){

  System.out.print(...);

 }

 public abstract void learn();//无方法体,不能有大括号

}

 

public interface USB{

 void init();

}//写一个接口

 

public class Udisc implements USB{

 //重写init方法,用implements来实现接口的方法体

 @override

 public void init(){

          System.out.print("U盘初始化");

 }

}

 
public class Test{

 public static void main(String[] args) {

  Udisc a=new Udisc();

  a.init();

 }

}

 

 

 

相同:

两个都不new但接口与抽象是面向对象的必备知识,设计模式、重构

代码有必然作用。

 

final, finally, finalize的区别

final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,

类不可继承,内部类要访问局部变量,局部变量必须定义成fianl类型

finally是异常处理的一部分,总是执行。

finalize是Object类中的一个方法,在垃圾回收器执行的时候回调用被

回收对象的此方法,可以覆盖此方法提供垃圾的其他资源回收,例如

关闭文件等。JVM不保证此方法总被调用。

 

String、StringBuffer与StringBuilder区别

1.String字符串常量,速度最慢

2.StringBuffer字符串变量(线程安全),速度次之

3.StringBuilder字符串变量(非线程安全),速度最快

 

所有的类都继承与object类的直接子类有哪些?object类常用的方法

有哪些?

1.clone方法

保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用

该方法,否则抛出CloneNotSupportedException异常。

2.getClass方法(复习一下几种获得Class的方法

final方法,获得运行时类型。

1)调用Object中的getClass()

Class c1=x.getClass();

2)用Class类的forName()静态方法获得与字符串对应的Class对象

Class c2=Class.forName(“java.lang.String”);

3)用“类型名.class”获取该类型的Class对象。例如:

Class c1=Manage.class;

Class c2=int.class;

 

3.toString方法

该方法用得比较多,一般子类都有覆盖。

4.finalize方法

该方法用于释放内存资源,因为无法确定该方法什么时候被调用,很少

使用。

5.equals、hashCode方法

6.toString方法

7.notify、notifyAll、wait方法

8.数组有没有length()方法?String有没有length()方法?

数组无length()方法,有length属性,String有length()方法

String[] aaa=new String[]{“sa”};

aaa.length;

String str=“aaaa”;

str.length();

7.hashCode方法

该方法用于hash查找,重写equals方法和hashCode方法,该方法具有

哈希功能的Collection中用到,一般必须满足obj1.equals(obj2)=true;

可以推出obj1.hash()-Code()=obj2.hashCode(),但是hashCode相等

不要满足equals。不过为了提高效率,应该尽量使上面两个条件接近

等价。

8.

1.if(usename. equals(“zxx”)){ }

//如果usename=null时,则会报空指针错误,可以改为zxx.usename??

2.int x=1;

return x==1? true:false;

 

9.String是类,不是基本数据类型,算是引用数据类型

 

10.运行时异常和一般异常的区别

运行时异常是运行时出现异常,而一般异常是编译的时候出现异常

 

11.请你写出5个runtime Exception。

空指针、数组越界、ClassCastException(找不到类)

//查一下

 

12.什么是多线程?

          在一个应用程序中,同时,有多个不同的执行路径(像树的结构)。

 

13.说一下多线程的好处?

提供程序效率;并发执行,可以给人更真实的感受,比如一个网页既有图片又有

文字,如何同步呢?如果用到线程给人的感官就更真实了。

 

14.线程和进程有什么区别?

线程是进程的一条执行路径,而进程是线程的集合,另外,程序是静态的可触发的进程。

 

15.什么是线程同步、异步?

线程同步表示,当前线程执行完后下一个线程接着执行。

线程异步表示,在一个应用程序中,同时,有多个不同的执行。

 

16.线程之间如何同步?

线程之间同步使用synchronized、wait、notify。

//多做题,多自己动手写代码练习,学习过程一定要有个输入输出的过程。

//找个例子

public class Bank {

    private double[] accounts;

    private int amounts;

    public synchronized void transfer(int from, int to, int amount) throws  InterruptedException{

        while (accounts[from]<amounts){

            wait();

            accounts[from]-=amount;

            accounts[to]+=amount;

            notifyAll();

        }

    }

    public synchronized double getTotalBalance(){

        
    }

}

 

 

 

17.什么是线程不安全?

就是在多个线程共享同一个数据受到其他线程的干扰,出现访问

错误或死锁。如何解决:使用线程同步技术,用上锁(synchronized),

让一个线程执行完了,再让另个线程执行。

 

18.如何创建一个线程?

方法一:继承Thread,重写run方法,启动一个线程用start();

方法二:实现Runnable接口,重写run方法,启动一个线程用

start();

//找个例子

public class ThreadTest extends Thread {

    public void run(){

        for (int i=0;i<100;i++){

            Thread a=new ThreadTest();

            System.out.println("ThreadTest"+i);

        }

    }

}

 

public class MyRunner implements Runnable {

    public void run(){

        for (int i=0;i<100;i++){

            System.out.println("MyRunner"+i);

        }

    }

    public static void main(String[] args) {

        MyRunner mr=new MyRunner();

        Thread thread2=new Thread(mr);

    }    

}

 

19.是用Runnable接口好?还是继承Thread更好?

是用Runnable接口更好,因为它可以实现多继承,可以共享变量资源。

 

20.sleep()和wait()有什么区别?

a、sleep是让当前线程指定休眠时间,然后继续工作,不释放

锁。//(Thread.sleep(1000);)

b、让当前线程wait则是等待,直到有线程通知notify()唤醒

它才会重新工作,释放锁。//this.wait();   this.notify();

 

 

21.集合的框架结构图

1)它的框图记住没?里面的一些相似概念的区分呢?

ArrayList是查询较快(底层是通过数组实现的,数组的默认长度为10),增删较慢,而LinkList由于内部是双链表,所以插入删除较快,查询效率低。(找个例子,或者看看书)

 

22.说一下HashMap底层实现方式?

HashMap是由数组+链表组成

 

23.ArrayList和Vector的异同?

相同点:这两个类都是实现List接口的(List接口继承了Collection接口),

它们都是有序的,相当于是一个动态数组,易于索引,且数据可以重复。

不同点:Vector相对于ArrayList是相对安全的,因为它是同步的,且

它增加了一个可以返回枚举类型的数据的方法(看蓝白书)。还有数据增长....(看宝典)

 

24.HashMap和HashTable的区别

HashMap和HashTable都属于Map接口下的,

区别同上,HashMap相比HashTable是不安全的。(看之前的博客)

 

25.Collection和Collections的区别是什么?

Collection是集合类的上级接口,继承于它的接口主要有Set和List,

Collections是针对集合类的一个帮助类它提供了一系列的静态方法

实现了集合的排序,搜索和线程的安全等操作。

 

26.Set里的元素是不能重复的,那么用什么方法区分重复与否?

用==还是用equals()?它们的区别?

元素是否相当用equals(找例子,看书)

 

27.HashMap的底层实现是用链表加数组实现的,它的put方法是通过

取模长度来得到这个下标的,一旦下标相同就会使用链表。

 

28.请说下Iterate的作用

迭代器可以实现Collection接口的方法,所以一个一个地获取集合中的

元素,在遍历集合是,可判断是否还有下一元素。(找个例子)

 

29.HashSet和TreeSet的区别?什么时候用它们?

HashSet中元素不能重复,无顺序,TreeSet中的元素,但有顺序,

遍历集合中的元素排序是,用TreeSet,一般情况下用HashSet因为

不需要排序,速度比TreeSet块。

 

30.什么是泛型?怎么使用?有什么好处?

答:定义一个集合时,可以特意定义一个类型,可以强制转换。

 

31.for—each是强循环,一般用来遍历数组和集合。

 

32.HashMap和HashTable的区别

HashMap的键值对可以为空

HashTable的键值对不可以为空,线程安全。

 

33.Collections 的6个方法,并详细解释

 

34.集合和数组的优缺点

集合可以无限添加,集合什么类型都可以装,数组长度固定,

而且只能装单一类型。

分类:

技术点:

相关文章: