新闻动态   News
搜索   Search
你的位置:首页 > 新闻动态 > 技术文档

Java学习笔记总结

2013/8/22 15:22:25      点击:

1. JDKJREJVM分别是什么,区别是什么?

答:

①、JDK 是整个Java的核心,包括了Java运行环境、Java工具和Java基础类库。

②、JREJava Runtime EnvironmentJava运行环境),运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。

③、JVMJava Virtual MachineJava虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

2. 写一个冒泡法程序,给10个杂乱无章的数字,按照从小到大的顺序排列出来。

Java程序为:

  1. class Java_Demo2 {  
  2.     public static void main(String[] args) {  
  3.         int[] a = {5,6,4,3,2,1,8,7,9,0};  
  4.         maoPao(a);  
  5.     }  
  6.     //冒泡排序法  
  7.     public static void maoPao(int[] a){  
  8.         for(int i=0;i<a.length;i++){  
  9.             for(int j=i;j<a.length;j++){  
  10.                 if(a[i]>a[j]){  
  11.                     int s = a[i];  
  12.                     a[i] = a[j];  
  13.                     a[j] = s;  
  14.                 }  
  15.             }  
  16.             System.out.print(a[i] + "\t");  
  17.         }  
  18.         System.out.println();  
  19.     }  
  20. }  

3. JDK1.7的新特性。

答:

1switch中可以使用字串 

Java代码:

  1. String s = "test";     
  2. switch (s) {     
  3.   case "test" :     
  4.      System.out.println("test");    
  5.   case "test1" :     
  6.     System.out.println("test1");   
  7.     break ;     
  8.   default :     
  9.     System.out.println("break");   
  10.     break ;     
  11.  }  <span style="font-family: Arial, Helvetica, sans-serif;"> </span>  

2"<>"这个玩意儿的运用List<String> tempList = new ArrayList<>(); 即泛型实例化类型自动推断。

3. 语法上支持集合,而不一定是数组 

Java代码:

  1. final List<Integer> piDigits = [ 1,2,3,4,5,8 ];   

4. 新增一些取环境信息的工具方法 

Java代码:

  1. File System.getJavaIoTempDir() // IO临时文件夹   
  2. File System.getJavaHomeDir() // JRE的安装目录   
  3. File System.getUserHomeDir() // 当前用户目录   
  4. File System.getUserDir() // 启动java进程时所在的目录   
  5. ....... <span style="font-family: Arial, Helvetica, sans-serif;"> </span>  

5. Boolean类型反转,空指针安全,参与位运算 

Java代码:

  1. Boolean Booleans.negate(Boolean booleanObj)   
  2. True => False , False => True, Null => Null   
  3. boolean Booleans.and(boolean[] array)   
  4. boolean Booleans.or(boolean[] array)   
  5. boolean Booleans.xor(boolean[] array)   
  6. boolean Booleans.and(Boolean[] array)   
  7. boolean Booleans.or(Boolean[] array)   
  8. boolean Booleans.xor(Boolean[] array)   

6. 两个char间的equals 

Java代码:

  1. boolean Character.equalsIgnoreCase(char ch1, char ch2)   

7,安全的加减乘除 

Java代码:

  1. int Math.safeToInt(long value)  
  2. int Math.safeNegate(int value)  
  3. long Math.safeSubtract(long value1, int value2)  
  4. long Math.safeSubtract(long value1, long value2)  
  5. int Math.safeMultiply(int value1, int value2)  
  6. long Math.safeMultiply(long value1, int value2)  
  7. long Math.safeMultiply(long value1, long value2)  
  8. long Math.safeNegate(long value)  
  9. int Math.safeAdd(int value1, int value2)  
  10. long Math.safeAdd(long value1, int value2)  
  11. long Math.safeAdd(long value1, long value2)  
  12. int Math.safeSubtract(int value1, int value2)  

4. switch语句能否作用在byte上,能否作用在long上,能否作用在String上。

