JavaSe

作者: wanggs | 来源:发表于2018-10-07 00:01 被阅读0次

    1.你每天必上的五个网站是什么?

    开源中国 微博 36氪 虎嗅网

    2.移动硬盘标注的是500G,但是实际容量只有400G?

    硬盘厂商的换算是1000MB = 1G, 而操作系统的换算单位是1024MB = 1 G

    3.==和equals()区别?

    == 比较基本类型,比较的是值是否相等;比较引用类型,比较的是内存地址是否相等.
    equals方法是Object类中的方法,该方法,内部默认的比较对象也是 == 比较内存地址是否相等,Object子类可以重写equals方法自定义比较规则比较值是否相等,例如,String就是重写equals方法,比较的是字符串值是否相等。

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

    静态变量对于每个类,都是一份,而且变量值也是相同的,而实例变量对于每个实例类来说,都拥有自己的一份,每个对象都可以有不同的实例变量。

    5.Integer 和 int的区别?

    int是八种基本类型的一种,而Integer是包装类的一种,是int的封装类,主要用于int类型和String的转化。

    6.重写和重载的区别?

    重写是出现在继承中,子类可以根据自己的需要重写父类的方法,如果父类的方法有private和final修饰,不能被重写,重写后,子类对象调用的该方法时就会执行子类中重写的方法,而不再调用父类的方法。重载是指在一个类中,,方法名相同,但是方法参数雷彪不同,参数列表不同是指参数数量不同,类型不同,数量不同。

    把多个共性的东西提取到一个类中,这种是继承的做法。但是呢,这些共性的东西有的时候,方法声明一样,但是方法体,也就是说,方法声明一样,但是每个具体的对象在具体实现的时候内容不一样,所有我们定义这些共性方法的时候,就不能给出具体的方法,而没有具体方法的方法是抽象方法,一个中有抽象方法,那么这个类是是抽象类。

    7. 什么是抽象类?

    抽象类是指用abstract 关键字修饰的类,这种类不能被实例化,并且这种类中可以有普通方法和抽象方法,抽象方法是指没有方法体的方法,这种方法的内容在子类中得到体现,抽象类,主要用于被继承,所以抽象类不能用final来修饰,一个类继承抽象类,必须要实现抽象类的抽象方法,除非该类是抽象类。

    8. 接口是什么?

    接口中不能有普通方法和实例变量,接口中定义的都是抽象法方法和常量,所以接口比抽象类更抽象,接口中定义的方法,主要用于被类实现,一个类可以实现多个接口,实现接口后,必须要实现接口中的所有方法,除非是抽象方法,接口可以继承接口,并且可以多继承。

    9. 谈谈hashCode()和equals()?

    这两个都是Object中定义的方法,所有java中的对象都拥有这两个方法,如果两个对象的哈希值返回相同,但是equals返回值不一定true,但是如果两个对象的equals返回值是true,那么这两个对象的hashCode值一定相同。HashSet类就是使用该机制保证没有重复元素。

    10.String类和Integer类是否可以继承?

    不能被继承。 因为两个类都是用final修饰的,final修饰类,该类不能被继承,final修饰方法,该方法不能被重写,final修饰变量是常量。

    11.String StringBuffer StringBuffered 区别?

    String类在java中表示字符串,并且是引用数据类型。StringBuffer和Stringbuffered主要是解决String类型多次累加造成性能的低下,而出现的,StringBuffer线程安全的类,StringBuffered是线程不安全的类。

    12. 如何把字符串转成数组?

    使用String类中的split方法。例如: str.split(" ,");

    13.final 和 finally区别?

    使用final修饰的类,该类不能被继承,使用final修饰的方法,该方法不能被重写。使用final修饰的变量是常量。 finally关键字是用于异常处理,无论异常是否出现,都会执行finally代码块。

    14. error 和 exception区别?

    ava 中Throwable类中有两个子类,分别是error和exception,Erro一般指的是jvm的错误,程序中无法处理。Exception 的子类分为运行异常和非运行异常,RuntimeExceptionl类以及其子类,是运行异常,其他是编译异常,即异常不处理程序编译不通过。

    15. 写出常见的异常?

    java.lang.NullPointerception、java.lang.IndexOutofBountsException

    16.实现多线程有那些方式? 如何启动一个线程?

    在java中实现多线程有两种方式,第一种是让类继承Thread类并且重写run方法,这种方式定义的子线程通过start方法来启动。第二种是让类实现Runnable接口,并且实现run方法,这种方式启动要借用Thread类中的start方法。

    多线程: 多线程Demo.

    17.如何引起一个线程安全?

    多线程环境下同时访问同一个对象的实例变量,会引起线程安全问题。

    18.Collection 和 Collections 区别?

    Collection 是单例集合List,Set 的父接口,Collectins是集合的工具类,包含查询等方法.

    19. List 和 Set区别?

    • List 有序,可重复
      • ArrayList
        • 底层数据结构是数组,查询快,增删慢。
        • 线程不安全,效率高
      • Vector
        • 底层数据结构是数组,查询快,增删慢。
        • 线程安全,效率低
      • LinkedList
        • 底层数据结构是链表,查询慢,增删快。
        • 线程不安全效率高。
    • Set 无序,唯一
      • HashSet
        • 底层数据结构是哈希表。保证唯一依赖连个方法:hashCode()和equals()
      • LinkHashSet
        • 底层数据结构是链表和哈希表。链表保证有序,哈希表保证元素唯一
      • TreeSet
        • 底层数据结构是红黑树。
        • 排序: 自然排序、比较器排序

    ArrayList、Vector、HashMap、HashSet的默认初始容量、加载因子、扩容增量

    HashMap 和 HashTable的区别?

    HashTable是线程安全的 HashMap线程不安全,HashTable 不允许Null键和Null值 HashMap允许Null键和Null值

    遍历方式
      Map<String, Object> map = new HashMap<String, Object>();
            map.put("tom", 12);
            map.put("jack", 21);
            System.out.println("方式一");
            // 方式一
            Set set = map.entrySet();
            Iterator iterator = set.iterator();
            while (iterator.hasNext()) {
                Map.Entry me = (Map.Entry) iterator.next();
                Object key = me.getKey();
                Object value = me.getValue();
                System.out.println("key: " + key + "   value: " + value);
            }
            System.out.println("方式二");
            // 方式二
            for (String key : map.keySet()) {
                System.out.println("key: " + key + "   value: " + map.get(key));
            }
            System.out.println("方式三");
            // 方式三
            for (Map.Entry<String, Object> entry : map.entrySet()) {
                System.out.println("enty " + entry + "       key: " + entry.getKey() + "   value: " + entry.getValue());
            }
    

    20. 谈谈java中的序列化?

    将java对象写入流的工程中成为序列化,将对象从流中读取出来称为反序列化。参与序列化的对象必须要实现java.lang.Seralizable接口,并生成一个序列化Id

    21. 基本类型有哪些? 对应的包装类?封装类的作用?

    数字类型: 分为整数类型int short byte long 浮点型: float double 字符型 char 布尔型: boolean,对应的包装类有Integer,Short,Byte,Long,Float,Character, Boolean; 封装类主要用于对应的基本类型转换成String类型

    22. 写出线程的生命周期?

    准备 就绪 运行 死亡; 准备 就绪 运行 阻塞 就绪 运行 死亡

    23. 如何处理线程安全问题?

    1. 在方法声明中添加Synchronized关键字; 第二种使用Synchronized代码块

    24.java所在类的根类?这些类的常用方法是?

    java中所有的跟类是Object,例如 toString()方法用于返回一个对象描述的字符串,equals()用于比较两个对象。

    25. 什么是面向接口编程?

    面向接口编程可以让类耦合性降低。使用接口作为方法参数,代表可以传入这个接口的所有实现类对象; 使用接口作为方法的返回值,代表可以返回接口的所有实现类对象。

    26. Java异常是如何分类的?

    异常可以分为运行异常和非运行异常,运行异常是RuntimeException及其子类,除此之外,都是非运行异常,当程序抛出异常时,可以选择性捕获,但是非运行异常,则必须要捕获或者向上抛出,否则无法编译。

    27. 什么是守护线程,如何实现?

    守护线程指随着主线程死亡而死亡的子线程。在子线程调用之前,调用setDaemo(true)方法,即可将限制设置为守护线程。

    28 什么是Join线程.如何实现?

    join 线程可以让其他线程先进入阻塞到自己执行完成。调用线程的join方法即可。

    29. 面向对象的特征?

    封装 继承 多态 封装:隐藏实现细节,提供公共的访问方式。 提供代码复用性,提高代码安全性。继承: 把多个相同的成员提取到一个类中,这种做法是继承 多态: a:方法的重载:在一个类中,允许多个方法使用同意方法名,但方法的参数列表不同 b:父类指向子类对象,接口可以指向实现类对象。 好处是降低类的耦合性。例如: 采用接口作为方法的参数,可以传入该接口的实现类

    30. 什么是jdk jre jvm ?

    jdk 是java的开发工具包 jre是java的编译环境 jvm 是java的虚拟机

    32.Android 底层的操作系统是?

    Linux App开发是用的java

    33.int类型中如何保存10进制和16进制?

    8进制的值已0开头;16进制是以0x开头

    34. char类型如何保存一个汉字?

    可以存储,因为char类型存储的是unicode字符。

    35. boolean类型有哪些值?

    ture 和 false。java中不能使用0和1代替。

    36. Switch等值判断和if多重判断的区别?

    if除了等着判断还可以区间判断。

    37. break关键字的作用?

    在for循环中跳出循环;在switch中,可以作为case的条件结束。

    38. 如何引起java.lang.ArrayIndexOutBonudsEception异常?

    在使用数组和集合的时候,下标大于最大下标,或者下标为负下标的时候。

    39. 什么是IDE?

    IDE是集成开发的缩写,这类开发工具一般包含开发、测试、运行等功能

    40.访问修饰符有那些? 用途?

    image.png

    41.如何引起java.lang.NullPointerExceptoion?

    一个引用数据类型为null,调用这个对象的属性或者方法时,会引起异常。

    42. 构造方法什作用如何调用?

    构造方法是通过创建对象是调用。构造方法通过new关键字来调用。

    43. 继承有什么作用? 如何调用?

    在继承中,被继承的类是父类,集成的类是子类。继承主要用途是解决代码的复用性,当子类继承父类时,可以拥有父类的的属性和方法。

    44. 如何在子类调用父类的方法?

    使用super关键字,例如 super.method();

    45. 如何在子类调用父类的构造方法?

    通过super关键字来调用;例如 super( )

    46. 如何在一个类中调用构造方法?

    通过使用this关键字例如this(name)

    47. 什么是多态?

    多态在java中最主要的体现是父类指向子类对象,接口可以指向实现类对象。这样做的好处就是降低类的耦合性。例如 方法采用父类类型作为参数,那么可以传入父类的的子类对象;采用接口作为方法的参数,者可以传入方法的所有实现类。

    48. 静态方法如何调用?

    类名.方法;也可以使用对象调用

    49. 静态方法是否可以调用普通方法?

    静态方法不能调用普通方法,但是普通方法可以调用静态方法。

    50. 什么是静态代码块? 作用?

    static{}为静态代码块,静态代码块在第一次使用前执行而且执行一次


    51. 泛型集合有什么用途?

    限制集合类型,方便遍历。

    52. Throwable 有什么用途?

    53. 如何自定义异常?

    自定义异常就是继承Exception或者是它的子类

    53. 如何抛出一个异常?

    通过throw关键字抛出异常。在方法声明中可以通过throws关键字标注这个方法抛出那些异常。

    54. ArrayList的内部实现?

    本质是就是一个数组,ArrayList就是动态的为数组扩容,其add()、get()、remove()其实就是对数组的操作.

    55. 线程的实现?

    在java中实现线程有两种方式第一种让类继承Thread类并且重新run()方法。这种方式定义的通过子线程start()方法启动。
    第二种 实现Runnable接口,并且重写run方法,这种方式启动要借用Thread类中的start方法

    public class MyThreadDemo extends Thread {
        public MyThreadDemo(){}
        public MyThreadDemo(String name){
            super(name);
        }
    
        @Override
        public void run() {
            for (int i = 0; i <= 100; i++) {
                System.out.println(getName());
            }
        }
    }
    
    /**
     * 获取线程名称
     *public final String getName();
     */
    class Test{
        public static void main(String[] args) {
            MyThreadDemo myThreadDemo1 = new MyThreadDemo();
            myThreadDemo1.setName("tom");
    
            myThreadDemo1.run();
    
        }
    }
    
    

    public class MyRunnable implements Runnable {
    
        @Override
        public void run() {
            for (int x = 0; x < 100; x++) {
                // 由于实现接口的方式就不能直接使用Thread类的方法了,但是可以间接的使用
                System.out.println(Thread.currentThread().getName() + ":" + x);
            }
        }
    
    }
    
    /*
     * 方式2:实现Runnable接口
     * 步骤:
     *      A:自定义类MyRunnable实现Runnable接口
     *      B:重写run()方法
     *      C:创建MyRunnable类的对象
     *      D:创建Thread类的对象,并把C步骤的对象作为构造参数传递
     */
    class MyRunnableDemo {
        public static void main(String[] args) {
            // 创建MyRunnable类的对象
            MyRunnable my = new MyRunnable();
            Thread t1 = new Thread(my, "林青霞");
            Thread t2 = new Thread(my, "刘意");
    
            t1.start();
            t2.start();
        }
    }
    

    56.同步方式有几种

    两种: 同步代码块 同步方法

        synchronized(对象)  对象可以随意(使用上帝就行)
        {
            需要被同步的代码(哪些代码在操作共享数据)
        }
        
        public static synchronized Singleton getInstance(){
                ....
        }
    

    57. 启动一个线程是用run()还是start()?

    start() run()方法封装了被执行的代码,直接调用仅仅是普通方法的调用 start():启动线程并有jvm自动调用run()方法

    58. sleep() 和 wait()方法的区别?

    sleep()必须指定时间,不释放锁。wait() 可以指定时间和不指定时间,释放锁

    59. 为什么wait(),notify(),notifyAll()等方法都定义在Object类中

    因为这些方法的调用是依赖于锁对象的,而同步代码块的锁对象是任意锁。
    而Object代码任意的对象,所以,定义在这里面。

    60.线程的生命周期图

    新建-->就绪-->运行-->死亡; 新建-->就绪-->运行-->阻塞-->运行-->死亡

    61. 什么是值传递和引用传递?

    值传递是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量.
    引用传递一般是对于对象型变量而言的,传递的是该对象地址的一个副本, 并不是原对象本身 。
    一般认为,java内的传递都是值传递. java中实例对象的传递是引用传递 。

    62.死锁?

    两个或者两个以上的线程争抢资源的时候,发生的一种互相等待的现象

    63.说说:sleep、yield、join、wait方法的区别

    sleep()方法需要指定等待的时间,它可以让当前正在执行的线程在指定的时间内暂停执行,进入阻塞状态,该方法既可以让其他同优先级或者高优先级的线程得到执行的机会,也可以让低优先级的线程得到执行机会。但是sleep()方法不会释放“锁标志”,也就是说如果有synchronized同步块,其他线程仍然不能访问共享数据。

    作用于线程
    • Thread.sleep()方法用来暂停线程的执行,将CPU放给线程调度器。
    • Thread.sleep()方法是一个静态方法,它暂停的是当前执行的线程。
    • Java有两种sleep方法,一个只有一个毫秒参数,另一个有毫秒和纳秒两个参数。
    • 与wait方法不同,sleep方法不会释放锁
    • 如果其他的线程中断了一个休眠的线程,sleep方法会抛出Interrupted Exception。
    • 休眠的线程在唤醒之后不保证能获取到CPU,它会先进入就绪态,与其他线程竞争CPU。
    • 有一个易错的地方,当调用t.sleep()的时候,会暂停线程t。这是不对的,因为Thread.sleep是一个静态方法,它会使当前线程而不是线程t进入休眠状态。

    join(): 当前线程等待调用此方法的线程执行结束再继续执行。如:在main方法中调用t.join(),那main方法在此时进入阻塞状态,一直等t线程执行完,main方法再恢复到就绪状态,准备继续执行。
    join方法必须在线程start方法调用之后调用才有意义。这个也很容易理解:如果一个线程都没有start,那它也就无法同步了。作用于线程

    原理
    image.png

    yield(): 它仅仅释放线程所占有的CPU资源,从而让其他线程有机会运行,但是并不能保证某个特定的线程能够获得CPU资源。谁能获得CPU完全取决于调度器,在有些情况下调用yield方法的线程甚至会再次得到CPU资源。所以,依赖于yield方法是不可靠的,它只能尽力而为。作用于线程

    wait():

    • wait只能在同步(synchronize)环境中被调用,而sleep不需要。
    • 进入wait状态的线程能够被notify和notifyAll线程唤醒,但是进入sleeping状态的线程不能被notify方法唤醒。
    • wait通常有条件地执行,线程会一直处于wait状态,直到某个条件变为真。但是sleep仅仅让你的线程进入睡眠状态。
    • wait方法在进入wait状态的时候会释放对象的锁,但是sleep方法不会。
      wait方法是针对一个被同步代码块加锁的对象

    64,说说你对 Java 中反射的理解

    va 中 的 反 射 首 先 是 能 够 获 取 到 Java 中 要 反 射 类 的 字 节 码 , 获 取 字 节 码 有 三 种 方 法 ,
    1.Class.forName(className) 2.类名.class 3.this.getClass()。然后将字节码中的方法,变量,构造函数等映射成
    相应的 Method、 Filed、 Constructor 等类,这些类提供了丰富的方法可以被我们所使用。

    编程题

    1. 编写一个单例模式?

    public class Singleton {
       /* private Singleton() {
        }
    
        private static Singleton instance = new Singleton();
    
        public static Singleton GetInstance() {
            return instance;
    
        }*/
    
       private Singleton(){}
    
       private  static Singleton instance = null;
       private static synchronized Singleton getInstance(){
           if (instance == null){
               instance = new Singleton();
           }
           return instance;
    
       }
    }
    

    2. c盘 1.png 复制到D: 盘

     BufferedInputStream bis = new BufferedInputStream(new FileInputStream(""));
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(""));
            int len = -1;
            byte[] bytes = new byte[1024];
            while ((len = bis.read(bytes)) != -1) {
                bos.write(bytes, 0, len);
    
            }
            bos.flush();
            bos.close();
            bis.close();
    

    3. 将www.abc.com/xx.png 复制到D:盘,使用网络编程?

    4. 判断一个身份证号,是否符合要求? 长度 18 位

    5. 将字符串23,52,24,67,74转换数组使用冒泡排序?

    6. 第一人10岁,第二个人比第一个人大2两岁.以此类推.第八个人多少岁?

     public static void main(String[] args) throws IOException {
           age(8);
        }
    
        private static int age(int i) {
            if (i == 1){
                return 10;
            }
            return age(i -1)+2;
        }
    

    排序

    
    public class TestDemo {
        public static void main(String[] args) {
            String str = "13,43,21,53,36,76,98";
            String[] strArray = str.split(",");
            int[] digitArry = new int[strArray.length];
            for (int i = 0; i < strArray.length; i++){
                digitArry[i] = Integer.parseInt(strArray[i]);
            }
    
          //  dubboleSort(digitArry);
            selectSort(digitArry);
        }
    
        private static void selectSort(int[] digitArry) {
            for (int x = 1; x < digitArry.length; x++){
                for (int y = x; y < digitArry.length; y++){
                    if (digitArry[y] > digitArry[y -1]){
                        int temp = digitArry[y];
                        digitArry[y] = digitArry[y-1];
                        digitArry[y - 1] = temp;
                    }
                }
    
            }
            console(digitArry);
        }
    
        private static void dubboleSort(int[] digitArry) {
    
            for (int x = 0; x < digitArry.length -1; x ++){
                for (int y = 0; y < digitArry.length -1-x; y ++){
                    if (digitArry[y] > digitArry[y+1]){
                        int temp = digitArry[y];
                        digitArry[y] = digitArry[y+1];
                        digitArry[y+1] = temp;
                    }
                }
            }
    
            console(digitArry);
        }
    
        private static void console(int[] digitArry) {
            for (int digit : digitArry){
                System.out.println(digit);
            }
        }
    }
    
    

    相关文章

      网友评论

          本文标题:JavaSe

          本文链接:https://www.haomeiwen.com/subject/vdvhaftx.html