JAVA热点基础大盘点
每当收获心得知识,需要进行一次自主的剖析!
前言
本系列文章带你轻松理解java的基础,从此爱上java
一、什么是面向对象?
1.1 面向对象:
面向对象中的对象不是指女朋友,它是一种编程术语,面向对象是当今软件开发方法的主流方法之一,它是把数据以及对数据的操作放在一起,作为一个相互依存的整体体积为对象。对同类对象抽象出其共性及类类中有大多数的数据,只能被本类的方法进行处理内,通过一个简单的外部接口与外界发生关系,对象与对象之间通过消息进行通信。
我的理解面向对象是指将要处理的逻辑进行一个角色(对象)的划分,每一个角色实现不同的任务,角色与角色之间存在某些特定的关联。
逻辑结构图:
1.2 举例子
如果你需要洗衣服,如果运用面向对象的思维,那么我们可以分成两个对象,首先是人,然后是洗衣机。 1.人负责产生脏衣服,并且将脏衣服放进洗衣机。 2.洗衣机负责将衣服洗好,并且漂洗脱水。 3.人在将衣服挂起来晾干。
代码演示: 创建人:
public class Person {
private int age;
private int hight;
private String sex;
private String name;
public Person(String name) {
this.name = name;
}
public int makeClo(int n){
if(n<0){
return -1;
}
return n;
}
public String liang(String res){
if(res.equals("洗好了!")){
return "我把衣服晾了!";
}else{
return "没有衣服!";
}
}
}
洗衣机:
public class Washing {
private String name ;
public Washing(String name) {
this.name = name;
}
public String washing(int n){
if(n<0){
return "没有放衣服";
}
return "洗好了!";
}
}
开始洗衣服:
public class Deom {
public static void main(String[] args) {
Person person = new Person("沉默着忍受");
Washing washing = new Washing("海尔");
person.makeClo(3);
String s = washing.washing(3);
System.out.println(s);
System.out.println(person.liang(s));
}
}
洗好了!
我把衣服晾了!
Process finished with exit code 0
*/
二、JDK,JRE,JVM区别和联系
2.1 JDK是什么?
jdk是java开发工具,是给java开发程序员使用;
2.2JRE是什么?
java运行时环境 jre是给用户使用,如果需要运行程序,只需要安装jre;
2.3 JVM是什么?
java虚拟机,是用来编译解释java代码。JVM适配了很多操作系统,所以java跨平台就是通过JVM来实现的。
三、==和equals的 区别
3.1 “==”的作用:
== 运算符用来比较两个变量的值是否相等,也就是说该运算符用于比较变量对应的内存中所存储的数值是否相等,要比较两个基本类型的数据或两个引用变量是否相等,只能使用“==”运算符。
具体而言,如果两个变量是基本数据类型,可以直接使用运算符来比较,其对应的值是否相等,如果一个变量指向的数据是对象引用类型,那么此时涉及了两块儿内存,对象本身占用一块内存及堆内存变量也占用一块儿内存,例如如果语句string s=new String(),变量S占用一块内存空间,而new String()则存储在另外一块存储空间,此时变量S对应的内存中存储的数值就是对象占用的那块内存的首地址,对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,只要看这两个变量所对应内存中的数值是否相等,这两个对象是否指向同一块儿存储空间,那么这个时候就可以用等等运算符进行比较,但是如果要比较这两个对象的内容是否相等,那么就用运算符就无法实现了。
3.2 equals的作用:
Equals,是object类提供的方法之一。每一个Java类都继承了object类,所以每一个对象都具有Equals这个方法。 Object类中定义的equals,是直接使用等等运算符来比较两个对象的。所以在没有覆盖equals方法的情况下。 Equals(object)与等等运算符一样比较的是引用。 相比等等运算符, Equals方法的特殊之处就在于它可以被覆盖,所以可以通过覆盖的方法让它不是比较引用,而是比较数据的内容,例如String类的 Equals方法。是用来比较两个独立对象的内容是否相等及堆中的内容是否相等。
3.3 引申hashcode()
首先首先hashcode()方法是从object类中继承过来的,他也是用来鉴定两个对象是否相等。 Object内中的哈西蔻的方法返回对象,在内存中地址转换成的一个int值,所以如果没有重写首先hashcode()方法是从object类中继承过来的,他也是用来鉴定两个对象是否相等。 Object内中的哈西蔻的方法返回对象,在内存中地址转换成的一个int值,所以如果没有重写hashcode()的方法,任何对象的hashcode()方法都是不相等的。
虽然以Equals方法用来判断两个对象是否相等,但是它与hashcode()的方法是有区别的,一般来讲equals方法是用给用户调用的,如果需要判断两个对象是否相等,可以重写equals方法,然后在代码中调用,这样就可以判断他们是否相等的,对于hashcode()方法,用户一般不会去调用他列入哈希map中,由于key是不可重复的,他在判断K是否重复时就用了哈希扣的这个判断方法,而且也用到了EQ的方法,此处不可重复指的是equals和hesitate,只有一个不等就可以了。所以hashcode()方法相当于是对一个对象的编码,就好像文件中的MD5它与equal的方法的不同之处就在于它返回的是int型,比较起来不直观。一般覆盖equals的方法同时也要覆盖hashcode()方法,否则就违反了object还是code的约定,从而导致该类无法与所有基类散列值的集合类(hashmap/hashSet/hashtable)正常运行。的方法,任何对象的哈希扣的方法都是不相等的。
hashcode()方法的返回值和equals方法的关系,如下如果equals方法的返回值是触及两个对象,equals方法比较是相等的,那么调用这两个对象中任何一个对象的hashcode()方法都必须产生同样的整数结果如果equals返回的是false,则两个对象根据equal的方法比较是不相等的那么 hashcode()方法的返回值有可能相等,也有可能不等。反之hashcode()方法的返回值不相等,一定能推出equals值的返回值也不相等而hashcode()方法返回值相等equals方法返回值可能相等,也可能不相等。
四、String,StringBuffer,StringBuilder的区别
Java语言中有4个类可以对字符或字符串进行操作,它们分别是 ,Character, String,String buffer, String builder。而其中character 用于单个字符操作,String用于字符串操作,属于不可变类,而使用buffer也是用于字符串操作,不同之处它是可变的类。
String是不可变的,也就是说,String对象一旦被创建,其实将不能被改变,而是军buffer可变内,当对象被创建后依然可以对其职进行修改,由于实际是不可变类,因此适应在需要被共享的场合中使用,而当一个字符串经常需要被修改的时候,最好使用时用Java法来实现,如果用是最难保存一个机长被修改的修改的字符串时,在字符串被修改时,会比Stringbuffer的,多很多的附加操作,同时生成很多无用的对象,由于这些无用的对象会被垃圾回收器来回收,因此会影响程序的性能,在规模小的项目里这个影响很小,但是在一般大的项目里,这会对程序运行效率带来很大的影响。
从程序的运行可以看出,当一个自助餐需要被经常修改时使用Stringbuilder比使用String要好很多,Stringbuilder也可以修饰被修改的字符串,它与Stringbuffer类似,都是字符串缓冲区,但是Stringbuilder不是线程安全的,如果只是在单线程中使用字符串缓冲区,那么Stringbuilder的效率会高一些,因此在只有单线程访问时可以访问Stringbuilder,当有多个线程访问时最好使用线程安全的string buffer,因为stringbuffer必要时可以对这些方法进行同步,所以任意的特定实例上所有的操作就好像是以串行顺序发生的该顺序与所涉及的每个线程进行的方法调用一致性。
在执行效率方面,Stringbuilder最高其次是Stringbuffer最后是String鉴于这一情况一般而言,如果要操作的数据量比较小,应优先使用是String,如果是在单线程下的操作Stringbuilder,大量数据就优先使用Stringbuilder类,如果是在多线程下优先使用Stringbuffer.
不要一味的说Stringbuilder的效率是最高的,因为需要分场合。细节决定成败!
五、重载和重写的区别
概念:重载和重写是Java3大特性中多态的重要的组成部分。重载的意思是,在一个类中,可以定义相同名称的方法。重写的意思是,子类继承父类后,重写基类中的方法。
重载和重写在定义时的区别主要在定义时的区别主要有,重载是指方法名相同,参数数量不同,参数类型可以不同。并且该方法的修饰符也可以不相同。而重写的区别是指,方法名必须相同,参数数量,类型,返回值必须相同。
1.重写是子类和父类之间的关系是垂直关系,重载是同一个类中方法之间的关系是一个水平的关系。 2.重写只能由一个方法或只能由一对方法产生关系,存在是由多个方法之间的关系。 3.重写要求参数列表相同,重载要求参数列表不同。 4.重写关系中调用方法提示根据对象的类型对象对应存储的空间类型来决定的。而存在关系是根据调用时的实参表和形参表来选择方法体的。
六、接口和抽象类的区别。
如果一个类中包含抽象方法,那么这个类就是抽象类,在Java语言中可以通过把类或类中的某些方法声明为抽象。来表示一个类似抽象类。接口就是指一个方法的集合接口中所有的方法都没有方法体在Java语言中,接口是通过关键字interface来实现的
出现类和接口都是支持抽象类定义的两种机制。前者表示的是一个实体,后者表示的是一个概念,二者具有很大的相似性,甚至有时候是可以互换的,但同时二者也存在很大的区别。
只要包含一个抽象方法的类,就必须声明为抽象类,抽象类可以声明方法的存在,而不去实现它被声明为抽象的方法,可能不包含方法体。。在实现时必须包含相同或者更低的访问级别。抽象类在使用过程中不能被实例化,但是可以创建一个对象使其指向具体子类的实例。抽象内的脂类为父类中所有抽象方法提供具体的时限,否则他们也是抽象类接口,可以看作抽象内的变体。接口中所有方法都是抽象的,可以通过接口间接的来实现多重的继承接口中的成员变量都是。静态类型且不可变,由于抽象类可以包含部分方法的实现,因此在一些场合下抽象类比接口存在更多的优势。
6.1 抽象类与接口的相同点如下
1.都不能被实例化 2.接口的实现类或抽象类的子类,都只有实现的接口或抽象类中的方法,才能被实例化。
6.2 接口与抽象类的不同点如下
1.在Java8之前,接口只有定义,其方法不能在接口中实现,只有实现接口的类才能在接口中定义方法,而凸向内可以有定义与实现及其方法,可以在抽象类中被实现。 2.接口需要实现,但抽象内只能被继承。一个类可以实现多个接口,但一个类只能继承一个抽象类,因此使用接口可以间接地达到多重继承的目的。 接口强调特定的功能实现,其设计理念是has a 关系;而抽象内强调所属关系及is-a。
|