java的基础知识

1. JDK和JRE有什么区别
JDK: Java Development Kit 的简称,Java开发工具包,提供Java的开发环境和运行环境.
JRE: Java Runtime Environment 的简称,Java运行环境,为Java运行提供所需的环境.
其实JDK包含了JRE,同时包含了Java源码的编译器javac,还包含了很多Java程序调试和分析的工具;
简单来说如果需要运行Java程序,安装JRE即可,若需要编写Java程序,需要安装JDK

两个对象的hashCode()相等,则equals()也一定为true吗?
不对,"通话"与"重地"的hashCoude()相等,但他们的equals()则为false;
hashcoude()相等即两个键值对的哈希值相等,然而,哈希值相等,并不能得出键值对相等;

final在Java中的作用
final修饰的类叫最终类,该类不能被继承.
final修饰的方法不能被重写.
final修饰的变量叫常量,常量必须初始化,初始化之后的值不能被修改
内部类不能引用外部非静态的成员变量,内部类用外部的变量,外部变量必须是final

String属于基本数据类型吗?
String不属于基本数据类型,基本数据类型只有8种:byte,char,short,int,long,float,double,bollean

Java内存分配
寄存器:JVM内部虚拟寄存器,存取速度非常快,程序不可控制。
栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中。
堆:存放new出来的对象,注意创建出来的对象只包含各自的成员变量,不包括成员方法。>
常量池:存放常量,如基本类型的包装类(Integer、Short)和String,注意常量池位于堆中。
代码段:用来存放从硬盘上读取的源程序代码。
数据段:用来存放static修饰的静态成员。

可总结以下结论

Java中有两种类型,分别是基本类型和引用类型。如果是基本类型则直接在栈中保存值,如果是引用类型,则真正new出来的对象会存放在堆内存中,栈内存中会保存指向该对象的引用,即对象在堆内存中的地址。
栈中的数据和堆中的数据销毁并不是同步的。每个方法在执行时都会建立自己的栈区,方法一旦结束,栈中的局部变量立即销毁,但是堆中对象不一定销毁。因为可能有其他变量也指向了这个对象,直到栈中没有变量指向堆中的对象时,它才销毁,而且还不是马上销毁,要等垃圾回收才可以被销毁,这个是由JVM决定的。
类中定义的实例成员变量在不同对象中各不相同,都有自己的存储空间(成员变量在堆中的对象中)。而类中定义的方法却是该类的所有对象共享的,只有一套,对象使用方法的时候方法才被压入栈,方法不使用则不占用内存.
java中的常量池技术,是为了方便快捷地创建某些对象而出现的,当需要一个对象时,就可以从池中取一个出来(如果池中没有则创建一个),则在需要重复创建相等变量时节省了很多时间。常量池其实也就是一块内存空间,不同于使用new关键字创建的对象所在的堆空间。
java中的基本类型有:byte、short、char、int、long、boolean。其对应的包装类分别是:Byte、Short、Character、Integer、Long、Boolean。上边提到的这些包装类都实现了常量池技术,而两种浮点数类型的包装类则没有实现。另外,String类型也实现了常量池技术。

int i = 30;
int i0 = 30;
Integer i1 = 30;
Integer i2 = 30;
Integer i3 = 0;
Integer i4 = new Integer(30);
Integer i5 = new Integer(30);
Integer i6 = new Integer(0);
Double d1 = 1.0;
Double d2 = 1.0;
System.out.println("i==i0结果为: " + (i == i0));//true
System.out.println("i1==i2结果为: " + (i1 == i2));//true
/*i1和i2均是引用类型,在栈中存储对象地址,因为Integer是包装类。
由于Integer包装类实现了常量池技术,
因此i1、i2的40均是从常量池中获取的,均指向同一个地址,因此i1==12。*/
System.out.println("i==i2结果为: " + (i == i2));//true
System.out.println("i1==i2+i3结果为: " + (i1 == i2 + i3));//true
/*这是一个加法运算,
Java的数学运算都是在栈中进行的,
Java会自动对i1、i2进行拆箱操作转化成整型,因此i1在数值上等于i2+i3*/
System.out.println("i==i2+i3结果为: " + (i == i2 + i3));//true
System.out.println("i4==i5结果为: " + (i4 == i5));//false
/*.i4和i5均是引用类型,在栈中存储地址,因为Integer是包装类。
但是由于他们各自都是new出来的,因此不再从常量池寻找数据,
而是从堆中各自new一个对象,然后各自保存指向对象的地址,所以i4和i5不相等,
因为他们所存地址不同,所引用到的对象不同。*/
System.out.println("i4==i5+i6结果为: " + (i4 == i5 + i6));//true
System.out.println("i==i5+i6结果为: " + (i == i5 + i6));//true
System.out.println("d1==d2结果为: " + (d1 == d2));//false
/*. d1和d2均是引用类型,在栈中存储对象地址,因为Double是包装类。
但Double包装类没有实现常量池技术,因此Doubled1=1.0;相当于Double d1=new Double(1.0);
是从堆new一个对象,d2同理。因此d1和d2存放的地址不同,指向的对象不同,所以不相等。*/