答:在JDK1.6的版本中,switch后面的括号里面只能放int类型的值,注意是只能放int类型,但是放byteshortchar类型的也可以是因为byteshortshar可以自动提升(自动类型转换)为int。而不能放long型和String型。

而在JDK1.7的版本中,switch中可以使用字串String。但仍不支持long型。

Example1

  1. String name = "b";     
  2. switch(name) {    
  3.     case "a":    
  4.      System.out.println("String可以用于switch语句");    
  5.         break;    
  6. //可以运行  

Example2

  1. long long_s = 22222;     
  2.  switch (long_s) {     
  3.  case 22222:     
  4.  System.out.println("String可以用于switch语句");     
  5.  break;     
  6.  }    //报错!!!  

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

答:对于short s1 = 1; s1 = s1 + 1; 中s1 = s1 + 1;默认是int型的。

如果想继续计算,必须加强制转换

         short s1 = 1; 

         s1 = (short) (s1 + 1);

对于short s1 = 1; s1 += 1;  该段程序是没有错误的。

6. 说说&&&的区别;

答:&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)
if(expression1 & expression2){}expression1 expression2 无论expression1返回true还是false,都会继续判断expression2的返回值
if(expression1 && expression2){}中如果expression1 返回false,那么expression2 不执行,跳出if语句,如果expression1 返回true,继续判断expression2

7. char能否表达一个中文汉字。

答:可以的。

Example

         char cc = '';

         System.out.println(cc);  

可以执行并输出“说”

2013-07-16

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

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

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

2. 能否从static方法内部访问非static方法?

答:不可以。

static修饰的方法可以直接用类名调用,非static修饰的方法必须用类new出对象才能调用。当我们用类名直接调用时,可能这个类的对象并没有new,如果这时候static方法里调用非static的方法就会出现异常。

3. Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

答:Math.round() 函数是向上取整。

所以Math.round(11.5)等於 12Math.round(-11.5)等於 - 11

4. 数组长度和字符串长度如何获取。

答:数组长度的获取:数组名.lengthEgarr.length

字符串长度的获取:字符串名.length()Egstring.length()

字符串是length() 方法,数组是length 属性。

5. 满足重载的条件是什么,构造方法和普通方法都可以重载吗?

答:函数重载要求方法名一致,参数列表不一样(包括参数的个数、顺序、数据结构)。

构造方法和普通方法都是可以重载的。

6. 如何把一段逗号分割的字符串转换成一个数组;

答:拆分字符串可以运行split函数。

Example//将字符串str1按照逗号拆分并输出的程序如下所示

  1. System.out.println("拆分");  
  2. String[] strarr = str1.split(",");  
  3. for(String s : strarr){  
  4.     System.out.print(s+"\t");  
  5. }  

7. Integerint的区别?什么是自动装箱、自动拆箱?

答:int 是基本数据类型,Integer是其包装类。

Java为每个原始类型提供了封装类,Integerjavaint提供的封装类。int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况,例如,要想表达出没有参加考试和考试成绩为0的区别,则只能使用Integer

自动装箱:Java编译器将基本数据类型自动转换为包装类的过程。

例如:Integer i = 100;

    相当于编译器自动作以下的语法编译:Integer i = new Integer(100);

自动拆箱:Java编译器将包装类自动转换为基本数据类型的过程。

例如:

Integer i = 100;

int x = i;

相当于编译器自动作以下的语法编译:int x = i.intValue();


2013-07-17

1.  "=="和equals方法究竟有什么区别?

答:==equals的区别

1. ==可以用来比较基本类型和引用类型,判断内容和内存地址

2. equals只能用来比较引用类型,它只判断内容。该函数存在于老祖宗类 java.lang.Object

对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值的,因为Objectequals方法也是用双等号(==)进行比较的,所以比较后的结果跟双等号(==)的结果相同。

2. Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?

答:Overload表示方法重载,针对的是单一类。Overload要求方法名一样,而参数列表要不一样(包括参数的个数、顺序、数据类型)。

Override表示方法覆盖,针对的是有继承关系的类。当子类的某一方法与父类的方法名一样,并且参数列表完全一样(包括参数的个数、顺序、数据类型)的时候,我们称之为方法覆盖。

