JAVA基础知识储备

2018/06/11 11:18
阅读数 8

每天进行重复的工作,在熟悉现有的技能同时,也会减弱你对基础的一些东西的印象,没事常回来看看,毕竟

                                                                                                                                                                                                                                                                                                                                       -----千里之行,始于足下

1.面向对象的特征主要有哪些方面。
面向对象的特征主要有以下几个方面
-抽象 抽象就是将某一类对象的共同特征总结出来构造类的过程,包括行为抽象和属性抽象两个方面,抽象只关注对象有哪些属性和行为,并不关注其具体的细节是什么。
-封装 封装就是将数据和操作数据的方法绑定起来,想要对数据的访问就只能通过已定义的接口。方法的封装提升代码的复用性,对属性的封装则提升代码的安全性,总的来说,封装的核心概念就是隐藏一切可以隐藏的东西,只提供最简单的编程接口。
-继承 继承是从已有类中获得信息创建新类的过程,提供继承信息的类称之为父类(超类,基类),得到继承信息的类称之为子类,继承也提升了代码的复用性,同时也是能作为对原来类的一种扩展。
-多态 多态就是相同类型的不同对象在面对同一个事情的时候做出不同的反应,分为编译时多态和运行时多态,编译时多态指的是在用父类类型指向子类类型对象,运行时多态指的是如果父类创建的多态对象调用被子类重写的方法的时候体现的是子类的方法。

2.访问修饰符
public 对所有对象可见
protect 对其他包对象不可见
default 对其他包对象和子类对象不可见
private 只对自己类可见

3.String是基本数据类型吗?
不是的!基本数据类型有且只有8种,boolean(Boolean) char(Character)二 byte(Byte)一 short(Short)二 int(Integer)四 long(Long)八 float(Float)四 double(Double)八,而String是一个特殊的引用类型,除了基本数据类型其他的都是引用数据类型。

4.float f= 3.4;对吗?
不对!小数类型默认的是double类型,double类型是八字节的单位,转换到四字节的float需要强转。或者写成float f = 3.4f;

5.short s1=1;s1=1+s1对吗 short s1= 1;s1+=1对吗
第一个是不对的,s1是一个short类型对象,和int类型对象做加法运算的时候会自然的变成int类型的变量,所以结果是int类型的,而short类型的s1是无法接受的。第二个是对的,因为在做+=运算的时候系统会自己帮你帮值转换成short类型,相当于s1=(short)(s1+1),因此计算的结果还是short类型。

6.java有没有goto
goto在java中是一个保留字,目前虽然还没有被使用,但是在标识符命名等时候要不能使用goto。

7.int和Integer是什么关系
java是一个近乎完全的面向对象语言,但是为了编程方便还是引入了八大基本数据类型,为了能将这八种数据类型类当成对象类操作,java还提供了八种包装类型。在jdk1.5之后是支持基本数据类型和对应的包装器类型之间自动装箱和拆箱的。
Integer也有个常量池,假设创建的integer对象在-128到127之间就会和String的创建一样,先去常量池中寻找,如果有就直接指向常量池。

8.&和&&的区别
&可以做按位与运算,也可以做逻辑与运算。而&&被称之为短路&运算,假设在&&前面的表达式判断为false的话,&&后面的表达式将不在会被执行。

9.解释内存中栈,堆,方法区的用法。
通常我们定义一个基本数据类型的变量,一个数据的引用,还有函数调用的现场保存调用的都是jvm里面的栈空间。而通过new关键字和构造器创建的对象则是堆空间,常量池是方法区的一部分。

10.math.round(11.5)是多少,math.round(-11.5)又是多少
第一个结果是12,第二个结果是-11.因为java里面的四舍五入机制是在参数中加0.5然后向下取整的。

11.switch是否能作用在byte上,是否能作用在long上,是否能作用在string上
在java5之前,switch能使用的值是char,byte,short,int,在5之后加入了枚举类型,而在7之后加入了String类型,但是无论是什么时候,long都是不被允许的。

12.如何最有效率的计算2*8
2<<3,移位运算永远是计算机最擅长的。

13.数组有没有length()方法,String又没有length()方法
数组中没有length()方法,但是数组有length这个属性,而String是有length()方法的

14.java中如何跳出多层嵌套的循环
在最外层循环前加一个标记如A,然后通过break A;即可以跳出当前的多重循环,java中是支持带标签的break和continue语句的,但是要尽量避免使用它们,因为他们会给你的代码造成一定的混乱。

15.构造器是否可以被重写
构造器是不能被继承的,所以根本谈不上重写这回事,你非要说的话你可以写一个一样名字的作为重载。

