• 笔试题二(java面向对象、多线程、集合)


    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.集合和数组的优缺点

    集合可以无限添加,集合什么类型都可以装,数组长度固定,

    而且只能装单一类型。

    成年人的世界没有那么多的童话,也没有那么多的逆袭。
  • 相关阅读:
    ios手势复习值之换图片-转场动画(纯代码)
    ios地图小例子和手势的使用 供大家参考一下呦
    basicAnimation移动图形
    一个layer可以跟着画完的线移动ios程序 好玩啊。
    kvo深入浅出举例
    kvc简单实现
    block 浅析
    从相册中取图片
    绘图quartz之渐变
    绘图quartz之加水印
  • 原文地址:https://www.cnblogs.com/shijinglu2018/p/8598098.html
Copyright © 2020-2023  润新知