JavaSE整理面试题 不定时更新

1.Java中有几种基本数据类型?8种

https://blog.csdn.net/Sindyue/article/details/88036054

2.面向对象。

思想 https://blog.csdn.net/zzy0919sun/article/details/81171006
特征 https://blog.csdn.net/ruglcc/article/details/7604047
多态 https://blog.csdn.net/zhouym_/article/details/89421577
封装 https://blog.csdn.net/qq_37872792/article/details/83448479
相对于面向过程实现功能时,想实现功能的一步一步的过程。面向对象先思考需要那些对象。
这些对象的关系关联,继承,聚合,实现,多态。而分析这些关系就有了4大特性:封装,抽象,多态,继承。
封装:一个类有动态属性-方法,和静态属性-字段。将字段私有化,提供公共方法设置
和访问字段。即将对象封装成一个高度自治和相对封闭的个体。
抽象:抽象是从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质的特征。如统计成绩,之抽象学生的班级,学号,姓名,分数属性。而无视其他如体重,年龄…属性。所以在抽象时,抽象的角度取决于分析问题的目的。
多态:同一个方法在不同的对象中体现出来不同的状态。如什么意思?小意思,意思意思。
这个意思在不同语境下的不同表现。在开发中的面向接口编程就是多态化的表现。
继承:继承一个对象的所有属性,并在此基础上添加属性。

3.包装类型

https://blog.csdn.net/qq_34820803/article/details/87938182
基础类型不具备面向对象的特征,所以有了一一对应的引用对象-包装类型。
包装类型和基础类型的转化是在编译时自动装箱Integer .valueOf和拆箱intValue()。
包装类型是引用对象,需要new在堆中,初始值为null。它们的存放地址也不相同,基础类型存在栈中是值传递,而包装类型存在堆中是引用传递。

4.“==”和equals

比较基础类型时比较的时值,比较引用类型时比较的是引用地址。
equals其实和==相同,但它是顶级父类的方法,常用的引用类型重写了equals方法,就变为比较引用类型里的值。

5. String和StringBuilder StringBuffer的区别?

string是一个不可变的char数组,又叫字符串常量。任何改变都是创建了一个新的字符常量。需要操作大量的字符串时损耗内存性能所以我们用StringBuilder StringBuffer 字符串变量。
StringBuffer:线程安全 StringBuilder:线程不安全
执行速度:StringBuilder > StringBuffer > String
用途:
如果要操作少量的数据用String
单线程操作字符串缓冲区下操作大量数据用StringBuilder
多线程操作字符串缓冲区下操作大量数据用StringBuffer

6.java中的集合。

Java的集合存2种值,value和key-value。对应Collection和Map 2大接口。
Collection:接口包含了list和set,的实现类都同时实现类Iterator接口,可以使用迭代器遍历。
List:通常是一个列表(数组、有序/队列、链表、栈等),元素可重复。一般用ArrayList和LinkedList,另外还有不常用的Vector。另外,LinkedList还是实现了Queue接口,因此也可以作为队列使用。
Set:通常表示一个不可重复有序的集合,通过hashcode和equals可去重。常用实现类有HashSet和TreeSet,HashSet是通过Map中的HashMap实现的,而TreeSet是通过Map中的TreeMap实现的。
TreeSet还实现了SortedSet接口,因此是有序的集合(集合中的元素要实现Comparable接口,并覆写Compartor自定义比较函数来排序才行)。

Map:同样抽象类AbstractMap通过适配器模式实现了Map接口中的大部分函数,主要有hashmap,hashtable,treemap。
HashMap可以存空值null但线程不安全,hashtable线程安全但效率低。一般用CurrentHashMap来实现线程安全,通过把整个Map分为N个Segment(类似HashTable),可以提供相同的线程安全,但是效率提升N倍,默认提升16倍。
而TreeMap与HashMap的区别与Treeset和Hashset的区别相同,tree是以key排序,hash是以存的先后排序。

7.ArrayList和LinkedList。

https://blog.csdn.net/eson_15/article/details/51145788
ArrayList、LinkedList、Vector和Stack是List的四个实现类,后面2个因为效率低几乎不用。
ArrayList、LinkedList的主要区别是数据结构的区别,ArrayList基于动态数组,LinkedList基于双向链表。
外在表现是访问速度和插入修改的速度的区别。
ArrayList创建对象时,若未指定集合大小初始化大小为0;若已指定大小,集合大小为指定的大小;
当第一次调用add方法时,集合长度变为10和addAll内容之间的较大值;
之后再调用add方法,先将集合扩大1.5倍,如果仍然不够,新长度为传入集合大小;
如果没触发扩容和复制数组添加效率并不低,但触发扩容和复制数组就会损耗较大的性能。
LinkedList对于查询有优化根据查询的元素> 因为链表不要求内存是连续的,在当前元素中存放下一个或上一个元素的地址。查询时需要从头部开始,一个一个的找。所以查询效率低。插入时不需要移动内存,只需改变引用指向即可。所以插入或者删除的效率高。
所以ArrayList使用在查询比较多,但是插入和删除比较少的情况,而LinkedList使用在查询比较少而插入和删除比较多的情况。

8.HashMap

HashMap的初始化创建容器大小为16,负载因子是0.75。当存值的数量超过负载因子时,就会扩容1.5倍。一般用迭代器遍历,这样可以边遍历边修改,删除等操作。
HashMap的hash碰撞:两个key通过hashcode计算的hash值相同时,put就会产生hash碰撞,这时候会以链表存储key-value,如果超过8次会转为红黑树,如果key-value删除到8个又会转回链表。红黑树是jdk1.8引入的。

8.数据结构

分为逻辑结构和物理结构,分别面向问题和面向计算机。
逻辑结构:
1)集合:元素之间除了同属一个集合没有任何联系。
2)线性:元素之间有一一对应的互补关系。
3)树状:一对多的关系。
4)图形:多对多的关系
物理结构:
1.顺序存储:内存中的一段连续的存储单元依次存入线性表的元素,随机查询较快,插入删除需要移动元素。
2.链接存储:不用连续的存储单位,除结尾外其他元素有下一个元素的指针。空间占用更少,插入灵活,查询较慢。
3.数据索引:多了一个索引表来标识结点的地址,占用空间多但检索快。
4.散列存储:又叫hash存储,用函数计算出数据的关键字的hash值作为存储地址,这些hash存在散列表,计算函数叫hash函数。

9.算法

做web开发一般不接触算法,最多的是用递归给前台计算级联数据。
集合的Sort()排序方法,这是一个优化了的快速排序方法,加入了插入排序和堆排序,系统会根据情况自动选择。
还有,冒泡排序,二分查找,hash查找。

你可能感兴趣的:(面试题,java)