16.两个对象满足equals,但是却拥有不一样的hash code,这句话对不对
不对,如果两个对象满足equals相同,那么他们的hash code必然是一样的,但是话反过来说,其hash code相同,他们的equals未必相同

17.是否可以继承String类
不能,String头上有个大大大的final

18.String,StringBuilder,StringBufferr的区别
java平台提供了两种类型的字符串,String和StringBuilder/StringBuffer,他们可以存储和操作字符串,其中String是只读字符串 ,也就意味着String中的内容是不能被改变的,而在StringBuilder和StringBuffer里面可以对里面的值进行直接修改,而这两者之间的关系在于StringBffer是线程安全的,但是必然效率就并不如StringBuilder,因为他被synchronized锁住了部分性能。

19.什么时候使用+运算符进行字符串连接比Stringbuilder/StringBuffer连接字符串性能更好
+进行字符串连接的本质就是创建一个StringBuilder对象把两个字符串放进去拼接.....在数量小于100左右的时候,其实性能差距并不是非常大,所以没有什么大关系,但是如果需要拼接的次数巨大,那么必须要使用到StringBuilder/StringBuffer以提升效率

20.重写和重载的区别,重载的方法是否能够根据返回值来进行区分
方法的重载一般来说是存在于一个类中的,其实可以把方法的重载理解为几个不一样的方法刚好名字一样,重载要求必须有不同的参数列表,也就是参数的个数和种类不同或者两者都不同,因为在名字一样的前提下参数列表就是他们的唯一标识了,这样的方法我们称之为重载,而方法的重写发生在子父类中,是一种多态的表现,重写是为了对父类方法的内容进行一定的修改,要求返回值相同或者说父类返回值是子类返回值的父类,参数列表也必须相同,并且访问权限不能被缩小,异常不能被放大,也就是常说的二等一小一大。而重载对于返回值并没有什么要求。不能根据返回值来区分是否为重载,正如我之前所说,重载属于不同方法的恰好同名,假如只有返回值不一样那调用时要如何区分两种不同的方法呢,所以不能以返回值来区分是否发生了重载。

21.描述一下JVM加载class文件的原理机制?
JVM中类的加载是由类加载器和它的子类来实现的,类加载器的功能是负责在运行时查找和装入类文件中的类。
概括一下类加载过程
1.静态成员变量的默认初始化
2.静态代码块
3.分配内存,并且把普通成员的变量进行初始化
4.对所有变量进行显示初始化
5.执行普通代码块
6.执行构造器
7.返回内存地址

22.char类型是否能够存储一个中文汉字,为什么
char类型可以存储一个中文汉字,因为在java中使用的默认编码方式是UNICODE,在UNICODE中一个中文占两个字节而一个char类型刚好存储的是两个字节

23.抽象类和接口有什么异同
接口可以说是抽象类的再抽象,他们两个都不能实例化,抽象类里面可以有抽象方法也可以没有抽象方法,但是一个类里面有抽象方法那他一定是抽象类,抽象类除了不能实例化之外和普通类没有什么大区别,抽象类可以有构造器,接口就不一样了,接口中不能定义构造器和代码块,接口可以多继承但只能继承接口,接口可以被多实现,接口中的成员必须被public修饰并且方法必须是抽象的,接口里面的属性必须是常量。

24.简述静态变量和实例变量的区别
静态变量是被static修饰的变量,也称之为类变量,他属于类而不属于类里面的某一个对象,静态变量在类里面有且只有一个变量,无论创建多少个对象,对象都将共享这一个静态变量。静态变量的初始化始于所有的加载之前。

25.是否可以从一个静态方法中发出对非静态方法的调用?
不可以,因为静态方法的加载时候是在类被调用的时候,所以在那个时候对象并没有被创建,而非静态的方法的方法的调用必须由对象完成,这就出现了问题,所以静态方法是不可以调用非静态方法的,然而因为这个原因所以非静态方法可以随意的调用静态方法或者静态属性。

26.抽象方法是否能被静态字段修饰?
明显不能,抽象方法的人生意义的就是被重写被实现,而静态字段static则是一个杜绝其他方法进行改写的字段,两者之间假如可以同时使用那就会出现一个永远无法被实现的抽象方法。

27.有几种方法来进行对对象的克隆?
两种,一是实现Cloneable接口并重写Object里面的clone方法,这种方式称之为浅克隆,因为他里面如果维护了一个引用类型,则指向是不会改变的。
另外一种是实现Serializable接口的前提下,通过序列化和反序列化来实现深度克隆,这样的克隆引用类型数据也会被一起克隆,我们称之为深度克隆。

