JavaSe

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 map = new HashMap();
        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 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)