20200109一家面试题

选择题

1.关于java类中static成员和对象成员说法正确的是(C)
A.static成员变量在对象构造时生成
B.static成员函数在对象成员函数中无法使用
C.虚成员函数不可能是static成员函数
D.static成员函数不能访问static成员变量

答案:c 解释,(1)类的static成员变量属于该抽象类,需要在类定义时初始化,不可以在对象的构造函数中初始化。(2) static成员函数在对象成员函数中可以调用,同属于一个类作用域 (3)正确,static成员函数不可以声明为const和virtual,详见C++ primer (4)static成员函数只能够访问static 成员变量。

2.关于hashmap和hashtable,错误的是(B)
A.两者都是key-value方式获取数据
B.hashtable允许null作为key和value,而hashmap不可
C.hashmap不是同步的,而hashtable是同步的
D.迭代hashmap采用快速失败机制,而hashtable不是

答案:B,很明显,说反了,只有hashmap才可以允许key和value为空的

3.java中,StringBuilder和StringBuffer的区别,错误的是(C)
A.stringbuffer是线程安全的
B.stringbuilder是非现成安全的
C.stringbuffer对string类型进行改变的时候其实等同于生成一个新的string对象,然后将指针指向新的string对象
D.效率比较string<stringbuffer<stringbuilder,但是在string s1="this is only a " + “simple”+"test"时 ,string 效率最高

说明:1.String含义为引用数据类型,是字符串常量.是不可变的对象,(显然线程安全)在每次对string类型进行改变的时候其实都等同与生成了一个新的String对象.然后指针指向新的String对象,所以经常改变内容的字符串最好不使用String,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了之后.JVM的垃圾回收(GC)就会开始工作,对系统的性能会产生影响
2.StringBuffer 线程安全的可变字符序列:对StringBuffer对象本身进行操作,而不是生成新的对象.所所以在改变对象引用条件下,一般推荐使用StringBuffer.同时主要是使用append和insert方法,
3.StringBuilder 线程不安全的可变字符序列.提供一个与StringBuffer兼容的API,但不同步.设计作为StringBuffer的一个简易替换,用在字符缓冲区被单个线程使用的时候.效率比StringBuffer更快

4.以下代码输出结果为(A)

public class test extends Thread{
@Override
public void run() {
	try {
		Thread.sleep(1000);
	} catch (InterruptedException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	System.out.println("run");
}

public static void main(String[] args) {
	test a=new test();
	a.run();
	System.out.println("main");
}

}

A.run main
B.main run
C.main
D.run

解释:线程小坑题 就是 不用start 直接调方法

简答题

1.Iterator和ListIterator的区别是什么?

(1). ListIterator有add()方法,可以向List中添加对象,而Iterator不能
(2). ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator就不可以。
(3). ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。
(4). 都可实现删除对象,但是ListIterator可以实现对象的修改,set()方法可以实现。Iierator仅能遍历,不能修改。
因为ListIterator的这些功能,可以实现对LinkedList等List数据结构的操作。其实,数组对象也可以用迭代器来实现。
2.comparable和comparator接口是干什么的?列出他们的区别
Comparable和Comparator接口是用来对自定义的class比较大小的。
Comparator和 Comparable的区别:Comparator定义在Person的外部而Comparable定义在Person的内部。
public class Persion implements Comparable {…比较Person的大小…},因为已经实现了比较器,那么Person现在是一个可以比较大小的对象了,它的比较功能和String完全一样,可以随时随地的拿来比较大小,因为Person现在自身就是有大小之分的。Collections.sort(personList)可以得到正确的结果。
Comparator是定义在Person的外部的,
public class Person{ String name; int age },然后另外定义一个比较器:
public PersonComparator implements Comparator() {…比较Person的大小…},在PersonComparator里面实现了怎么比较两个Person的大小. 所以用这种方法,要对一个 personList进行排序的时候除了要传递personList过去,还需要把PersonComparator传递过去,因为怎么比较Person的大小是在PersonComparator里面实现的,如Collections.sort( personList , new PersonComparator() )。

3.同步方法和 同步代码块区别?

说明:
同步方法:
即有synchronized 修饰符修饰的方法。
同步代码块
即有synchronized修饰符修饰的语句块,被该关键词修饰的语句块,将加上内置锁。实现同步。例:synchronized(Object o ){}
区别:
同步方法默认用this或者当前类class对象作为锁;
同步代码块可以选择以什么来加锁,比同步方法要更细颗粒度,我们可以选择只同步会发生同步问题的部分代码而不是整个方法;
同步方法使用关键字 synchronized修饰方法,而同步代码块主要是修饰需要进行同步的代码,用 synchronized(object){代码内容}进行修饰;

4.一个ArrayList对象的aList中存有若干个字符,删除’abc’的元素。
可以使用 Iterator 中的remove()方法

Iterator<String> iterator=list.iterator();
while(iterator.hasNext()) {
	if(iterator.next().equals("abc")) {
		iterator.remove();
	}
}

可以使用 for循环 删除 list.get(i)==bbb 进行remove ;后面要i–;
为了使i成为删除之前的索引位置,因为删除了就少了一个,否则会跳过删除元素后面的元素。

5.编写方法对List集合进行排序,然后遍历输出。

public static void sort(int [] a){
    int i, j;
    for(i=0; i<a.length; i++){
        for(j=1; j<a.length-i; j++){
            if(a[j-1] > a[j]){
                int temp;
                temp = a[j-1];
                a[j-1] = a[j];
                a[j]=temp;
            }
        }
    }
    
    System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
    for (int k = 0; k < a.length; k++) {
        System.out.print(a[k]+"&&");
    }
    System.out.println();
    System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
}
发布了10 篇原创文章 · 获赞 8 · 访问量 316

猜你喜欢

转载自blog.csdn.net/weijx_/article/details/103991720