3. 接口是否可继承接口抽象类是否可实现(implements)接口抽象类是否可继承具体类(concrete class)? 抽象类中是否可以有静态的main方法?

答:接口可以继承接口。并且,接口之间的继承也允许多重继承的情况。

Example1

interface A {}

interface AA {}

interface AAA extends A,AA{}

抽象类也可以实现接口。

Example2

interface A {}

interface AA {}

interface AAA extends A,AA{}

abstract class D implements AAA {}

抽象类可以继承具体类。

Example3

class E{}

abstract class F extends E{}

抽象类中可以有静态的main方法:

Example4

abstract class TestDemo_InterfaceTest{

public static void main(String[] args) {

System.out.println("Hello World!");

}

}

4. abstract class和interface有什么区别?

答:声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。

接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。


2013-07-18

1. 简述OOP三大特征。

答:①、封装
    所谓封装,就是将某些东西包装和隐藏起来,让外界无法直接使用,只能通过某些特定的方式才能访问。OOP将万物都视为“对象”,任何对象都具有特性和行为。我们将其特性称为“成员变量”,将其行为称之为“成员函数”,被封装的特性只能通过特定的行为去访问。

②、继承
   后代具有祖先的某些特点就叫继承,当然后代还可以具有自己独有的特征。继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。

③、多态

多态性是允许将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。即通过多态,相同类型的变量,调用相同的方法,却能够产生不同的结果。

2. Java中实现多态的机制是什么?什么是造型,为什么要造型?

答:Java中实现多态的机制靠的是父类或者接口定义的引用变量可以指向子类或者具体的实现类的实例对象,而程序调的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。

具体来说,就是父类A有一个方法function(),子类B,C分别继承A并且重写function(),当创建一个对象A b = new B(); b.function()就调用Bfunciotn,假如你new C(),那调用的就是C重写的function。怎么判断使用那个类的function就是动态绑定,这个现象就是多态。

造型是将父类类型引用变量的值直接赋给声明为子类类型的变量。

造型的作用:在多态中,由于对象以其父类的身份出现,所以对子类中新添加的成员的访问受到限制,若想实现这些受限制的方法,就需要通过造型来恢复一个对象的本来面目。

 

2013-07-19

1. 如何把一段逗号分割的字符串转换成一个数组?

答:拆分字符串可以运行split函数。

Example//将字符串str1按照逗号拆分并输出的程序如下所示

  1. System.out.println("拆分");  
  2. String[] strarr = str1.split(",");  
  3. for(String s : strarr){  
  4. System.out.print(s+"\t");  
  5. }  

2. 运行时异常和声明型异常有什么区别?举出常见的几个RuntimeException

异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。

java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。

3. StringStringBufferStringBuilder的区别。

String类提供了数值不可改变的字符串。

StringBuffer类提供的字符串进行修改。并且它是线程安全的。

StringBuilder 和StringBuffer一样,只是他的字符串变量是非线程安全的。

4. String s = "Hello";s = s + " world!";这两行代码执行后,原始的String对象中的内容到底变了没有?

答:没有。因为String不可变类,所以它的所有对象都是不可变对象。执行代码后,s不指向原来那个对象了,而指向了另一个 String对象,内容为"Hello world!",原来那个对象还存在于内存之中,只是s这个引用变量不再指向它了。

5. 什么是内部类?Static Nested Class 和 Inner Class的不同。

答:内部类可以说是外部类的一个普通成员。

静态的Static nested class是不可以直接调用它的外部类enclosing class的,但是可以通过外部类的引用来调用,就像你在一个类中写了main方法一样。 

非静态类inner class 可以自由的引用外部类的属性和方法,但是它与一个实例绑定在了一起,不可以定义静态的属性、方法 。 

Inner Class(内部类)定义在类中的类。 

Nested Class(嵌套类)是静态(static)内部类。1. 要创建嵌套类的对象,并不需要其外围类的对象。 2. 不能从嵌套类的对象中访问非静态的外围类对象。


