Java(我的第一篇文章)
面向过程 与 面向对象(java)
特点:
-
简单
-
面向对象(封装、继承、多态)
-
平台无关性(jvm实现的平台无关性)
-
可靠性
-
安全性
-
支持多线程
-
支持网络编程
-
编译与解释并存
构造器Constructor不能被override,但是可以overload,所以常常一个类中又许多的构造函数。
重载: 发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。
重写: 发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类;如果父类方法访问修饰符为 private 则子类就不能重写该方法。
三大特性:
封装、继承(1、子类拥有父类非private的属性和方法 2、子类拥有自己的属性和方法,即子类可以对父类进行扩展 3、子类可以用自己的方式实现父类的方法)、多态
String、StringBuffer、StringBuillder区别:
可变性:
String是不可变的
private final char value[];
StringBuffer、StringBuillder都是继承AbstractStringBuilder类,所以这两种对象是可变的
char[] value;
线程安全性:
String对象是不可变的,理解为常量,线程安全
StringBuffer对方法加了同步锁,所以线程安全的
StringBulider并没有进行同步锁,所以非线程安全。
性能:
StringBuilder相比使用StringBuffer仅能获得10%-15%的性能提升,但是要冒多线程不安全的的风险。
总结:
-
操作少量的数据: 适用String
-
单线程操作字符串缓冲区下操作大量数据: 适用StringBuilder
-
多线程操作字符串缓冲区下操作大量数据: 适用StringBuffer
==与equals
==:它的作用是判断两个对象的地址是不是相等,即 判断两个对象是不是同一个对象
equal:它的作用也是判断两个对象是否相等,两种情况:
-
类没有覆盖equa()l的方法,等价于“==”
-
类覆盖了equal()方法,内容相等,则认为对象相等
1 public class test1 { 2 public static void main(String[] args) { 3 String a = new String("ab"); // a 为一个引用 4 String b = new String("ab"); // b为另一个引用,对象的内容一样 5 String aa = "ab"; // 放在常量池中 6 String bb = "ab"; // 从常量池中查找 7 if (aa == bb) // true 8 System.out.println("aa==bb"); 9 if (a == b) // false,非同一对象 10 System.out.println("a==b"); 11 if (a.equals(b)) // true 12 System.out.println("aEQb"); 13 if (42 == 42.0) { // true 14 System.out.println("true"); 15 } 16 }}
hasCode与equals:
hasCode ()介绍
hasCode()的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数,这个哈希码的作用是确定该对象在哈希表中的索引位置。hasCode()定义在JDK的object.java类中,意味着Java任何类都包含haoCode函数。
我们以“HashSet 如何检查重复”为例子来说明为什么要有 hashCode:
当你把对象加入 HashSet 时,HashSet 会先计算对象的 hashcode 值来判断对象加入的位置,同时也会与其他已经加入的对象的 hashcode 值作比较,如果没有相符的hashcode,HashSet会假设对象没有重复出现。但是如果发现有相同 hashcode 值的对象,这时会调用 equals()方法来检查 hashcode 相等的对象是否真的相同。如果两者相同,HashSet 就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。(摘自我的Java启蒙书《Head first java》第二版)。这样我们就大大减少了 equals 的次数,相应就大大提高了执行速度。 所有对于需要大量并且快速的对比的话如果都用equal()去做显然效率太低,所以解决方式是,每当需要对比的时候,首先用hashCode()去对比,如果hashCode()不一样,则表示这两个对象肯定不相等(也就是不必再用equal()去再对比了),如果hashCode()相同,此时再对比他们的equal(),如果equal()也相同,则表示这两个对象是真的相同了,这样既能大大提高了效率也保证了对比的绝对正确性!
hashCode()与equals()的相关规定
-
如果两个对象相等,则hashcode一定也是相同的
-
两个对象相等,对两个对象分别调用equals方法都返回true
-
两个对象有相同的hashcode值,它们也不一定是相等的
-
因此,equals 方法被覆盖过,则 hashCode 方法也必须被覆盖
-
hashCode() 的默认行为是对堆上的对象产生独特值。如果没有重写 hashCode(),则该 class 的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)
为什么java中只有值传递?
线程有哪些基本状态?
初始(new)->运行(RUNNABLE)->阻塞(BLOCKED)->等待(WAITING)->超时等待状态(TIME_WAITING)->终止状态(TERMINATED)
final关键字的总结
final关键字用在3个地方:变量、方法、类
-
对于一个final变量,如果是一个基本数据类型的变量,则其数值一旦初始化后就不能被更改;如果是引用类型的变量,则其初始化后不能再让其指向另一个对象。
-
当final修饰一个类时,表明这个类不能被继承。final类中的所有成员方法都会隐式地指定为final方法。
-
使用final原因:1、把方法锁定,以防任何继承类修改它的含义;2、效率,早期的java需要,现在的Java版本不需要使用final方法进行优化了。类中所有的private方法都隐式地指定为final了。
Java异常类层次结构图
共同的祖先时java.lang中的Throwable类。
两个重要的子类:Exception(异常)和Error(错误)
Error:是程序无法处理的错误,例如编写代码错误导致了jvm虚拟机运行出现问题。
Exception:是程序本身可以处理的异常, Exception 类有一个重要的子类 RuntimeException。RuntimeException 异常由Java虚拟机抛出。NullPointerException(要访问的变量没有引用任何对象时,抛出该异常)、ArithmeticException(算术运算异常,一个整数除以0时,抛出该异常)和 ArrayIndexOutOfBoundsException (下标越界异常)。
区别:异常可以被程序本身处理,错误是无法处理的。
Throwable类常用方法
-
public string getMessage():返回异常发生时的详细信息
-
public string toString():返回异常发生时的简要描述
-
public string getLocalizedMessage():返回异常对象的本地化信息。使用Throwable的子类覆盖这个方法,可以声称本地化信息。如果子类没有覆盖该方法,则该方法返回的信息与getMessage()返回的结果相同
-
public void printStackTrace():在控制台上打印Throwable对象封装的异常信息
-
try块:捕获异常。可以接0或者多个catch块,如果没有catch块,必须接一个finally块。
-
catch块:用于处理try块捕获的异常。
-
finally块:反正会执行(除下面的情况)。当try块或者catch块中遇到return语句,finally块将在方法返回之前执行。
在以下4种特殊情况下,finally块不会被执行:
-
在finally语句块第一行发生了异常。 因为在其他行,finally块还是会得到执行
-
在前面的代码中用了System.exit(int)已退出程序。 exit是带参函数 ;若该语句在异常语句之后,finally会执行
-
程序所在的线程死亡。
-
关闭CPU。
Java序列化中如果有些字段不想进行序列化,怎么办?
对于不想序列化的变量,使用transient关键字修饰(只能修饰变量,不能修饰类和方法)。
获取键盘输入常用的两种方法
1 一: 2 Scanner input = new Scanner(System.in); 3 String s = input.nextLine(); 4 input.close(); 5 二: 6 BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); 7 String s = input.readLine();

浙公网安备 33010602011771号