java概述
首先是一些关于java的基本概念
1. java有哪些版本?
java分ee,se,me,分别是标准版,基于标准版做出来给企业用的企业版,以及用于移动设备和嵌入式的微型版
2. jvm
java虚拟机,就是所谓java的运行环境,用这个实现了java的跨平台性
3. jre
java运行时使用的核心类库和环境,
4. jdk
java开发时使用的的开发包,包括jre,javac,jar等,大概是这么一个包含关系

讯享网
5. 字节码
.class文件jvm编译后产生的文件,供java虚拟机使用解释器变为机器执行的机器码,也就是说有jvm和字节码就可以在任何机器上运行java程序
6. java程序的主类
有main方法的类,小程序一般必须是public,应用程序可以不是,所谓小程序就是内嵌在浏览器的那种,应用程序就是线程启动
7. 与c++区别
都支持封装,继承、多态,但java不提供指针,更加安全,java类不能像c++多继承,但接口可以,同时java有自动内存管理机制
8. oraclejdk和openjdk区别
发布时间分别是三年,三个月,因为oracle是openjdk改的,更加稳定,但需要手动更新
9. for与wile循环使用?
不明确次数,用while
基础语法
9. java的数据类型
主要分基本类型和引用类型,基本类型有整型(byte,短整,整,长整),字符型(char),浮点型(float,double),布尔型,引用类型:类,数组,接口,string
10. 数组定义
数组定义时要指定长度,否则要初始化元素
11. switchcase中switch可以用的类型
12. 2x8简单方法
2<<3,按位左移三位,其实就是2进制,左移三位就是2的三次方
13. math.round(x)的规则
在x加0.5,然后向下取整
14. float f=3.4对不对?
不对,3/4属于双精度,给浮点赋值会损失精度,需要转型 float f=(float)3.4,或者 float f=3.4F
15. short s1 = 1; s1 = s1 + 1可以吗?
short s1=1是不可以的,因为1是int型,需要强转,而s1+=1,是可以的,因为隐含了转型
16. java使用的编码标准?
Unicode(标准码)
17. java注释类型
单行//,多行//, 文档 / */
18. java修饰符相关
从private,default,protected,public,四个范围(同类,同包,子类,其他包)逐渐开放访问权限

19. &和&&的区别
一个&是按位与,两个是逻辑与,也称为短路与,因为如果左边是false,右边都不会进行运算
20. java中goto
是保留字,目前没使用
21. final修饰规则
修饰类不能被继承,修饰接口不能被重写,修饰变量,地址不可改,但引用内容可变,此外还有finally,finallize,finally是捕获异常时,一定会执行的的方法,finalize则是系统gc时会调的一个方法
22. this关键字
通常this.a就是指向a的一个指针,this.a=a一般就是为了区分形参和对象,不能用在static方法中,在构造方法中调用本类其他构造方法,必须在第一句中(super也是第一句)
23. super关键字
通常用来引用父类里的东西,也用作区分父类与子类方法
24. static静态代码块
其中代码只在类加载的时候执行一次,所以可以初始化操作放进去,用来优化性能
25. static变量
类加载时就自动初始化,不创建实例对象也可使用,static只是初始化早,后续可以修改赋值,如果需要所有对象共享就要定义为staic,静只能访问静,非静都可以
26. break,countinue的区别
面向对象
27. 面向对象和面向过程
28. 面向对象特性:
抽象,封装,继承,多态
29. 面向对象五大原则;
单一职责,开放封闭,里氏替换,依赖倒置,接口分离
30. 抽象类与普通类区别?
31.抽象类和接口的对比
相同点:
接口和抽象类都不能实例化
都位于继承的顶端,用于被其他实现或继承
都包含抽象方法,其子类都必须覆写这些抽象方法
不同点:
抽象类使用abstract关键字声明 接口使用interface关键字声明
抽象类子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现
接口子类使用implements关键字来实现接口。它需要提供接口中所有声明的方法的实现
抽象类可以有构造器 接口不能有构造器
抽象类中的方法可以是任意访问修饰符 ,接口方法默认修饰符是public。并且不允许定义为 private 或者protected
一个类最多只能继承一个抽象类 一个类可以实现多个接口
抽象类的字段声明可以是任意的 接口的字段默认都是 static 和 final的
32. 抽象类可以继承普通类吗?
可以,比如其一些抽象类继承于object,说明可以继承抽象类
33. 成员变量和局部变量
区别在于是否在方法内,作用域同理,不同点在于分别存在堆和栈里,默认值分别是有和无,
34. 无参构造的作用
子类初始化前如果没有super来调父类方法,子类构造方法默认就会调用父类无参构造,没有就会编译错误
35. 构造方法
与类名相同,不能用void声明,不能使用static,final,abstract修饰符自动调用,作用是创建对象时,完成数据初始化工作
36. 内部类的分类有哪些?
成员,局部,静态,匿名;
(1)成员内部类:成员内部类无限制访问外部类内容,编译时与外部类各自生成一个字节码文件(this.的时候注意各自调用);外部类通过内部类实例访问内部类的成员属性和方法,成员内部类中不能存在staic变量和方法:
(2)局部内部类:只有在方法体内才能使用,方法参数必须为final
(3)静态内部类:不能使用外部类非staic的变量和方法,静态内部类可以定义静态成员,构建对象比前两个灵活
(4)匿名内部类 :必须继承一个父类/实现接口,内部没有构造方法
37. 构造器能否被重写?
不能被继承,可以重载,不能重写
38. 重载(Overload)和重写(Override)的区别
重载根据参数列表进行区分,重写根据父子类进行区别(同名,同参,同返回值,访问权限不能降低)

