【CSDN软件工程师能力认证学习精选】 JavaSE基础总结(笔试面试题)

CSDN软件工程师能力认证是由CSDN制定并推出的一个能力认证标准,宗旨是让一流的技术人才凭真才实学进大厂拿高薪,同时为企业节约大量招聘与培养成本,使命是提升高校大学生的技术能力,为行业提供人才储备,为国家数字化战略贡献力量。

我们每天将都会精选CSDN站内技术文章供大家学习,帮助大家系统化学习IT技术。

JavaSE基础

 

1.对象实例化

    (1)Class.forName(“类的全名称”);

    (2)Person person = new Person();

2.类的重载:

           类名相同,形参列表不同(类型,顺载序,个数),system.out.println();也是方法重

3.不定长参数,本质是一个数组形式,int…a

  • 定义方法时不确定有几个入参时使用
  •  一个方法中只能有一个,位于形参末尾

4.方法中使用全局变量 this

  1. 全局变量(成员变量/成员属性):编写在类中
  2. 局部变量:声明在方法或者代码块中

5.形参列表中的变量是局部变量

6.构造方法的作用:

     使用构造方法创建对象并且可以为类中的属性赋值(实例化对象)

  • 构造方法在创建的时候就给对象初始化; 一个对象建立构造方法只能运行一次;
  • 一般方法是对象调用才执行,给对象添加对象具备的功能; 一般方法可以被对象多次调用;

注意:多态分类

运行时多态(重写时多态)

     父类引用接收子类的对象

编译时多态

    方法重载方法名相同形参列表不同

7.父类和子类中,静态代码块、代码块、构造方法、普通方法执行顺序

 父类中的静态变量和静态代码块

 子类中的静态变量和静态代码块

 父类中的普通变量和代码块->构造方法

 子类中的普通变量和代码块->构造方法

 变量和代码块的执行与声明顺序有关,变量一般声明在代码块前

8.修饰符修饰范围

           

9.子类只能继承父类非private的方法

10.instanceof

       instanceof是一个二元操作符,用法是:boolean result = a instanceof ClassA,即判断对象a是否是类Class A的实例,如果是的话,则返回true,否则返回false。向下转型,需要先向上转型,而且只能转化为本类对象

                         

11.抽象方法不可以被private修饰

12.抽象类和接口的比较

 

抽象类

接口

构造方法

可以有

不可以有

方法

可以有抽象方法和普通方法

只能有抽象方法,但1.8版本之后可以有默认方法

实现

子类用extend来实现

用implments实现

修饰符

public、default、protected

默认public

变量

可以有常量也可以有变量

只能是静态常量默认有public static final修饰

main方法

可以有

不可以有

多继承

单继承

实现多个接口

静态方法

可以有

不可以

速度

比较快

比较慢

13.匿名内部类常用于实现接口或抽象类

14.基本类型的包装类

        int – Interger        char – character

       在-128~127之间的Integer值,用的是原生数据类型int,会在内存里供重用,也就是说这之间的Integer值进行==比较时只是进行int原生数 据类型的数值比较,而超出-128~127的范围,进行==比较时是进行地址及数值比较。

                         

15.Integer.parseInt()和  Integer.valueOf()

     Integer.parseInt()返回值为基本数据类型

     Integer.valueOf()返回值为包装类型

16.Object类中的方法:

    equals(),finalize(),clone(),getClass()(返回运行时的类,有且仅有一份,可用  对象.getClass()  或者  forName.getClass(),)wait(),notify(),notifyAll(),hashCode(),toString().

17.String,StringBuffer,StringBulider的区别

       String只读字符串,意味着其引用的字符串内容不能发生改变

       StringBuffer/StringBuilder 表示的字符串对象可以直接进行修改。

       StringBuilder 是 Jdk1.5 中引入的,它和 StringBuffer 的方法完全相同,区别在于它是在单线程环境下使用的,

    因为它的所有方法都没有被 synchronized 修饰,因此它的效率理论上也比StringBuffer 要高。

