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.集合和数组的优缺点
集合可以无限添加,集合什么类型都可以装,数组长度固定,
而且只能装单一类型。