28.GC是什么,为什么要有GC
GC就是垃圾回收的意思,内存是编程人员很容易出问题的地方,忘记或者是错误的内存回收会导致系统的不稳定甚至说崩溃,所以java提供了自动检测对象是否超过作用域的GC功能,java语言中没有提供释放已分配内存的方法。java程序员不必担心内存的管理,因为垃圾回收机制会自动的进行回收,程序员只能使用System.gc()方法和Runtime.getRuntime().gc()方法来进行对垃圾回收的建议,但GC并不保证会这么做(不能勉强)。
垃圾回收意义重大,这个机制可以有效的防止内存的泄露,有效的使用可以使用的内存,垃圾回收机制一般都是作为一个低优先级的后台线程运行,不可预知的对已经死亡或者说长时间没有使用的对象进行清除和回收,垃圾回收有两面性,一来他是JAVA中的一大亮点,因为他让程序员从繁杂的内存管理中解放了出来,但是正是由于内存的不可控导致了一些不好的用户体验。

29.String s =new Stirng("XYZ");创建了几个对象
两个对象,一个是创建在常量池中的对象,另外一个创建在了堆区所开辟的空间。

30.接口是否能够继承接口,抽象类是否可以实现接口,抽象类是否可以继承非抽象类/
接口可以继承接口,甚至接口能够继承多个接口,抽象类当然可以实现接口,他只是不能创建对象,当然也可以继承非抽象类。

31.一个.java文件中是否能包含不为内部类的多个类?
当然可以,不过其中有且只能有一个类被public修饰,被修饰的类类名需要和文件名相等。

32.匿名内部类是否可以继承其他类?是否可以实现接口?
都是可以的,实际上这正是用来实现接口回调或者说实现监听的方法之一。

33.内部类可以引用外部类的成员吗,有没有什么限制。
一个内部类可以访问创建他的外部类的所有成员,包括私有成员。

34.java中final关键字有哪几种用法
用来修饰方法,呸呸呸,这个方法还是能被继承的,只是不能被重写;用来修饰类,这个类将不能被继承,用来修饰变量,这个变量将不会再被虚拟机默认分配初始值并且一旦被赋值将无法再被更改。

35.如何将字符串转化为基本数据类型?如何将基本数据类型转化为字符串。
调用基本数据类型的包装器类型中的valueOf(String)或者parseXXX(String)方法可以将对应的字符串变成基本数据类型。
将基本数据类型+""就可以编程字符串,又或者说使用String类的valueOf()方法可以将基本数据类型转换成相应的字符串。

36.如何实现字符串的反转和替换。
卧槽这个问题问的好回去自己写一个反转的方法。
写完发现也就这么回事,只不过发现在JS中array有一个反转方法很方便叫Array.Reverse(char[]),他可以将一个字符数组反转过来。
替换也很简单,直接用正则就可以了呀。

37.日期和年月
1.如何取得年月日时分秒
2.如何取得从1970年到现在的毫秒数
3.如何取得每个月的最后一天
4.如何格式化日期
1.调用date里面对应的get方法就可以获得了,但是这些方法基本上都过时了,现在一般是创建一个java.util.Calendar实例,调用其get方法传入对应的参数就可以了(更特么麻烦)
2.有个getTime()方法就可以直接获取这东西了
3.也是创建java.util.Calendar这个神通广大的对象,然后传对应的参数就可以了。
4.调用java.text.DataFormat里面的子类中的format方法可以将日期初始化。

38.java和javaSciprt
java和js是两个公司开发的不同产品。java是一个近乎真正的面向对象语言,无论开发多简单的程序都必须设计对象,js则是一种脚本语言,可以用来制作与网络无关的,与用户交互作用的复杂软件,是一种基于对象和事件驱动的编程语言,java代码在执行之前一定要经过编译,但是js是一种解释性语言,源代码无需经过编译,由浏览器直接进行解释执行,java作为一种强类型语言,所有变量在编译之前必须对其进行声明,而js在变量使用前甚至可以不对变量进行声明。

39.如果在try语句里面有一个return语句,那么紧跟在后面的finally语句里面的代码是否会被执行?执行的顺序是在return前之后还是之前?
会被执行,并且执行顺序在return之前执行。
在finally中改变返回值的做法是一种不好的做法,因为在java中try语句里面的return会被暂定到finally语句块执行完之后再进行执行,这种情况下假如在finally语句块里面对return的值进行改动的话会造成返回值的改变(卑鄙无耻)