18.BigDemail用于精确计算

           img class=”aligncenter” src=”https://img-blog.csdnimg.cn/20181102133319778.png” />/p>

19.集合只能存放抽象数据类型

20.两个对象相等,hashCode一定相同,但hashCode相同不一定是同一个对象

21.equals 方法被覆盖之后,hashCode也一定会被覆盖

22.ArrayList,Vector 使用数组实现,LinkedList使用的是双向链表

23.ArrayList常用方法:

 set(),get(),size(); HashMap常用方法:put():添加对象:get():获得对象的值;

 size():查看集合中的数据有多少个 

迭代方式

  1. for循环
  2. foreach
  3. 迭代器(collection接口下的集合都可使用)

                   

4.jdk1.8中出现了stream流

                img class=”aligncenter” src=”https://img-blog.csdnimg.cn/img_convert/9d19947544f38472a6ad4e255809cbeb.png”>/p>

   Map迭代  (1)将Map转化为Set集合,使用keySet

                  Set<String> keySet = mapkeySet();

                       (2)1.8新特性

                          map.forEach((k,v)->{

                                 system.out.println(k+”=”+v);

                             });

24.解决ArrayList 线程不安全问题

    (1)转化为线程安全的类

             ArrayList = Collection.synchronizedList(arrayList);

       (2)并发环境下可以使用CopyOnWriterList

25.解决HashMap线程不安全问题

   (1)转化为线程安全类

         map = Collection.synchronizedMap(map);

       (2)并发环境下可以使用CurrentHashMap

26.堆和栈

   堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。

   {堆是指程序运行是申请的动态内存,而栈只是指一种使用堆的方法(即先进后出)。}栈是先进后出的,但是于堆而言却没有这个特性,两者都是存放临时数据的地方。

    队列:先进先出,栈:先进后出  

25.集合源码分析

  (1)ArrayList  

       List接口可变数组非同步实现,每次扩容扩为原来的1.5倍,线程不安全

  (2)Vector

       API与ArrayList相同,基于数组实现,可扩容,有synchronize修饰,线程安全 

  (3)LinkedList

       底层是双向链表,非同步,同时实现List和Deque,可以当队列使用,线程不安全

  (4)ArrayDeque

       使用数组实现的双端队列

  (5)HashSet

       底层使用哈希表实现(数组+链表),实际是由一个HashMap的实例支持的,允许使用NULL值

          使用该方法时,需要重写equals和hashCode方法。

  (6)LinkedHashSet

       哈希表+双向链表实现

  (7)HashMap

       底层使用哈希表(散列链表/数组+链表)实现,数组中每一项是个单向链表,即数组和链表的结合体,可以存储NUll值,1.8之后采用

          散列列表+红黑树的方式,线程不安全

  (8)HashTable

       底层使用数组实现,数组中每一项是个单链表,即数组和链表的结合体,key和value不能为NUll

26.ArrayList和LinkedList区别

  ArrayList底层是用数组实现的顺序表,是随机存取类型,可自动扩增,并且在初始化时,数组的长度是0,只有在增加元素时,长度才会增加,默认是10,不能无限扩增,有上限,在查询操作的时候性能更好

  LinkedList底层是用链表来实现的,是一个双向链表,注意这里不是双向循环链表,顺序存取类型。在源码中,似乎没有元素个数的限制。应该能无限增加下去,直到内存满了在进行删除,增加操作时性能更好。      

27.Deque 中的LinkedList 和 ArrayDeque的区别

        LinkedListDeque使用的是链表实现的双端队列

        ArrayDeque 使用的是数组实现双端队列

28.catch 可以出现多次,首先捕获小异常,然后捕获大异常

29.final 、finally 、finalize

   final 用于声明变量,方法,类,表示变量不可改变(引用不能改变,只可以改变),方法不能重写,类不可以被继承

   finally 用于异常处理中,表示,必须要执行的代码块,除非java虚拟机停止工作,否则一定会执行

   finalize() 是Object类中的一个方法,用于java虚拟机的垃圾回收