39. == 和 equals
==在基本数据类型是比值,引用数据类型时比的是内存地址,equals比的是内存地址,除非被重写(String中就被重写了,所以比的是值)
40. hashCode 与 equals ,为什么重写equals时必须重写hashCode?
hashcode在object内,所有类几乎都能涉及到,其原理就是存在不同的hash链上,如果不重写,那你使用hashmap一类的方法时,两个对象一查都不再一个hash链上,就算equals一样也白费
41. equals()和hashcode()
两个方法要保持相当程度的一致性,equals()方法相等,hashcode()必须相等;反之,equals方法不相等,hashcode可以相等,可以不相等。但是两者的一致有利于提高哈希表的性能
42. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递
是值传递,参数其实是对象的引用,属性可以被改变,但引用无法改变
43. 为什么 Java 中只有值传递?
方法得到的是所有参数值的一个拷贝,不能修改传递给它的任何参数变量的内容
44. 值传递和引用传递有什么区别?
值传递:方法调用时,传递的参数是按值的拷贝传递; 引用传递:指传递的是值的引用,也就是说传递前和传递后都指向同一个引用(也就是同一个内存空间) ,但注意string传值和基本数据类型一样,都是值传递(不开辟堆内存)
45. JDK 中常用的包有哪些?
ang,io,sql,util,nio,net
46. IO 流分为几种
输入输出流,字节字符流,节点处理流
47. BIO,NIO,AIO bio blockio
是传统的流,1000以内线程,NIO同步非阻塞io,多路复用,AIO,异步非堵塞 IO
48. Files的常用方法
exists,createfile,delete,move,copy,createDirectoty
49. 什么是反射机制
运行时,任意一个类或对象都能调用这个类的方法,提高代码灵活度,但丧失性能
50. 反射使用
1.对象…getClass()
2.class.forName(类名)
3、类名.class
51. String 是最基本的数据类型?
不是,长短普通整型,byte,布尔,单双精度浮点,char,这是八大,String底层还是char数组
52. String特性
不变性,不可修改,操作时其实都是一个副本,指向不变,而且用过就会放进一个缓存池,下次从里面取,同时它是final的,不可被继承,当然如果赋值或者拼接后,其实也没变,就是新开辟一个内存空间并指向它而已;例外有利用反射修改String底层的value属性
53. 字符串常用方法

54. 如何将字符串反转?
利用StringBuilder或者StringBuffer的reverse方法
55. String,StringBuffer,StringBuilder的区别?重写equals了吗

