- 浅聊JDK,JRE,JVM以及区别
JDK:Java Development Kit(java 开发工具包),即java语言编写的程序所需的开发工具包.JDK包含了JRE,同时还包括java源码的编译器javac,监控器jconsole,分析器jvisualvm等
JRE:Java Runtime Environment(java 运行时环境).Java程序运行时环境,包含了Java虚拟机(JVM),Java基础类库等
JVM:Java Virtual Machine(Java虚拟机).JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的.
包含关系:JDK–>JRE–>JVM
- == 和equals的区别
equals是Object的方法, = =是逻辑操作符
= =本质表示内存地址,如果值相等,则说明两个引用指向一个地址
= =比较基础数据类型的值,像byte,short,int,long,boolean,char,float,double,其实String也可以但是对比的不是new String() 后面详讲
String a="a";
String b="a";
String a1 = new String("a");
String b1 = new String("a");
//true
System.out.println(a==b);
//false
System.out.println(a1==b1);
equals本质上还是用= =,相当于比较对象内容,Java大多数类重写了equals()方法
由于==直接比较的内存地址,所以运行速度比equals 快
- 两个对象的hashCode()相同,则equals()也一定相同吗
hashCode相同,equals()不一定相同,但是equals()相同则hashCode()一定相同 - String str=“ABC” 和String str = new String(“ABC”)一样吗
不一样String str=“ABC”,会在常量池查找是否存在,如果没有就创建
String str = new String(“ABC”) 会创建一个对象分配内存地址,并指向常量池里的地址 - String的常用方法
length():获取字符串的长度,其实也就是字符个数
isEmpty():判断指定字符串是否为空
toCharArray():把字符串转换为字符数组
charAt(int index):获取指定索引处的字符
indexOf(String str):获取str在字符串对象中第一次出现的索引
substring(int start):从start开始截取字符串
substring(int start,int end):从start开始,到end结束截取字符串。包括start,不包括end
equals(Object obj):比较字符串的内容是否相同
equalsIgnoreCase(String anotherString):比较字符串的内容是否相同,忽略大小写
startsWith(String prefix):判断字符串对象是否以指定的字符开头(区分大小写)
startsWith(String prefix,int toffset):判断字符串对象是否以指定的字符开头,参数toffset为指定从哪个下标开始
endsWith(String str):判断字符串对象是否以指定的字符结尾
toLowerCase():把字符串转换为小写字符串
toUpperCase():把字符串转换为大写字符串
trim():去除字符串两端空格
split():去除字符串中指定的的字符,然后返回一个新的字符串
replace(char oldChar, char newChar):将指定字符替换成另一个指定的字符
replaceAll(String regex,String replasement):用新的内容替换全部旧内容
lastIndexOf(String str):返回指定字符出现的最后一次的下标
contains(CharSequence s):查看字符串中是都含有指定字符
concat(String str):在原有的字符串的基础上加上指定字符串
-
抽象类一定要有抽象方法吗
抽象类必须有关键字abstract来修饰。
抽象类可以不含有抽象方法
如果一个类包含抽象方法,则该类必须是抽象类 -
普通类和抽象类的区别
抽象类不能被实例化
抽象类可以有抽象方法,抽象方法只需申明,无需实现
含有抽象方法的类必须申明为抽象类
抽象类的子类必须实现抽象类中所有抽象方法,否则这个子类也是抽象类
抽象方法不能被声明为静态
抽象方法不能用 private 修饰
抽象方法不能用 final 修饰 -
抽象类可以用final修饰吗
不能,抽象类是被用于继承的,final修饰代表不可修改、不可继承的。 -
接口和抽象类的区别
抽象类和接口都不能被直接实例化
抽象类要被子类继承,接口要被子类实现
接口里面只能对方法进行声明,抽象类既可以对方法进行声明也可以对方法进行实现
抽象类里面的抽象方法必须全部被子类实现,如果子类不能全部实现,那么子类必须也是抽象类.接口里面的方法也必须全部被子类实现,如果子类不能实现那么子类必须是抽象类
接口里面的方法只能声明,不能有具体的实现。这说明接口是设计的结果,抽象类是重构的结果
抽象类里面可以没有抽象方法
如果一个类里面有抽象方法,那么这个类一定是抽象类
抽象类中的方法都要被实现,所以抽象方法不能是静态的static,也不能是私有的private
接口(类)可以继承接口,甚至可以继承多个接口。但是类只能继承一个类
抽象级别(从高到低):接口>抽象类>实现类
抽象类主要是用来抽象类别,接口主要是用来抽象方法功能.当你关注事务的本质的时候,用抽象类;当你关注一种操作的时候,用接口
抽象类的功能应该要远多于接口,但是定义抽象类的代价较高,因为高级语音一个类只能继承一个父类,即你在设计这个类的时候必须要抽象出所有这个类的子类所具有的共同属性和方法;但是类(接口) 却可以继承多个接口,因此每个接口你只需要将特定的动作方法抽象到这个接口即可.也就是说,接口的设计具有更大的扩展性,而抽象类的设计必须十分谨慎 -
IO流有几种
字节流:InputStream(new FileInputStream(new File());
Outpustream(new FileOutputStream(new File());
字符流: Reader (new FileReader(new File);
Writer(new FileWriter(new File);
内存操作流:ByteArrayInputStream; ByteArrayOutputStream;
打印流:PrintStream,PrintWriter.
字符缓冲流:BufferedReader,BufferedWriter
数据操作流:DataInputStream,DataOutputStream
对象序列化:ObjectInputStream,ObjectOutputStream. -
AIO,BIO,NIO的区别
JAVA BIO:同步阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销.
Java NIO : 同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。
Java AIO(NIO.2) : 异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理,
NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。
AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持
I/O属于底层操作,需要操作系统支持,并发也需要操作系统的支持,所以性能方面不同操作系统差异会比较明显。另外NIO的非阻塞,需要一直轮询,也是一个比较耗资源的。所以出现AIO -
files的常用方法
Files.exists() 检测文件路径是否存在
Files.createFile()创建文件
Files.createDirectory()创建文件夹
Files.delete() 删除文件或者目录
Files.copy() 复制文件
Files.move() 移动文件
Files.size()查看文件个数
Files.read() 读取文件
Files.write()写入文件