String类型
对于字符串,其对象的引用都是存储在栈中的,如果是编译期已经创建好 (直接用双引号定义的) 的就存储在常量池中,如果是运行期 (new出来的) 才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份

String s1 = “china”;
String s2 = “china”;
String s3 = “china”;

String ss1 = new String(“china”);
String ss2 = new String(“china”);
String ss3 = new String(“china”);
在这里插入图片描述
Java中操作字符串都有哪些类?它们之间的区别?
String,StringBuffer,StringBuilder
String是不可变的对象,对每次对String类型的改变时都会生成一个新的对象,
StringBuffer和StringBuilder是可以改变对象的。
对于操作效率:StringBuilder > StringBuffer > String
对于线程安全:StringBuffer 是线程安全,可用于多线程;StringBuilder 是非线程安全,用于单线程

使用StringBuilder或StringBuffer的reverse()可以反转字符串

抽象类必须要有抽象方法吗?
抽象类不一定要有抽象方法
抽象类不可以直接实例化,所以抽象类必须被继承,才能被使用。
通过abstract 父类的引用来指向子类的实例,子类A继承abstract 父类B,B aa=new A(“a”);
一个类只能继承一个抽象类,而一个类却可以实现多个接口。

普通类和抽象类的区别?
普通类不能包含抽象方法,抽象类可以包含抽象方法;
抽象类不能直接实例化,普通类可以直接实例化;

抽象能能使用final修饰吗?
不能,定义抽象类就是让他继承,final不能被继承,一起使用则相互矛盾;
实现 :
14. 接口和抽象类的区别?
实现 : 抽象类的子类使用extends来继承;接口必须用implements来实现接口;
构造函数 : 抽象类可以有构造函数,接口不能有;
实现数量 : 类可以实现多个接口,但只能继承一个抽象类;
访问修饰符 :
1.抽象类中的方法 可以是任意访问修饰符;
2.抽象类中的抽象方法 (其前有abstract修饰)不能用private、static、synchronized、native访问修饰符修饰。
原因如下:
private ,抽象方法没有方法体,是用来被继承的,所以不能用private修饰;
static 修饰的方法可以通过类名来访问该方法(即该方法的方法体),抽象方法用static修饰没有意义;
synchronized 关键字是为该方法加一个锁。而如果该关键字修饰的方法是static方法。则使用的锁就是class变量的锁。如果是修饰类方法。则用this变量锁。但是抽象类不能实例化对象,因为该方法不是在该抽象类中实现的。是在其子类实现的。所以,锁应该归其子类所有。
native,这个东西本身就和abstract冲突,他们都是方法的声明,只是一个把方法实现移交给子类,另一个是移交给本地操作系统。如果同时出现,就相当于即把实现移交给子类,又把实现移交给本地操作系统,产生矛盾
3.接口中的方法 接口是一种特殊的抽象类,接口中的方法全部是抽象方法(但其前的abstract可以省略),所以抽象类中的抽象方法不能用的访问修饰符这里也不能用。而且protected访问修饰符也不能使用
其原因是: 接口可以让所有的类去实现(非继承),不只是其子类,但是要用public去修饰。接口可以去继承一个已有的接口。

Java中IO流分几种?
按功能分: 输入流(input) , 输出流(output);
按类型来分: 字节流和字符流;
字节流与字符流的区别是:字节流是按8位传输以字节为单位输入输出数据,字符流是按16位传输以字符为单位输入输出数据;

**BIO,NIO,AIO有什么区别?
BIO: 同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。
BIO是一个连接一个线程
NIO: 同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。
NIO是一个请求一个线程。
AIO: 异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。
AIO是一个有效请求一个线程。
**
适用场景分析
BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。
NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。
AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。

Collection和Collections有什么区别?
Collection是一个集合接口,它提供了对对象进行基本操作的通用接口方法.所有的集合都是他的子类,比如List,Set等;
Collections是一个包装类,包含了很多静态方法,不能被实例化,就是一个工具类.比如提供排序方法:Collections.sort(list);
ps:JDK中工具类的命名就是在后面加s;例如:Array的工具类就是Arrays;

**Java容器都有哪些?
Java容器分为Collection和Map两大类,其下又有很多子类:
Collection
* List
* ArrayList
* LinkedList
* Vector
- Stack
* Set
* HashSet
- LinkedHashSet
* TreeSet

Map
* HashMap
* LinkedHashMap
* TreeMap
* ConcurrentHashMap
* HashTable**

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值