40.java中处理异常的关键字:throws,throw,try,catch,finally分别该如何使用。
java使用面向对象的方法来进行异常的处理,在java中把各种异常进行了分类,并提供了良好的接口,每个异常都是一个对象,都是throwable或者他的一个子类的实例,当方法出现异常之后便会抛出一个异常对象,这个异常对象中包含了异常信息,我们可以调用这个异常对象的方法来获取到对应的异常信息。异常处理就是通过这五个关键字来实现的,我们用try来执行一段程序,如果系统抛出(throw)一个异常对象,我们就用一个对应的异常对象来捕获他并且在catch语句中定义捕获了异常之后的处理操作,throw用来明确的抛出一个异常,而throws往往用来在方法中声明自己可能出现的问题(允许一定程度上的无病呻吟),finally则用来确保一段代码无论发生了声明异常情况都能正常的执行,try语句是可以相互嵌套的,嵌套的语句的异常会被放入异常栈中直到本个try语句被执行完,然后将异常交给外层try语句处理,如果一个异常没有被处理,则这个异常会不断的向外抛出直到有一个处理这个异常的语句或者直到这个异常被抛给了虚拟机。

41.阐述final,finally,finalize的相互区别
final:finai修饰符有三种用法,用来修饰类保证类不能被继承,用来修饰方法保证方法不能被重写,用来修饰变量保证变量变成常量....
finally:通常放在try catch方法后面表示无论发生什么异常都一定要执行的代码。
finalize:是object类里面的一个方法,当gc确定不存在这个对象的更多引用时,会调用这个方法,但是对象并不是说一定就会回收了,对象的回收只和内存有关,只要jvm还没有到快要耗尽内存的时候他是不会浪费时间来进行垃圾回收的。

42.list,set,map三者是否都继承自collection接口
list,set是,但是map不是,因为map是键值对映射的容器,和list和set有本质的区别,list的线性结构的容器

43.阐述ArrayList,Vector,LinkedList的存储性能和特性
ArrayList和Vector都是由数组方式存储数据的,当元素数大于可存储数时便增加和插入元素,都允许直接按序号索引元素,但是插入元素时要涉及到元素移动等内存操作,所以查询快而插入慢,其中Vector使用了线程锁机制,保证了线程是安全的同时也降低了其本身带来的性能,所以逐渐的被淘汰了。而LinkList使用了双向链表实现的存储,按序号索引的时候需要向前或者向后遍历,但是插入数据的时候只要记录本项的前后项就可以了,所以检索效率低但是插入效率很高,在需要大量的插入其中数据的时候我们应该使用它。同样,linkedlist也是不保证线程安全的,我们要保证线程安全的话需要利用一些特殊的方法将其转换成线程安全的容器。

44.collection和collections的区别
collection是一个集合的接口,而collections是一个工具类,他提供了一系列的方法来辅助容器操作,这些方法包括对容器的检索,排序,线程安全化等。

45.List,Set,Map三者之间存储元素的时候各有什么特点。
List利用特定的索引来存取元素,可以存在重复的元素,而Set是不能用于存储重复元素的(用equals方法来加以区分),Map保存的是一对对的键值对映射,映射关系可以是一对一或者一对多。

46.TreeMap和TreeSet在排序的时候是如何比较元素大小的。
两者本身是要求存放的对象必须实现comparable接口的,这个接口提供了一个compareTo()的方法,当插入元素的时候便会回调这个方法以比较元素的大小。
我们之前也讲到了另外一种方法,在创建集合对象也就是treeSet对象的时候利用传入一个comparator()对象并以静态内部类的形式实现他的compare()方法,在方法里面规定顺序。

47.Tread类里面的sleep()方法和Object里面的wait()方法都可以让线程暂停执行,两者之间有什么实际区别呢?
sleep是Thread里面的静态方法,调用这个方法会让当前的线程暂停执行一段时间,将cpu让给其他线程,但是对象的锁依然会保持,在休眠时间结束之后会进行可执行状态,但是wait方法是Object的方法,调用对象的wait方法会让线程放弃当前的锁,并且让线程暂时的停止执行,进入对象的等待池,只有调用对象的notify方法才会唤醒池中的线程,重新获得锁进入可运行状态。也就是说一个有时间限制,另一个如果你不唤醒他将会永远的沉睡下去。

48.线程的sleep()方法和yield()方法有什么区别?
sleep方法调用的时候是直接将线程进入沉睡状态,并且将线程转入阻塞状态,抛出一个异常。而yield()也称线程的让步,只会为与自己相同等级或者比自身等级高的线程让出运行的机会,而且并不保险,这个方法并不会抛出任何的异常。

