java资料收集箱

在业余时间,看了一些Java的知识点,顺便总结一下,以备只需。

1.数组有没有length()方法?

没有,只有length属性,没有括号。

2.String有没有length()方法?

有。

3.String 是最基本的数据类型吗?

不是,是引用数据类型。

解析:内存空间模型,就像一个一个小格子,排列在一起。内存空间地址,就像一栋一栋的小房子,有门牌号。

程序中内存的使用:

int a=1;
Double b=2.2;
String s="abc";
String ss="abc";

 S没有直接存储abc,却存放了一个数值。

String类型属于间接存储,先存储地址,目标地址内存储内容,属于引用数据类型,引用就是地址。

Int 生成就存储,直接存储,是基本数据类型。

4.构造器(constructor)是否可被重写(override)?

不能。

5.Java 中会存在内存泄漏吗?

Java中会存在内存泄漏,内存泄漏就是在申请内存不使用后,这块内存不会释放。

6.描述一下MVC框架?

Model View Controller,即模型(model)-视图(view)-控制器(controller)。

7.int和Integer有什么区别?

int是基本数据类型,integer是相对于的引用类型,可以相互转化。

解析:基本数据类型:byte、short、int、long(整数类型)、float、double、char、boolean;

引用类型:除了基本数据类型和枚举类型。

8.当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

引用传递。但是有争议,回答值传递也可以,需要按照事实解释清楚,地址也是一种值,所以答引用传递和值传递都可以的。

9.Java学习资料链接:

    Java World

    Oracle 技术网 | Java SE 技术文档

   慕课网

   ImportNew

   码农网

   java123

   java学习网站大全

  Java官方文档索引

  11个最值得Java开发者收藏的网站

  史上最精炼JAVA知识点基础总结

  给 Java 学习者的超全教程整理

  40个Java集合面试问题和答案

  Java的21个技术点和知识点归纳 

  Stackoverflow上人气最旺的10个Java问题

  Java中Array与ArrayList之间的区别

  40个Java多线程问题总结

  十个JAVA程序员容易犯的错误

   20非常有用的Java程序片段

   25个Java机器学习工具&库

   Java程序员必读的9本书

   Java虚拟机体系结构深入研究总结

   10个精妙的Java编码最佳实践

   Java编程常见问题汇总

10.两大框架:SSH、SSM

SSH=Spring+Struts+Hibernate。
SSM=Spring+SpringMVC+MyBatis。

11.列举出JAVA中6个比较常用的包

   java.lang;java.util;java.io;java.sql;java.awt;java.net;javax.swing

12.JDK中哪些类是不能继承的?

不能继承的是类是那些用final关键字修饰的类。

一般比较基本的类型或防止扩展类无意间破坏原来方法的实现的类型都应该是final的。

13.String是最基本的数据类型吗?

基本数据类型包括byte、int、char、long、float、double、boolean和short。

所以String不属于基本数据类型范畴内,但String属于最常见一种引用类型。

14.short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?

对于short s1 = 1; s1 = s1 + 1;由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器会提示错误,需要强制转换类型。

对于short s1 = 1; s1 += 1;由于+=是java语言规定的运算符,Java编译器会对它进行特殊处理,因此可以正确编译。

【分析】主要考查几种基本数据类型在运算时的,由低到高会自动转换,而由高到低时会强制转换。

15.Java对象初始化顺序?

分为两种,一种是本类的初始化,一种是含有父类的初始化顺序。

这里分开来说:

本类的初始化顺序是:静态变量、静态初始化块、变量、初始化块、构造函数

继承类的初始化顺序是:父类静态变量、父类静态初始化块、子类静态变量、子类静态初始块、父类变量、父类初始化块、父类构造函数、子类变量、子类初始化块、子类构造函数。

说明:原则上回答全面的话,应该是完整的说出带有继承的这种类的初始化过程,下面有个步骤可以参考:

1.装载程序的时候首先找到的是它的基(父)类,如果有多层基(父)类则会一级一级的往上找最后找到根基(父)类。