30.IO体系中存在的设计模式:

  装饰模式 – 用于动态的给对象添加一些功能,类似于继承,但是比继承更加灵活

31.IO

  BIO 传统IO,阻塞并同步    NIO,同步非阻塞   AIO 非同步非阻塞

32.windows 系统中使用””表示的路径分隔符,但是 java 中””””转义字符

来源:wait()方法的区别 

   sleep() 属于Thread类,wait() 属于Object类

   sleep()执行后不会释放对象锁,wait()会释放对象锁,重新进入就绪状态需要notify()或者notifyAll方法

45.线程控制:加塞join()(插队)

             睡眠sleep()没有放弃CPU的执行权

                      让步yield()放弃CPU的执行权

46.线程安全

   指的是多线程访问同一个方法、对象或代码时不会产生不确定的结果  

  引起线程安全的原因:存在多条线程共同操作的共享数据

47.synchronized 锁对象的时候,可以使用任意的对象

48.volatile关键字

      使用该关键字修饰变量  表示变量是多线程可见的。每一个线程在运行的时候自己的线程内存,线程内存中存放的是主内存的数据的拷贝。如果使用volatile关键字修饰变量,线程在使用变量的时候不是从线程内存中获取,而是从主内存中获得数据。

49.synchronized关键字

   当synchronized修饰静态方法时,修饰的是当前类的class对象锁

   当synchronized修饰实例方法时,修饰的时对象中的实例方法

50.并发和并行

   并发:一个处理器同时处理多个任务

   并行:多个处理器处理不同的任务

51.原子性问题解决方案

  (1)使用同步代码块或同步方法  

  (2)使用原子性操作的类 java.util.concurrent.atomic  底层使用CAS实现 (CompareAndSwap)

52.Lock锁

   实现类为ReentrantLock   Lock lock = new ReentrantLock();

                                               lock.lock();

53.Lock锁和synchronized的区别

   Lock产生异常时不会自动释放锁  所以要在finally中释放锁(lock.unlock();)

   synchronized修饰的锁产生异常时会自动释放

54.条件锁 Condition  需要结合Lock锁

54.线程池中的线程是由线程创建的,程序员只需要创建线程池就可以

55.线程池创建的四种方式

56.线程池的任务:Callable或者Runnable任务

57.四种线程池的底层:ThreaPoolExecutor

58.同步容器:synchronize修饰,产生性能影响

59.并发容器:jdk1.5提出,改善同步容器性能,专门为并发环境设计

   (1)HashMap(线程不安全)、HashTable(线程安全)  可以用  ConcurrentHashMap代替

   (2)ArrayList、vector 可以使用 CopyOnWriteArrayList

   (3)set 可以使用CopyOnWriteArraySet

   (4)Queue 可以使用 ConcurrentLinkedQueue(高性能队列) 或linedBlokingQueue(阻塞队列)

              https://www.jianshu.com/p/ff872995db56

60.HashMap、HashTable、ConcurrentHashMap的区别

       1.HashMap线程不安全,HashTable和ConcurrentHashMap线程安全,所以HashMap运行效率高

       2.HashMap的Key和Value可以是null值,HashTable和ConcurrentHashMap不行

       3.HashTable和ConcurrentHashMap之间的主要差别在于性能方法。ConcurrentHashMap采用””分段锁””,性能比HashTable要好

61.Java中的Callable和Runnable有什么区别

    两者都用来代表线程中的任务,Runnable从1.0版本就有,Callable出现在1.5版本当中,主要区别是,Callable的call()方法可以有返回值和异常,Runnable的run()方法不行,Callable可以返回带有计算结果的Future对象

62.Volatile

  volatile是一个特殊修饰符,可以保证下一个读取操作是在上一个写操作之后。

63.如何在两个线程间共享数据/h3>

 1.如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,卖票系统就可以这么做。

 2.如果每个线程执行的代码不同,这时候需要用不同的Runnable对象,

 例如,设计4个线程。其中两个线程每次对j增加1,另外两个线程对j每次减1,银行存取款

64.为什么wait

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年1月19日
下一篇 2021年1月19日

相关推荐