49.synchronized关键字的用法?
synchronized关键字代表了同步,可以将对象或者方法标记成同步,以实现对对象和方法的互斥访问,在一定程度上避免线程安全问题。

50.如何启动一个线程?
调用线程的start方法可以启动线程,调用线程对象的run方法绝对不算是启动了线程,只能算是正常的调用了一个类里面的方法而已。

51.在java中如何实现序列化?有什么意义?
序列化是一种用来处理对象流的机制,所谓对象流就是将对象的内容进行流化,可以对流化之后的对象进行读写操作,也可以将流化后的对象传输与网络之间,序列化就是为了解决将对象流读写之后出现的各种问题(如果不进行序列化的话会出现数据的乱序问题),想要让一个类实现序列化需要让其实现serializable接口,这个接口是一个标识接口,也就是说这个接口是一个空接口,只是用来标识这个对象是可以被序列化的,序列化之后可以以用于数据的持久化保存,还可以用于对象的深度克隆。

52.java中有几种类型的流
字节流和字符流,所有的流都是由这两个流转化包装而来。字节流的流化单位是一个字节,字符流的流化单位是一个字符。

53.xml文档有几种形式?他们之间有何本质区别?解析xml文档有哪几种方式?
xml文档的定义分为dtd约束定义和schema约束定义。两者都是约束定义,本质区别在于schema本身也是一个xml文件,可以被xml解析器解析,约束能力优于dtd约束。xml的解析方式一般来说分为dom解析和sax解析两种,sax解析是一种轻量级的解析,读取机制为逐行读取,所以可以无视内存的影响,并且读取效率很高,dom解析在处理大型文件时性能下降非常多,这是因为其读取机制需要将xml文件先读取在内存中,但是他的优点在于能够随机读取并且能在读取的时候更改内容,这些都是sax解析做不到的。

54.阐述jdbc操作数据库的步骤
1.加载驱动
2.获取链接对象
3.根据链接获取到对应的statement对象
4.利用statement对象来执行sql语句
5.如果执行完语句拥有结果集的话处理器相应的结果集
6.关闭资源

55.statement和preparestatement有什么区别,哪个性能更好
1.preparestatement接口代表这预编译语句,他的优势在于能够减少sql编译错误并且增加sql的安全性(减少sql的注入攻击的可能性)
2.preparestatement中的sql语句是可以带参数的,避免了字符串的拼接
3.在批处理sql语句或者频繁的执行相同的查询时,preparestatement有天然的性能优势,省去了再次编译和生成执行时间。

56.在进行数据库编译的时候,连接池有什么作用?
由于在创建连接和释放连接时都需要消耗巨大的资源,尤其是数据库服务器不在本地时,为了提升系统访问数据库时候的性能,我们可以提前创建若干个连接置于连接池中,在需要链接时直接从连接池中获取,使用结束时交还连接池而不是关闭,避免了频繁的创建和释放连接造成的开销,这是典型的用空间换取时间的策略,浪费了空间存储但是大大的节约了创建和释放连接的时间。

57.事务的ACID指的是什么?
指的是事务的四大特性
Atomic 原子性:事务中的所有操作要么全做要么全都不做,任何一项操作的失败都会造成所有事务的失败
Consistent 一致性:事务结束之后系统的状态是一致的
Isolated 隔离性:并发执行的事物彼此无法看到对方的中间状态
Durable 持久性:事务完成后所做的所有改动都将会被持久化,即使发生了灾难性的失败。

58.什么是数据的脏读,幻读,不可重复读?
脏读:指读取到修改但未提交的事务内容后执行了事务的回滚。也就是说有一个狗逼在修改数据的时候发现修改不对然后执行了回滚,你读到了他修改后回滚前的脏数据。
不可重复读:两次读取的内容不一致。也就是说你读取到的内容被人提交修改了,你再次读取发现内容不一致。
幻读:指两次读取的时候发现读取的内容增加了,也就是读取了第一次之后别人又插入了新的内容,仿佛自己读取到的是幻觉。

59.线程和进程之间是什么关系
线程:是程序运行的最小单位。
任何一个java程序在运行的时候,jvm都会为这个应用程序创建一个主线程,而主线程的任务就是把main方法中的代码执行完毕。
进程:是内存分配的最小单位
jvm的进程,main方法是线程,所以我们只能操控线程而不能操控进程,因为jvm仅仅是一个进程而已,一个进程可以拥有多个线程。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部