2.执行根基础(父)类中的static初始化,再执行下一个衍生类中的static,依此类推,一直保持这个顺序。

3.此时类已经装载完毕,开始创建对象,所有的基本数据类型都会设成它们的默认值,对象句柄设为null

4.调用基础(父)类的构造方法,基础(父)类的构建采用与衍生类构造方法完全相同的处理过程。

5.构造方法初始完之后,进行变量的初始化。

6.执行构造方法中剩余的部分。

16.写几个线程安全类,不安全的,支持排序的类名?

Ø线程安全类:Vector、Hashtable、Stack。

Ø线程不安全的类:ArrayList、Linkedlist、HashSet、TreeSet、HashMap、TreeMap等。

Ø支持排序的类有HashSet、LinkedHashSet、TreeSet等(Set接口下的实现都支持排序)

【分析】此题主要考查集合框架的知识。在集合框架中Collection接口为集合的根类型,提供集合操作的常用API方法,该接口下派生出两个子接口,一个是不支持排序的List接口,一个是有自身排序的Set接口,所以回答排序与不排序分别从两接口的实现中在作答。线程安全上来说,Vector类比同属于List接口的ArrayList要早,是一个线程安全的类,在JDK1.2以后才推出一个异步的ArrayList类,比Vector类效率高。同理Stack继承自Vector也线程安全的类,另外在在Map接口的实现在Hashtable也是个线程安全的类。

17.哪几个方法可以实现一个线程?

一是继承Thread,重写Thread类的方法run方法;另种是实现runnable接口并实现run方法。

【分析】补充一下关于线程的run方法,在多线程API中启动一个线程是调用start()方法,线程进入就绪状态。

18.stop()和suspend()不推荐使用的原因?

stop()是因为它不安全。它会解除由线程获取的所有锁定,当在一个线程对象上调用stop()方法时,这个线程对象所运行的线程就会立即停止,假如一个线程正在执行:synchronized void { x = 3; y = 4;}由于方法是同步的,多个线程访问时总能保证x,y被同时赋值,而如果一个线程正在执行到x = 3;时,被调用了stop()方法,即使在同步块中,它也干脆地stop了,这样就产生了不完整的残废数据。而多线程编程中最最基础的条件要保证数据的完整性,所以请忘记线程的stop方法,以后我们再也不要说“停止线程”了。而且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。

suspend()方法容易发生死锁。调用suspend()的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定。此时,其他任何线程都不能访问锁定的资源,除非被"挂起"的线程恢复运行。对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁。所以不应该使用suspend(),而应在自己的Thread类中置入一个标志,指出线程应该活动还是挂起。若标志指出线程应该挂起,便用wait()命其进入等待状态。若标志指出线程应当恢复,则用一个notify()重新启动线程。

19."=="和equals方法有什么区别?

==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。

如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = new Object();变量obj是一个内存,new Object()是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。

equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。例如,对于下面的代码:

String a=new String("foo");

String b=new String("foo");

两条new语句创建了两个对象,然后用a,b这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即a和b中存储的数值是不相同的,所以,表达式a==b将返回false,而这两个对象中的内容是相同的,所以,表达式a.equals(b)将返回true。

在实际开发中,我们经常要比较传递进行来的字符串内容是否等,例如,String input =…;input.equals(“quit”),如果一个类没有自己定义equals方法,那么它将继承Object类的equals方法,Object类的equals方法的实现代码如下:

boolean equals(Object o){

return this==o;

}

这说明,如果一个类没有自己定义equals方法,它默认的equals方法(从Object类继承的)就是使用==操作符,也是在比较两个变量指向的对象是否是同一对象,这时候使用equals和使用==会得到同样的结果,如果比较的是两个独立的对象则总返回false。如果你编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖equals方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。

20.静态变量和实例变量的区别?

在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。

在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。

例如,对于下面的程序,无论创建多少个实例对象,永远都只分配了一个staticVar变量,并且每创建一个实例对象,这个staticVar就会加1;但是,每创建一个实例对象,就会分配一个instanceVar,即可能分配多个instanceVar,并且每个instanceVar的值都只自加了1次。

