JAVA基础

⾯向对象和⾯向过程对比

  1. ⾯向过程 :性能高。 因为类调⽤时需要实例化,⽐较消耗资源。
  2. ⾯向对象 :性能较低,易维护、易复⽤、易扩展。 因为⾯向对象有封装、继承、多态性的特性,所以可以设计出低耦合的系统。

Java 特点

  1. 简单易学
  2. ⾯向对象(封装,继承,多态)
  3. JVM 多平台运行
  4. 可靠性
  5. 安全性
  6. 支持多线程
  7. ⽀持⽹络编程并且很⽅便( Java 语⾔诞⽣本身就是为简化⽹络编程设计的)
  8. 编译与解释并存

JVM

虚拟机,字节码拓展名为.class,效率高,可以在KVM上运行。,java文件(源代码)通过javac编译为.class 字节码,然后通过JVM变为二进制机器码

JDK 和 JRE

  1. JDK 是 Java Development Kit,它是功能⻬全的 Java SDK。它拥有 JRE 所拥有的⼀切,还有编译器 (javac)和⼯具(如 javadoc 和 jdb)。它能够创建和编译程序。
  2. JRE 是 Java 运⾏时环境。它是运⾏已编译 Java 程序所需的所有内容的集合,包括 Java 虚拟机 (JVM),Java 类库,java 命令和其他的⼀些基础构件。但是,它不能⽤于创建新程序。

Java 和 C++的区别

  1. 都是⾯向对象的语⾔,都⽀持封装、继承和多态
  2. Java 不提供指针来直接访问内存,程序内存更加安全 Java 的类是单继承的,C++ ⽀持多重继承;
  3. 虽然 Java 的类不可以多继承,但是接⼝可以多继 承。
  4. Java 有⾃动内存管理机制,不需要程序员⼿动释放⽆⽤内存
  5. 在 C 语⾔中,字符串或字符数组最后都会有⼀个额外的字符‘\0’来表示结束。但是,Java 语⾔ 中没有结束符这⼀概念。java string 提供length 值。

Java 程序的主类 应⽤程序和⼩程序的主类有何不同(mark)

⼀个程序中可以有多个类,但只能有⼀个类是主类。在 Java 应⽤程序中,这个主类是指包含 main()⽅法的类。⽽在 Java ⼩程序中,这个主类是⼀个继承⾃系统类 JApplet 或 Applet 的⼦ 类。应⽤程序的主类不⼀定要求是 public 类,但⼩程序的主类要求必须是 public 类。主类是 Java 程序执⾏的⼊⼝点。

Java 应⽤程序与⼩程序之间有哪些差别(mark)

简单说应⽤程序是从主线程启动(也就是 main() ⽅法)。applet ⼩程序没有 main() ⽅法,主要 是嵌在浏览器⻚⾯上运⾏(调⽤init()或者run()来启动),嵌⼊浏览器这点跟 flash 的⼩游戏类 似。

字符型常量和字符串常量的区别(mark)

  1. 形式上: 字符常量是单引号引起的⼀个字符; 字符串常量是双引号引起的若⼲个字符
  2. 含义上: 字符常量相当于⼀个整型值( ASCII 值),可以参加表达式运算; 字符串常量代表⼀个地 址值(该字符串在内存中存放位置)
  3. 占内存⼤⼩ 字符常量只占 2 个字节; 字符串常量占若⼲个字节 (注意: char 在 Java 中占两 个字节) 基本类型储存空间大小固定,更具可移植性

重载和重写

重载(overload)

  1. 同一个类中,多个方法名相同,但参数类型不同、个数不同、顺序不同。
  2. ⽅法返回值和访问修饰符 可以不同。
  3. overloading resoultion(重载解析)过程,编译器对方法进行匹配。