2013-07-20

1. 介绍Collection框架的结构. CollectionCollections的区别?

答:Collection框架的完整结构

1.类集框架最大的接口:CollectionMapIteratorEnumeration

2.Collection:存放单值

   |- List:允许有重复内容,有序

       |- ArrayList:异步处理,新的操作类,非线程安全。

       |- Vector:同步处理,旧的操作类,线程安全。支持Enumeration输出

   |- Set:不允许有重复内容,无序,靠hashCoke()equals()进行重复的严重

       |- HashSet:无序存放

       |- TreeSet:有序存放,安Comparable排序

3.Map:存放一对值

   |- HashMap:新的类,异步处理,非线程安全,允许有null

   |- Hashtable:旧的类,同步处理,线程安全,不允许有null

        |- Properties:属性操作类

   |- TreeMap:有序排列,按key排序,根据Comparable指定排序规则

4.Iterator:

   |- 迭代输出,依靠Collection接口中的iterator方法输出,是新的输出标准

5.Enumeration:旧的输出标准

  CollectionCollections的区别

Collection是集合类的上级接口,继承与他的接口主要有Set List.
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

2. ListSetMap的区别,Map是否是Collection子接口?说出它的主要方法,及各种类型的存储性能区别。

答:ListSetMap的区别:

List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。 和Set不同,List允许有相同的元素。 

Set是一种不包含重复的元素的Collection,即任意的两个元素e1e2都有e1.equals(e2)=falseSet最多有一个null元素。 Set的构造函数有一个约束条件,传入的Collection参数不能包含重复的元素。 

Map提供keyvalue的映射。一个Map中不能包含相同的key,每个key只能映射一个valueMap接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。 

Map不是Collection的子接口。

实现List接口的常用类有LinkedListArrayListVectorStack。 
LinkedList类:
LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的getremoveinsert方法在LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。 LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List: 
List list = Collections.synchronizedList(new LinkedList(...)); 
ArrayList类: 
ArrayList实现了可变大小的数组。它允许所有元素,包括nullArrayList没有同步。 
sizeisEmptygetset方法运行时间为常数。但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。其他的方法运行时间为线性。每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。和LinkedList一样,ArrayList也是非同步的(unsynchronized)。 
Vector类: 
Vector非常类似ArrayList,但是Vector是同步的。由Vector创建的Iterator,虽然和ArrayList创建的Iterator是同一接口,但是,因为Vector是同步的,当一个Iterator被创建而且正在被使用,另一个线程改变了Vector的状态(例如,添加或删除了一些元素),这时调用Iterator的方法时将抛出ConcurrentModificationException,因此必须捕获该异常。 
Stack 类: 
Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的pushpop方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。 

实现Set接口的常用类有HashSetTreeSet

HashSetSet接口的一个子类,主要的特点是:里面不能存放重复元素,而且采用散列的存储方式,所以没有顺序。

TreeSet的主要特点是:可对输入的数据进行有序排列。

实现Map接口的常用类有Hashtable,HashMap,Treemap。 

Hashtable类: 

Hashtable继承Map接口,实现一个key-value映射的哈希表。任何非空(non-null)的对象都可作为key或者value。 添加数据使用put(key, value),取出数据使用get(key),这两个基本操作的时间开销为常数。 Hashtable通过initial capacityload factor两个参数调整性能。通常缺省的load factor 0.75较好地实现了时间和空间的均衡。增大load factor可以节省空间但相应的查找时间将增大,这会影响像getput这样的操作。 Hashtable是同步的。 
HashMap类: 
HashMapHashtable类似,不同之处在于HashMap是非同步的,并且允许null,即null valuenull key。,但是将HashMap视为Collection时(values()方法可返回Collection),其迭代子操作时间开销和HashMap的容量成比例。因此,如果迭代操作的性能相当重要的话,不要将HashMap的初始化容量设得过高,或者load factor过低。 
WeakHashMap类: 
Treemap:适用于按自然顺序或自定义顺序遍历键(key)