JAVA基础常见问题

1. String ,StringBuffer和StringBuilder的区别?
1. java.lang.StringBuffer和java.lang.StringBuilder的可变字符序列,一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
这两者上的主要操作是 append(String x) 和 insert (int n,String x)方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。
2. 两者区别:StringBuffer是线程安全的,StringBuilder是多线程不安全的
3. String是定长的,这意味着在String里面做字符串的联结很耗资源。
4. 如果需要经常进行字符串连接,用StringBuffer,StringBuilder会快很多,但如果一般不需改其值或要对值进很修改,String会更好一些

 

2) java中常用集合
集合类存放于java.util包中。
集合类型主要有3种:set(集)、list(列表)和map(映射)。

其中List和Set接口都继承自Collection接口,而Map接口和他俩不同,不是继承于Collection接口。

(1)集 Set

集(set)是最简单的一种集合,它的对象不按特定方式排序,只是简单的把对象加入集合中,就像往口袋里放东西。

对集中成员的访问和操作是通过集中对象的引用进行的,所以集中不能有重复对象。

集也有多种变体,可以实现排序等功能,如TreeSet,它把对象添加到集中的操作将变为按照某种比较规则将其插入到有序的对象序列中。它实现的是SortedSet接口,也就是加入了对象比较的方法。通过对集中的对象迭代,我们可以得到一个升序的对象集合。

1:HashSet 能够快速定位一个元素,但是它要求存入HashSet的对象必须实现HashCode方法

2:TreeSet 将放入其中的元素按序存放



(2)列表 List

List接口与其实现类是容量可变的列表,可以按照索引访问集合中的元素,是有序的集合

列表在数据结构中分别表现为:数组和向量、链表、堆栈、队列。

1:ArrayList: 实现一个数组,它的规模可变并且能像链表一样被访问。它提供的功能类似Vector类但不同步,它是以Array方式实现的List,允许快速随机存取。

2:LinkedList: 实现一个链表,提供最佳顺序存取,适合插入和移除元素。由这个类定义的链表也可以像栈或队列一样被使用。

(3)映射 Map

映射与集或列表有明显区别,映射中每个项都是成对的,Map是把键对象和值对象进行关联的容器。映射中存储 的每个对象都有一个相关的关键字(Key)对象,关键字决定了对象在映射中的存储 位置,检索对象时必须提供相应的关键字,就像在字典中查单词一样。关键字应该是唯一的,也就是说Map中的键对象不允许重复,这是为了保证查询结果的一致性。

关键字本身并不能决定对象的存储位置,它需要对过一种散列(hashing)技术来处理,产生一个被称作散列码(hash code)的整数值,散列码通常用作一个偏置量,该偏置量是相对于分配给映射的内存区域起始位置的,由此确定关键字/对象对的存储位置。理想情况下,散列处理应该产生给定范围内均匀分布的值,而且每个关键字应得到不同的散列码。

1:HashMap: 实现一个键到值映射的哈希表,通过键取得值对象,允许存储空对象,而且允许键是空(由于键必须是唯一的,当然只能有一个)。

2:HashTable: 实现一个映象,所有的键必须非空。为了能高效的工作,定义键的类必须实现hashcode()方法和equal()方法。这个类是前面java实现的一个继承,并且通常能在实现映象的其他类中更好的使用。Dictionary的子类,缺省是线程同步的。不允许关键字或值为null,当元素的顺序很重要时选用TreeMap,当元素不必以特定的顺序进行存储时,使用HashMap.

Hashtable的使用不被推荐,因为HashMap提供了所有类似的功能,并且速度更快。当你需要在多线程环境下使用时,HashMap也可以转换为同步的。

在编写程序的过程中,使用到集合类,要根据不同的需求,来决定使用哪种集合类,比如,要经常遍历集合内元素,就要使用List,如果要保证集合中不存在重复的数据,就要用Set;如果要通过某一键来查找某一值,就要使用Map

 

3) 重载(Overloading)与(Overriding)重写区别?
1. Overloading 写道
(1)方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。重载Overloading是一个类中多态性的一种表现。
(2)Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性。
(3)重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准
 
public class Dog {
     Dog()
     {
            this.bark();
     }
     void bark()//bark()方法是重载方法
     {
            System.out.println("no barking!");
            this.bark("female", 3.4);
     }
     void bark(String m,double l)//注意:重载的方法的返回值都是一样的,
     {
            System.out.println("a barking dog!");
            this.bark(5, "China");
     }
     void bark(int a,String n)//不能以返回值区分重载方法,而只能以“参数类型”和“类名”来区分
     {
            System.out.println("a howling dog");
     } 
}
 
2. Overriding
(1) 父类与子类之间的多态性,对父类的函数进行重新定义。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。
(2) 若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。
(3) 子类函数的访问修饰权限不能少于父类的;
 
public class Base
{
    void test(int i)
    {
        System.out.print(i);
    }
    void test(byte b)
    {
        System.out.print(b);
    }
}
public class TestOverriding extends Base
{
    void test(int i)
    {
        i++;
        System.out.println(i);
    }
      public static void main(String[]agrs)
    {
        Base b=new TestOverriding();
        b.test(0)
        b.test((byte)0)
    }
}
 
 
4) Java关键字final、static使用总结 写道
一、final

  根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变:设计或效率。

  final类不能被继承,没有子类,final类中的方法默认是final的。

  final方法不能被子类的方法覆盖,但可以被继承。

  final成员变量表示常量,只能被赋值一次,赋值后值不再改变。

  final不能用于修饰构造方法。

二、static

  static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。
1、static变量
2、静态方法
  静态方法可以直接通过类名调用,任何的实例也都可以调用,因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。
3、static代码块
  static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。
static final用来修饰成员变量和成员方法,可简单理解为“全局常量”,对于变量,表示一旦给值就不可修改,并且通过类名可以访问。!
 
 class Base{  
         static void a( ){System.out.println("A");  }  
                  void b( ){System.out.println("B"); }  
 }  
 public class  Inherit extends Base{  
          static void a( ){System.out.println("C");  }  
                   void b( ){System.out.println("D"); }  
            public static void main(String args[]){  
                     Base b=new Base();  
                     Base  c=new Inherit();  
                     b.a();  
                     b.b();  
                     c.a();  
                     c.b();  
          }  
 } 
/*
以上输出的结果是:A
                           B
                           A
                           D
非静态方法 按重写规则调用相应的类实现方法,而静态方法只与类相关。
*/
 
5) java中public,protected,private区别? 写道
作用域     当前类 同package 子孙类 其他package

public          √          √          √          √

protected    √          √          √         ×

friendly        √         √          ×          ×

private         √         ×          ×          ×

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章