学习javay已经一个多月了,每次测试都有java知识点中相似又不同的关键字,方法等重要的知识点,所以这周又是归纳的一周,因为敲代码速度很慢,所以把老师的这些知识点重新敲了一遍,发现有的知识点确实忘了。
java知识点之“区别”
文章目录
- java知识点之“区别”
- 强类型/弱类型语言
- 布尔逻辑运算中&和&&
- while循环和do...while循环
- for循环和while/do...while循环
- 面向过程编程与面向对象编程的区别
- 成员变量和局部变量
- 构造方法和普通方法
- 抽象类abstract class 和接口interface
- final、finally和finalize
- String、StringBuffer、StringBuilder
- “”和null
- DateTimeFormat与DateFormat/SimpleDateFormat
- ArrayList、LinkedList、Vector
- List集合和Set集合
- HashSet和TreeSet
- HashMap、HashTable、TreeMap
- Collection、Collections、Connection
- RandomAccessFile与文件输入输出流
- 线程三种创建方式的区别
- ReentrantLock和synchronized
- wait()和sleep()
- POST和GET的区别
- mysql中char类型和varchar类型
- mysql中"%"和"_":都是占位符
强类型/弱类型语言
- Java是一门强类型语言,javascript是一门弱类型语言。Java任何的变量在定义时都必须显示的声明。
布尔逻辑运算中&和&&
- &称为逻辑与,在运算时不论运算符前面的表达式是否为true,始终都会执行运算符后面的表达式。
- &&称为短路与,在运算时,一旦运算符前面的表达式为false,则运算符后面的表达式就不再执行。
特别要在各表达式中涉及有相同变量时要注意变量是否发生改变的问题。
while循环和do…while循环
- while循环是先进行条件判断再执行循环体;而do…while先执行循环体在进行条件判断,因此while的循环体可能一次都没有执行,do…while的循环体则至少执行1次。
for循环和while/do…while循环
- for循环通常应用于循环次数已知的情况,while/do…while循环一般用于循环次数未知的情况。
面向过程编程与面向对象编程的区别
- 面向过程以函数(方法)为中心,面向对象以对象为中心。
成员变量和局部变量
- 成员变量:也称为全局变量(global variable),通常在类中直接定义,属于对象的管理范畴(通常使用由对象控制),作用范围在整个类中有效,属性也是一种成员变量。
- 局部变量:一般定义在方法内部,或者语句块内部(分支循环等)作用范围只在声明的区域内有效,方法中的参数也是局部变量。
注意
- **定义:**变量经声明后,在类加载时会自动初始化(赋初始值),而局部变量在声明后如果不进行初始化(赋值)则无法使用。
- 成员变量各类型默认初始值
整数:0,浮点型:0.0,布尔型:false,字符型:空格(不是”“),引用类型:null(该类型调用方法时注意空指针异常)- **访问修饰符问题:**局部变量不允许使用任何访问修饰符(private public protect)修饰
构造方法和普通方法
- 构造方法:是创建对象的同时执行,一般做一些对当前对象初始化的操作,常见的是为全局变量(属性)赋值,也可利用对象一经创造就执行构造器的特点做一些特殊操作。
- 普通方法:通常用于完成一些对当前对象的逻辑操作,这些操作一般是围绕全局变量进行展开,普通方法的调用一般是通过对象实例进行调用,静态方法(方法在定义时由stastic修饰)可通过类直接调用。
抽象类abstract class 和接口interface
**1.语义:**抽象类是一种不能创建实例(对象)的类;接口是一组未实现方法的集合,是一种标准,接口也无法实例化。
**2.所含成分:**抽象类内部可以包含普通类的所有成分,同时也支持抽象方法;接口只能包含抽象方法和常量(jdk8之后支持默认方法和静态方法)
**3.使用方式:**抽象类一般由子类继承,子类继承抽象类需要实现抽象方法,除非子类也是抽象类;接口一般由实现类通过implements实现,子类实现接口后需要实现接口中的所有抽象方法(包括父类接口)
实际开发中,接口的使用率会高于抽象类
final、finally和finalize
- **final关键字:**用于修饰类,变量和方法,被final修饰的类不允许被继承,被final修饰的变量不允许被修改,被final修饰的方法不可以被重写;
- **finally:**是异常中用于执行一些收尾操作的语句块,无论是否出现异常,finally中的代码始终会执行
- **finalize:**是Object中的方法,当一个对象被GC回收时会自动调用该方法,一般执行的是对当前对象的清理工作。
String、StringBuffer、StringBuilder
- **String:**是一个定长字符串,一旦赋值则内容固定,在对String进行修改重新赋值时,实际上都是在修改对象,因此在进行大量字符串拼接时,String效率非常低
- **StringBuffer:**是一个可变长度的字符串,内部提供了append,insertf等方法用于修改字符串中的内容,由于对象不会变更,因此在进行字符串拼接时效率高。
- 与StringBuilder的区别在于StringBuffer里面的所有方法都是线程安全的,在线程并发时由于锁的原因效率较低。
- **StringBuilder:**也是一个可变长的字符串,和StringBuffer共享相同的API(构造器,方法,属性相同),在单线程情况下,字符串拼接效率和StringBuffer一致;
- StringBuilder是线程不安全的可变长字符串,在多线程并发时效率高于StringBuffer。
“”和null
- 前者是空字符串,属于字符串的范畴,后者是空的意思,若是应用类型是这个状态则不可用它调用方法和属性和创建了对象不同,一旦创建对象就不为null尽管创建的对象各个属性都没初始化。
DateTimeFormat与DateFormat/SimpleDateFormat
- DateTimeFormat是线程安全的实现,在多线程并发的时候可以让多个线程使用同一当前实例,能保证数据的一致性;
- DateFormat是线程不安全的实现,因此在多个线程并发时,需要为每个线程单独创建该实例。
ArrayList、LinkedList、Vector
- **1.内部实现:**ArrayList,Vector是基于动态数组的实现;LinkedList是基于链表和双端队列的实现;
- **2.线程安全:**ArrayList和LinkedList都是非线程安全的实现;Vector是线程安全的实现内部方法都使用synchronized修饰;
- **3.存在时间:**ArrayList和LinkedList是jdk1.2新增集合框架的实现;Vector是老式的集合实现;
- **4.扩容方面:**ArrayList扩容时增长为原来长度的1.5倍;Vector扩容时增长为原来的2倍
List集合和Set集合
- List集合是一个有序的集合,内部元素存储顺序跟添加顺序一致,List集合允许重复元素,内部通过数组实现
- Set集合是基于Hash表(散列表)实现
HashSet和TreeSet
- HashSet是基于哈希表的实现,元素的存储顺序也是按照哈希地址排序,因此是否重复由哈希值确定
- TreeSet是基于二叉树-红黑树实现,元素的存储顺序根据元素实现的Comparable接口中的comparaTo实现排序,是否重复也是根据排序值判定
HashMap、HashTable、TreeMap
(实现方式++是否允许空值++线程是否同步)
- HashMap是基于Hash算法的实现,内部不通过数组结合链表实现;允许空值的存在;是线程不同步的实现
- TreeMap是基于红黑树的实现;内部元素的存储顺序是由自然顺序对键值进行排序之后存储;是线程不同步的实现
- HashTable是从老式的Drictionary类继承而来,内部的实现原理跟HashMap一样,不允许空键值存在;是线程同步的实现,运行效率较低。
Collection、Collections、Connection
- **Collection:**是jdk1.2之后新增的集合框架的顶层接口
- **Collections:**是一个用于对集合进行处理的工具类
- **Connection:**是在JDBXC中用于操作数据的一个连接接口
RandomAccessFile与文件输入输出流
- RandomAccessFile在进行文件操作的方式上与之前的输入输出流没有太大的区别,但是由于RandomAccessFile类从DataInput和DataOutput实现而来,因此,内部提供了对于原始数据类型的读写操作。
线程三种创建方式的区别
(扩展性++内部方法++启动方式)
- **继承Thread:**一旦继承Thread就无法再继承其他类,扩展性存在一定的影响;以直接创建的对象调用start()方法启动线程
- **实现Runnable接口:**类还可以再继承其他类或者实现其他接口,扩展性方面不受影响,run()方法不能抛出异常;启动线程还需要由Thread类启动
- **实现Callable接口:**实现的方法call()有返回值,还提供了泛型支持,并且call()方法允许抛出异常,一般用于并行计算,Callable接口需要有FutureTask包装并且被Thread启动
ReentrantLock和synchronized
- **1.本质:**ReentrantLock是一个实现类,而synchronized是一个关键字
- **2.锁的获取与释放:**ReentrantLock需要手动获取锁以及释放锁(粒度控制更细);synchronized自动加锁,临界区(synchronized锁住的区域)的代码执行完之后自动释放
- **3.支持锁类型:**ReentrantLock支持公平锁以及非公平锁;synchronized只支持非公平锁
- **4.应用情况:**synchronized一般用于少量代码同步,ReentrantLock一般用于大量的同步代码块
wait()和sleep()
- **1.来源:**sleep()是来自Thread类中的一个方法,wait()是属于Object类的方法
- **2.等待时长:**sleep()是限时等待,在等待的时限到达时自动恢复;而wait()是无限等待,必须要等到其他线程调用该对象上的notify()或者notifyAll()才能继续执行
- **3.是否需要对象锁:**sleep()使用时不需要持有对象锁,而wait()使用时必须确保当前线程持有该对象的对象锁,否则会有异常)(java.lang.illegalMonitorStateException)
POST和GET的区别
- post一般用于大量数据的提交,比如表单提交,文件上传等
- get一般用于获取服务端数据
- post提交的数据一般是在请求头封装,而不是直接在地址栏显示;get也可以用于数据提交,但是提交的内容是通过请求地址栏拼接,而地址栏长度限制在1024字节内
mysql中char类型和varchar类型
- char类型是定长字符串,类似于java中的String;长度一旦定义则无法改变,并且无论数据是否够指定长度,都会占满,不够的用空格填充;char类型一般应用于长度确定的字符串类型,比如:性别,手机号,身份证号等
- varchar类型是可变字符串,类似Java中StringBuffer;长度定义之后会根据实际填充的内容,选择占用多大的空间,比较节省空间;varchar类型一般使用在长度不确定的字符串类型,比如姓名,邮箱地址,评论信息等。
mysql中"%“和”_":都是占位符
- %用于匹配多个字符,"_"用于匹配一个字符
例如:
-- 查询名字中姓”李“的员工
select * from emp where ename like '李%';
-- 查询只有三个字姓”卡“的员工
select *from emp where ename like '卡__';