public class VariantTest

{

public static int staticVar = 0;

public int instanceVar = 0;

public VariantTest()

{

staticVar++;

instanceVar++;

System.out.println(“staticVar=”+ staticVar +”,instanceVar=”+ instanceVar);

}

}

备注:这个解答除了说清楚两者的区别外,最后还用一个具体的应用例子来说明两者的差异,体现了自己有很好的解说问题和设计案例的能力,思维敏捷,超过一般程序员,有写作能力!

21.构造器的名能不能和类的名字相同?

构造器的名称必须与类名相同。

【分析】构造器或构造函数主要用来对类的成员变量进行初始化,当类创建实例时调用。

22.在一个主方法类可不可以调用一个非静态的方法?

可以调用。因为Java的主方法(main)方法本身也是static类型方法,一个static类型方法,发起对另一个static方法的调用没有问题。

【分析】静态方法可以调用其它的静态方法,但是不能调用非静态方法,这个好比Java中的类变量与实例变量的关系。类变量是被所有类成员共享,而实例变量只被该实例共享,

23.一个类中可不可以有2个公共的方法?

可以。Java中对公共方法的个数没有约束,但是对公共的类有约束,一个Java源文件中只能定义一个public类型的类。

24.GC是什么,为什么要使用它?

       GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域,从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。

25.说一下垃圾回收的原理,可以直接从内存中回收吗?

      Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收,因为Java语言规范并不保证GC一定会执行。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。

26.Java的异常有哪几种,有什么区别?

    两大类,一般异常和运行时异常。一般异常,这些异常是在定义方法时声明抛出的,这些异常必需用try catch抛出,或throws处理,如果不处理,程序将编译失败。比如:IOException、FileNotFoundException、SQLException等。

运行时异常是程序运行时可能报出的异常。可以用try catch抓取,也可以不做任何处理。例如:NullPointerException异常就是一种比较常见的运行时异常。

27.switch语句能否作用在byte上,能否作用在long上,能否作用在String上?

     在switch(表达式)中,括号表达式只能是一个整数表达式或者枚举常量(更大字体),整数表达式可以是int基本类型或Integer包装类型,由于,byte,short,char都可以隐含转换为int,所以,这些类型以及这些类型的包装类型也是可以的。显然,long和String类型都不符合switch的语法规定,并且不能被隐式转换成int类型,所以,它们不能作用于swtich语句中。

28.Integer与int的区别?

int是java提供的8种原始数据类型之一,另外Java为每个原始类型提供了封装类,Integer是java为int提供的封装类。int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况。

29.Java Reflection是什么?

JAVA反射,Reflection是Java程序开发语言的特征之一,它允许运行中的Java程序对自身进行检查,或者说"自审",并能直接操作程序的内部属性。

30.写几个java.lang.Object类中的方法名称。

主要有equals()、toString()、getClass()、hashCode()、clone()、notify()、wait()、notify()方法。

31.下面代码中输出的结果是多少?

public class Example {
    String str = new String("good");
    char[] ch = {'a', 'b', 'c'};

    public static void main(String args[]) {
        Example ex = new Example();
        ex.change(ex, ex.str, ex.ch);
        System.out.print(ex.str + " and ");
        System.out.print(ex.ch);
        System.out.println("\n" + ex.str);// 输出依然是good
    }

    public void change(Example ex, String str, char ch[]) {
        System.out.println("同一个对象?" + (str == ex.str));
        // 字符串的操作只能是整个替换,所以对外面没有影响
        str = "test ok";
        // 址传递,指向的是同一个对象,这里改变了方法外面跟着变
        ch[0] = 'g';
        // 把ex整个替换掉,对外面没有影响
        Example temp = new Example();
        temp.str = "你猜猜";
        ex = temp;
    }
}

通过以上代码可以看出,反应的是Java中的值传递和引用传递

上述代码运行出来的结果。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值