重写(overwrite)

  1. 发⽣在运⾏期,是⼦类对⽗类的允许访问的⽅法的实现过程进⾏重新编写。
  2. 返回值类型、⽅法名、参数列表必须相同,抛出的异常范围⼩于等于⽗类,访问修饰符范围⼤于 等于⽗类。
  3. 如果⽗类⽅法访问修饰符为 private/final/static 则⼦类就不能重写该⽅法,但是被 static 修饰的⽅法能够被再次声明。
  4. 构造⽅法⽆法被重写

Constructor 不能被 override(重写),但是可以 overload(重载),所以你可以看到⼀个类中有多个 构造函数的情况。

⾯向对象三⼤特性: 封装 继承 多态

封装 Encapsulation

封装把⼀个对象的属性私有化,并提供get和set 方法。

继承 Inheritance

  1. 当两个类具有相同的属性和方法时,可以将相同的部分抽取出来放到一个类中作为父类,其它两个类继承这个父类。
  2. 继承后子类自动拥有了父类的属性和方法,另外子类可以写自己特有的属性和方法,及命名与父类同名的成员变量。
  3. 子类也可以重写父类的方法
  4. 父类的私有属性和构造方法并不能被继承。
  5. 子类不能继承父类中访问权限为private的成员变量和方法。
  6. protected对外隐藏,仍然允许子类的成员来访问它们。

多态 Polymorphism

实现多态有三个必要条件

  1. 继承:在多态中必须存在有继承关系的子类和父类。
  2. 重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
  3. 向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。

String类

为什么String不可变

  1. String 类中字符串是由final修饰字符数组保存。
  2. Java9 之后该用byte数组保存

StringBuffer 和 StringBuilder 的区别(mark)

  1. 都是继承AbstractStringBuilder,父类变量不用final所以可变
  2. 都是调用父类构造方法

线程安全

  1. String不可变,线程安全
  2. buffer加了同步锁,线程安全
  3. builder无同步锁,非线程安全

性能

  1. 每次更改string对象时,都会新建一个然后改变指针指向。适合少量数据。
  2. buffer和builder都是直接对本身进行操作。
  3. builder线程不安全,相对于buffer有10%左右性能提升,适合单线程。
  4. buffer适合多线程。

⾃动装箱与拆箱(mark)

https://www.cnblogs.com/dolphin0520/p/3780005.html

150.逆波兰表达式求值

1
2
3
4
5
6
有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,
也可以是另一个逆波兰表达式。

说明:
整数除法只保留整数部分。给定逆波兰表达式总是有效的。
换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
阅读更多

四则运算表达式

表达式可以分为三种

前缀表达式 中缀表达式 后缀表达式
+ 1 2 1+2 1 2 +
+ 2 * 3 4 2 + 3 * 4 2 3 4 * +
+ 9 * - 4 1 2 9 + (4 - 1) * 2 9 4 1 - 2 * +
阅读更多

常见误区

常见误区

  1. 线程越多是否效率越高?
    否!线程切换时需要将线程数据保存读取,会消耗大量资源。
阅读更多

Java版本

JDk1.1

新技术:JAR文件格式,JDBC,JavaBeans,RMI。
新语法:内部类(Inner Class) 和反射(Reflection).

JDK1.2

技术体系拆分:桌面开发J2SE,企业级开发J2EE,移动端开发(J2ME)。
新技术:EJB,Java Plug-in,Java IDE,Swing等。
虚拟机:新内置JIT编译器
其它:stricfp 关键字和Collection集合类

JDK1.3

其它:类库改进,Java 2D 新API, 新JavaSound类库

JDK1.4

新技术:正则表达式,异常链,NIO,日志类,XML解析器,XSLT转换器

JDK1.5

主要为语法易用性改进
新语法:自动装箱,泛型,动态注解,枚举,可变长参数,遍历循环(foreach)
虚拟机和API:内存模型改进,java.util.comcurrent 并发包

JDK1.6

新技术:动态语言支持,API微型HTTP服务器API
虚拟机:锁与同步,垃圾收集,类加载

JDK1.7

新技术:新G1收集器,加强非Java语言调用支持,升级类加载架构

[跳至JVM目录] [跳至Java目录]