Life is not all beer and skittles. --dt

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%的性能提升,但是要冒多线程不安全的的风险。
总结:
  1. 操作少量的数据: 适用String
  2. 单线程操作字符串缓冲区下操作大量数据: 适用StringBuilder
  3. 多线程操作字符串缓冲区下操作大量数据: 适用StringBuffer

==与equals
==:它的作用是判断两个对象的地址是不是相等,即  判断两个对象是不是同一个对象
equal:它的作用也是判断两个对象是否相等,两种情况:
  1. 类没有覆盖equa()l的方法,等价于“==”
  2. 类覆盖了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()的相关规定

  1. 如果两个对象相等,则hashcode一定也是相同的
  2. 两个对象相等,对两个对象分别调用equals方法都返回true
  3. 两个对象有相同的hashcode值,它们也不一定是相等的
  4. 因此,equals 方法被覆盖过,则 hashCode 方法也必须被覆盖
  5. 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对象封装的异常信息
 
  1. try块:捕获异常。可以接0或者多个catch块,如果没有catch块,必须接一个finally块。
  2. catch块:用于处理try块捕获的异常。
  3. finally块:反正会执行(除下面的情况)。当try块或者catch块中遇到return语句,finally块将在方法返回之前执行。
在以下4种特殊情况下,finally块不会被执行:
  1. 在finally语句块第一行发生了异常。 因为在其他行,finally块还是会得到执行
  2. 在前面的代码中用了System.exit(int)已退出程序。 exit是带参函数 ;若该语句在异常语句之后,finally会执行
  3. 程序所在的线程死亡。
  4. 关闭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();

 

 
posted @ 2019-06-13 20:03  啦啦啦灬  阅读(134)  评论(0)    收藏  举报