string后面两个没有重写equals方法,所以它们是比较内存地址,那么比较时需要转换为string,因为string重写了equals和hashcode,比较的是值
56. 数组有没有 length()方法?String 有没有 length()方法?
数组没有(数组的length是属性),String有,js里字符串有length属性
57. 使用 HashMap 的时候,用 String 做 key 有什么好处?
String不可变,作为key不用再次计算,提高速度
58. 自动装箱与拆箱
装箱就是用基本类型对应引用类型包装,拆箱反之
59.基本数据类型包装形式
除了Integer和Character,别的引用类型都是首字母大写
60. Integer a= 127 与 Integer b = 127相等吗?
相同,从0到127不同时候自动装箱得到的是同一个对象;数再-128到127之间,就直接在缓存里取。否则就返回一个新对象
61. HaspMap扩容是怎样扩容的,为什么都是2的N次幂的大小
HashMap扩容:两倍扩容,底层为数组,当数组满了之后,会自动扩容。
扩容时是扩大数组长度,对原数组进行rehash操作,把原数组copy到新数组中
因为Hashmap计算存储位置时,使用了(n - 1) & hash。只有当容量n为2的幂次方,n-1的二进制会全为1,位运算时可以充分散列,避免不必要的哈希冲突,所以扩容必须2倍就是为了维持容量始终为2的幂次方。
62. .HashMap,HashTable,ConcurrentHashMap的区别?
线程安全不同
HashMap是非线程安全的,只是用于单线程环境下;
ConcurrentHashMap是线程安全的,多线程环境下可用;
Hashtable是线程安全的,能用于多线程环境中;
继承的父类不同
HashMap继承自AbstractMap类。但二者都实现了Map接口。
Hashtable继承自Dictionary类,Dictionary类是一个已经被废弃的类(见其源码中的注释)。父类都被废弃,自然而然也没人用它的子类Hashtable了。
包含的contains方法不同
HashMap是没有contains方法的,而包括containsValue和containsKey方法;
hashtable则保留了contains方法,效果同containsValue,还包括containsValue和containsKey方法。
是否允许null值
Hashmap是允许key和value为null值的,用containsValue和containsKey方法判断是否包含对应键值对;
HashTable键值对都不能为空,否则包空指针异常。
计算hash值方式不同
HashMap有个hash方法重新计算了key的hash值,因为hash冲突变高,所以通过一种方法重算hash值的方法:这里计算hash值,先调用hashCode方法计算出来一个hash值,再将hash与右移16位后相异或,从而得到新的hash值。
Hashtable通过计算key的hashCode()来得到hash值就为最终hash值。
解决hash冲突方式不同
HashMap中,当出现冲突时 链表+红黑树
HashTable中, 都是以链表方式存储。
63. 极高并发下HashTable和ConcurrentHashMap哪个性能更好,为什么,如何实现的。
①Hashtable是通过对hash表整体进行锁定,是阻塞式的,当一个线程占有这个锁时,其他线程必须阻塞等待其释放锁
而ConcurrentHashMap是如下实现:
jdk1.6的实现:ConcurrentHashMap是采用Segment分段锁的方式,它并没有对整个数据结构进行锁定,而是局部锁定,
jdk1.8的实现: 采用一种乐观锁CAS算法来实现同步问题,但其底层还是“数组+链表->红黑树”的实现
64. HashMap在高并发下如果没有处理线程安全会有怎样的安全隐患,具体表现是什么
65. Object类中的方法。
clone方法
getClass方法
toString方法
finalize方法
equals方法
hashCode方法
wait方法
notify方法
notifyAll方法
66. 动态代理的两种方式,以及区别。
JDK动态代理:利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。
CGlib动态代理:利用ASM(开源的Java字节码编辑库,操作字节码)开源包,将代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。
区别:JDK代理只能对实现接口的类生成代理;CGlib是针对类实现代理,对指定的类生成一个子类,并覆盖其中的方法,这种通过继承类的实现方式,不能代理final修饰的类。
67. Java序列化的方式。
68. 一个ArrayList在循环过程中删除,会不会出问题,为什么?
会,删除时,会删除不干净,这是因为ArrayList是个动态数组,移动位置导致删除错位 Iterator循环正序删除时,会报错,因为remove方法中 modCount 和expectedModCount不一样,就会报错
讯享网
69. .@transactional注解在什么情况下会失效,为什么
70. Java设计过程中,你都了解哪些设计模式;
创建型模式:共5种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式
结构型模式:共7种:适配器模式、装饰器模式、代理模式、桥接模式、外观模式、组合模式、享元模式
行为型模式:共11种:策略模式、模板方法模式、观察者模式、责任链模式、访问者模式、中介者模式、迭代器模式、命令模式、状态模式、备忘录模式、解释器模式
72. 你如何实现一个单例模式?单例实现的必要性?
懒汉式,线程安全
讯享网public class Singleton2 {
private static Singleton2 instance; private Singleton2() {
} public static synchronized Singleton2 getInstance() {
if (instance == null) {
instance = new Singleton2(); } return instance; } }
饿汉式,线程安全
public class Singleton3 {
private static Singleton3 instance = new Singleton3(); private Singleton3() {
} public static Singleton3 getInstance() {
return instance; } }
讯享网使用单例设计模式可以节省内存空间,提高性能。因为很多情况下,有些类是不需要重复产生对象的。
如果重复产生对象的话,会导致大量的内存空间被占用,性能降低。
73. HahsMap和Linkedlist有什么区别
74. string类型的截取
使用substring截取,对于头尾有空格的需要使用trim,分开字符串可用split,使用这些库函数好处是速度快,代码量少,还有其他需求,可以自己写截取工具
75. list和map的存储过程
ArrayList
ArrayList底层是数组,默认长度为0;当添加第一个元素时,长度变为10,扩容机制是当数组存满时,还要继续添加元素,就会创建一个新的数组,容量是之前数组的1.5倍,并把之前元素复制进新数组。
HashMap
HashMap1.7之前底层是数组+链表,1.8之后是数组+链表+红黑树,底层重写了hashcode和equals方法,先计算hash值,hash值会根据hash函数计算出索引值,存入指定位置,如果位置上没有,存入,如果有比较equals,如果相同,新值替换旧值,如果不同,就挂下面,链表长度大于等于8,转为红黑树,小于等于6,转成链表。扩容机制,默认是16,加载因子0.75,每次长度乘2。
76. ArrayList和LinkedList哪个是线程安全的
两个都不是线程安全的,但是有Collections.synchronizedList与CopyOnWriteArrayList,一般用来做并发时代替数组和链表
75. list set map区别
List:一个有序(元素存入集合的顺序和取出的顺序一致)容器,元素可以重复,可以插入多个
null元素,元素都有索引。常用的实现类有 ArrayList、LinkedList 和 Vector。
Set:一个无序(存入和取出顺序有可能不一致)容器,不可以存储重复元素,只允许存入一个null
元素,必须保证元素唯一性。Set 接口常用实现类是 HashSet、LinkedHashSet 以及 TreeSet。
Map是一个键值对集合,存储键、值和之间的映射。 Key无序,唯一;value 不要求有序,允许重复。
Map没有继承于Collection接口,从Map集合中检索元素时,只要给出键对象,就会返回对应的值对
象。常用实现类:HashMap、TreeMap、HashTable、LinkedHashMap、ConcurrentHashMap
76. Java当中有两个处理异常的关键字及其区别?
throw 在方法体内使用,throws 在方法声明上使用; throw 后面接的是异常对象,只能接一个。throws 后面接的是异常类型,可以接多个,多个异常类型用逗号隔开; throw 是在方法中出现不正确情况时,手动来抛出异常,结束方法的,执行了 throw 语句一定会出现异常。而 throws 是用来声明当前方法有可能会出现某种异常的,如果出现了相应的异常,将由调用者来处理,声明了异常不一定会出现异常
77.list的安全遍历删除
ArrayList是动态数组,遍历删除时可能会错位,modcount和expectmodcount不同造成错误
主要有以下3种方法遍历:
使用Iterator的remove()方法(每次删除一个元素,都会将modCount的值重新赋值给expectedModCount,这样2个变量就相等了,不会触发java.util.ConcurrentModificationException异常。)
使用for循环正序遍历(删除元素后,要修正下下标的值)
使用for循环倒序遍历(和使用for循环正序遍历类似,不过不用再修正下标)
78.java集合中哪些是有序的,无序的?
集合的有序、无序是指插入元素时,保持插入的顺序性,也就是先插入的元素优先放入集合的前面部分。
而排序是指插入元素后,集合中的元素是否自动排序。(例如升序排序)
有序集合:集合里的元素可以根据key或index访问
.无序集合:集合里的元素只能遍历。
有序集合在属性的增加,删除及修改中拥有较好的性能表现。
Set集合一般是无序的。实现hash算法的集合一般是无序的,例如hashMap,hashTable
List集合一般是有序的。
底层是Tree的一般是有序的,例如TreeSet,TreeMap
底层有lined的一般是有序的,它会用链表维护元素的顺序。
综上:
有序的:List的所有子类
无序的:一般的Set,除了TreeSet,linkedHashSet等底层是树或者链表的。一般的Map,除了底层是树或者链表的。
已知的线程安全集合:
vector,hashtable,statck,enumeration

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/37592.html