Java语法汇总一(NK)(更新至2021.10.25)

汇总二链接:Java语法汇总二(NK)

目录

1. 父类子类的初始化过程

2. 类实现接口的原则

3. String字符串的length()和字符串数组的length

4. Java的真数组

5. 方法重写 vs 方法重载

6. Java的几大常见算法

7. Map接口有两个经典的子类: HashTable,HashMap

8. 关键字volatile和synchronized的对比

9. Math工具类的使用

10. String字符串类的相关方法

11. final, finally, finalize的区别

12. ArrayList ,LinkedList 和 Vector 的区别

13. Java的保留字/关键字

14. 哪些常见类可以被继承,哪些不可以被继承?

15. 装箱和拆箱:发生在基本数据类型和包装类之间

16. 区分:实例变量,局部变量,类变量,final变量

17. 算术运算的知识点

18. 外部类 VS 内部类

19. 线程的几个方法/状态

20. 代码优化的3种方式

21. java, javac, javadoc,jdb,javaprof的区别

22. this() 和 super()

23. forward 和 redirect 的区别

24. equals()和hashCode()的区别

25. 常见的线程安全的类和线程不安全的类

26. << 左移位,>>右移位,>>>无符号右移位

27. StringBuffer的 length() 和 capacity()

28. Lambda表达式的作用和组成部分

29. 客户端和服务端创建连接对象(Socket)

30. System.out.println()各个部分的含义

31. 动态类型语言 VS 静态类型语言

32. Switch语句的控制表达式类型有哪些

33. Collection和Collections的区别

34. HttpServletRequest对象常用方法

35. JDK用于并发编程的同步器有哪些

36. Java创建对象的几种方式

37. Java 类加载器ClassLoader

38. 自动类型转换的规则

39. 字符串的拼接 +

40. Java的体系结构包含4个独立但相关的技术


1. 父类子类的初始化过程

(1)父类中的静态成员变量和静态代码块

(2)子类中的静态成员变量和静态代码块

(3)main()方法

(4)父类的普通成员变量和代码块,再执行父类的构造方法

(5)子类的普通成员变量和代码块,再执行子类的构造方法

2. 类实现接口的原则

(1)必须实现接口中的所有方法

方法的名字+参数的个数和类型+返回值类型都必须与接口中的完全一致。

(2)接口实现类相当于子类,子类的访问权限不能小于父类

接口中所有方法默认是public,所以实现类的修饰符(访问权限)必须是public。

(3)接口中的变量,默认都是常量。要么不写,要么只能是public static final中的一个或者多个来修饰。即接口中的变量是静态的,最终的常量,相当于全局常量。

补:

接口中字段的修饰符: public static final (默认不写)

接口中方法的修饰符:public abstract(默认不写)

3. String字符串的length()和字符串数组的length

(1)String.length()返回的是字符数。比如String str = "你好呀!"的str.length()返回4。

若要返回字节数,用 str.getBytes("GBK").length. 如果是GBK,一个中文字符占2字节,如果是UTF-8, 一个中文字符占3字节。

4. Java的真数组

真数组:数组元素在内存中是一个接一个线性存放的,通过第一个元素就能访问随后的元素,避免了数据覆盖的可能性,数据覆盖和数据类型覆盖并没有关系。

数组越界会对内存中其他的数据产生覆盖,造成程序崩溃。

Java中做了下标检测,所以不会出现数组越界,也就避免了数据覆盖。

5. 方法重写 vs 方法重载

5.1 方法重写:2同1大2小

重写通常出现在子类和父类之间,即子类重写父类的方法:

(1)参数类型相同

(2)方法名相同

(3)子类访问权限大于等于父类方法访问权。(大)

(4)子类返回类型小于等于父类方法返回类型。(小)

(5)子类抛出异常小于等于父类方法抛出异常。(小)

重写方法能够抛出任何非强制异常,无论被重写方法是否抛出异常。但是,重写方法不能抛出新的强制性异常,不能抛出比被重写方法声明的更广泛的强制性异常。

补充:

---父类的成员方法只能被它的子类重写。

---声明为final的方法不能被重写。

---声明为static的方法不能被重写,但是能够被再次声明。

---如果子类和父类在同一个包中,那么子类可以重写父类的所有方法,包括private和final的。

---如果子类和父类不在同一个包中,那么子类只能重写父类的public和protected的非final的方法。

---构造方法不能被重写,只能被子类调用。

---如果不能继承一个方法,则不能重写这个方法。

5.2 方法重载

通常出现在同一个类中:

(1)方法名相同。

(2)参数个数或类型或顺序不同。

(3)可以改变返回类型。无法以返回值类型作为重载函数的区分标准。

(4)可以改变访问修饰符。

(5)可以声明新的或者更广的检查异常。

(6)方法只能够在同一个类中或者在一个子类中被重载。

6. Java的几大常见算法

Java几种常见的排序算法(复杂度,算法简介,代码实现)

7. Map接口有两个经典的子类: HashTable,HashMap

相同点:都实现了Map接口

不同点:

(1)HashTable:

线程安全 synchronized

不支持key和value为null,key不能重复,value可以重复

使用Enumeration迭代器

(2)Hashmap:

线程非安全 非synchronized

支持key和value为null,key不能重复,value可以重复

使用Iterator迭代器

补充:

(1)HashMap无序,LinkedHashMap按添加元素顺序,TreeMap按自然顺序。

HashSet无序(按照哈希值来存),LinkedHashSet按添加顺序排序,TreeSet自然排序。

(2)HashMap由数组+链表组成的。数组是HashMap的主体, 链表则是主要为了解决哈希冲突而存在的。

8. 关键字volatile和synchronized的对比

(1)volatile是线程同步的轻量级实现,所以比synchronized要好,并且只能修饰变量。而synchronized可以修饰方法和代码块,不修饰变量。

(2)多线程访问volatile不会发生阻塞,而synchronized会出现阻塞。

(3)volatile能保证数据的可见性,但不能保证原子性。volatile的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。

synchronized可保证原子性,间接保证可见性,因为它会将私有内存和公共内存中的数据做同步。

(4)volatile解决的是变量在多线程之间的可见性,而synchronized解决的是多线程之间资源同步问题。

9. Math工具类的使用

(1)Math.floor(x): 返回小于等于x的最接近整数,类型为double。比如:Math.floor(-8.5)返回(double)-9.0

(2)Math.ceil():

(3)Math.round:

10. String字符串类的相关方法

(1)String.toLowCase(): 字符串转为小写。

记住,这个方法会重新new 一个String()对象, 用等号跟其他字符串比较时,容易错(不同对象,不同地址)。

(2)String.replaceAll(正则式,要替换成的字符/串):将正则表示的字符或字符串,替换成第二个参数。

记住:正则表达式对于特殊符号的表达,比如str.replaceAll(".", "/")会将str中所有单个字符都换成/ (因为正则中, . 表示的是任一字符),如果要替换str中的.,则要写成str.replaceAll("\.", "/")。

11. final, finally, finalize的区别

(1)final: 可用于声明属性,方法和类

1)final 声明属性

final属性不可变,指的是引用不可变,而不关心指向对象的内容是否可变。

final修饰的变量必须初始化。

final修饰的成员变量为基本数据类型时,在赋值之后无法改变。为引用数据类型时,在赋值后其指向地址无法改变,但是对象内容还是可以改变的。

final修饰的成员变量在赋值时,可以有三种方式:在声明时直接赋值,在构造器中赋值,在初始代码块中赋值。

2)final 声明方法

final方法不可被子类重写,可以实现inline内联机制。

3)final声明类

final类不可被继承,所有方法不可以被重写,但其内的非final变量可以被修改。

(2)finally:  作为异常处理的一部分,只能用在try/catch语句中,并附带一个语句块,语句块里的内容最终一定被执行(特殊情况:不一定会被执行,比如try语句前出现异常或者try中出现的异常没有被捕获?或者在try或者catch中有System.exit()时,不执行finally块)。

一旦finally块中使用了return或throw语句,将会导致try块,catch块中的return或throw语句失效。

finally经常被用在需要释放资源或是释放锁的情况下。

(3)finalize:  Object类的一个方法,在垃圾回收器执行时会调用被回收对象的finalize()方法,可以覆盖此方法类实现对其他资源的回收 (一旦垃圾回收器准备好释放对象占用的空间,将首先调用该方法,并在下一次垃圾回收动作发生时,才会真正回收对象占用的内存)。

关于判断一个对象objA是否可回收,需要经历两次标记过程(详解略)

12. ArrayList ,LinkedList 和 Vector 的区别

(1)ArrayList实现了基于动态数组的数据结构。LinkedList是基于链表的数据结构。

(2)对于随机访问get和set,ArrayList优于LinkedList,因为后者要迭代器。

(3)对于新增和删除add和remove, ArrayList劣于LinkedList,因为前者要移动数据。

(4)对于空间浪费,

ArrayList主要体现在list列表的结尾预留一定的容量空间,空间增长率是1.5倍,最后可能留下一部分空间无用。

LinkedList的空间花费体现在它的每个元素都要消耗相当的空间,即每个节点都需要额外的指针。

13. Java的保留字/关键字

50个关键字(goto, const保留字,尚未使用)+ 3个值(true, false, null)。

14. 哪些常见类可以被继承,哪些不可以被继承?

(1)可以被继承: Thread,Number, ClassLoader

(2)不可以被继承(final类):Double, Math,String

15. 装箱和拆箱:发生在基本数据类型和包装类之间

也称之为发生在引用类型和值类型之间。

(1)装箱:基本数据类型 -> 包装类,比如 int -> Integer

(2)拆箱:包装类 -> 基本数据类型

(3)基本类型和包装类进行“==”运算时,包装类会自动拆箱变成基本类型,然后再比较。

(4)两个包装类进行“==”运算,比如Integer,如果其值在-128到127之间,那么如果值相等,则结果为true. 否则返回false。

(5)两个包装类进行equals比较,首先equals()会比较类型,如果类型相同,则继续比较值,如果值也相同,返回true。如果类型不同,则直接返回false。

(6)包装类用equals(),但是参数是基本类型,这时先回进行自动装箱,基本类型转为包装类后,再按照(5)比较。

16. 区分:实例变量,局部变量,类变量,final变量

(1)实例变量:即成员变量(直接在类中,在方法外),如果没有初始化不报错,自动分配默认值

(2)局部变量:方法中定义的变量,需要初始化,否则报错

(3)类变量:用static修饰的变量(直接在类中,在方法外),类可以直接通过类名. 来调用

(4)final变量:用final修饰的变量,即常量

17. 算术运算的知识点

(1)当字符型和整型运算时,会自动转换为整型(注意区别于:字符串+整型),即转换为该字符的ASCII值。如‘a’=1/3报错,因为'a'会转换为97,是常量,常量给常量赋值,编译报错。'A'%3,可以运行,不会报错。

(2)Java的取模(取余)运算,支持浮点数。

(3)多种混合计算时,自动将所有数据类型转换为容量最大的那个类型。比如 100%3,得到1.0。

(4)取模运算中,余数的符号跟被除数的符号相同。

(5)JAVA的赋值运算是有返回值的,赋了什么值就返回什么值。所以赋值用在if的条件中时,注意跟等号区分。

(6)ceil()天花板数,向上取整。floor()地板数,向下取整。保持数据符号不变,类型不变。

18. 外部类 VS 内部类

(1)外部类:只能用public, abstract, final来修饰,不能用static修饰。

(2)内部类:可以用public, default, protected, private修饰,也可以用static修饰 。

补:

(1)声明非静态内部类对象的方法:外部类名.内部类名 对象名=new 外部类名( ).new 内部类名( );

注意:右边需要创建外部类的对象

(2)声明静态内部类对象的方法:外部类名.内部类名 对象名=new 外部类.内部类名( );

注意:右边不需要创建外部类对象

关于内部类,可以看该文第75点:Java语法汇总二(NK)

19. 线程的几个方法/状态

(1)sleep():让线程进入睡眠状态,睡眠指定的时间后再执行。

(2)wait():让线程进入等待状态,等待别的线程执行notify()或notifyAll()唤醒后继续执行。

(3)start():让线程进入就绪状态,得到CPU时间就执行。

(4)run():线程的具体逻辑方法,执行完线程就结束。

不同优先级的线程间是抢先式的,而同级线程间是轮换式的。

Thread.sleep()和Object.wait()都可以抛出interruptedException. 这个异常不能忽略,因为它是一个检查异常(checked exception)。

补:

(5)thread.join():把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如:在线程B中调用了线程A的join()方法,直到线程A执行完毕后,才会继续执行线程B余下的语句。即,join()用于在主线程中临时加入线程,只有当加入的线程执行完毕,主线程才能获得CPU执行权,join()下面的语句才能执行。

20. 代码优化的3种方式

(1)局部优化:在只有一个入口+一个出口的基本程序块上进行的优化。

(2)全局优化:在整个程序范围内进行的优化。

(3)循环优化:对循环中的代码进行的优化。

        代码外提

        强度削弱

        删除归纳变量

补:删除多余运算:使生成的目标代码减少而执行速度较快,不是专门针对循环优化的。

21. java, javac, javadoc,jdb,javaprof的区别

(1)javac 用来识别代码

(2)javadoc 用来识别注释

(3)jdb 调试器

(4)javaprof 剖析工具

22. this() 和 super()

(1)作用:在JVM堆中构建一个对象,可以因此避免多次创建对象。

同一个方法内只能调用一次this()或super() (两者只能出现一个)。

同时,为了避免操作对象时对象还未构建成功,需要将this()和super()的调用放在第一行实现,以此来创建对象,防止异常。

(2)super, this关键字和super(), this()不是一回事。

super, this关键字表示当前调用者的父类与其本身。

super(), this()是为了构造器之间的相互调用。

(3)问题:一个类的构造器能否调用这个类中的其他构造器?

答:能。this()调用本类构造器,super()调用父类构造器。

(4)this()和super()都指向对象,所以均不可在static环境(static变量,方法,语句块)中使用,因为static的类第一次加载时就定了,此时对象可能还不存在,因此矛盾,会报错。

23. forward 和 redirect 的区别

(1)从地址栏显示来说

forward:是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪里来的,所以它的地址栏还是原来的地址。是内部重定向。

redirect:是服务器端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,所以地址栏显示的是新URL。是外部重定向。

(2)从数据共享来说

forward:转发页面和被转发的页面可以共享request里面的数据。

redirect:不能共享数据。

(3)从运用地方来说

forward:一般用于用户登录的时候,根据角色转发到相应的模块。 

redirect:一般用于用户注销登录时,返回主页面和跳转到其他的网站等。

(4)从效率来说

forward:高

redirect:低

24. equals()和hashCode()的区别

(1)两者的作用其实是一样的,在Java里都是用来对比两个对象是否相等。

(2)equals()相等的两个对象,他们的hashCode()肯定相等,也就是equals()对比是绝对可靠的。

反之,hashCode()相等的两个对象,他们的equals()不一定相等,即hashCode()不是绝对可靠的。

25. 常见的线程安全的类和线程不安全的类

(1)线程安全

---Vector

---StringBuffer

---Properties:实现了Map接口。

---HashTable:实现了Map接口,用synchronized对整张表进行加锁。 

---CibcurrentHashMap: 使用ReentrantLock来保证线程安全,分段加锁。

---ConcurrentHashMap:线程安全的HashMap的实现,将Hash表分为16桶(segment),每次只对需要的桶进行加锁。

---Collections:提供了synchronizedXxx()方法,可以将制定的集合包装成线程同步的集合。

比如:List list = Collections.synchronizedList(new ArrayList()),

Set set = Collections.synchronizedSet(new HashSet()); 

Map map = Collections.synchronizedMap(new HashMap());

(2)线程不安全

---HashMap:实现了Map接口

---TreeMap

---HashSet

---ArrayList

---StringBuilder

---SimpleDateFormat

26. << 左移位,>>右移位,>>>无符号右移位

(1)<<左移位:使指定值的所有位都左移规定的次数。m<<n 表示把数字m在无溢出的前提下乘以2的n次方。

(2)>>右移位: 5>>2表示右移位2位,即相当于5除以2的2平方

(3)>>>无符号右移位:无符号右移,高位用0填充,0001右移两位得0000

27. StringBuffer的 length() 和 capacity()

(1)length():返回当前长度

(2)capacity():设x为初始化长度,y为实际length()。

当y<x时,容量为x

当x<y<2*x+2时,容量为2*x+2

当y>2*x+2时,容量为实际长度y

28. Lambda表达式的作用和组成部分

(1)主要作用:代替匿名内部类的繁琐语法

(2)三部分组成:

形参列表:允许省略形参类型,如果形参列表只有一个参数,则圆括号可以省略。

箭头: ->  (不是=>),即英文中划线和大于号组成。

代码块:如果代码块只包含一条语句,则可省略花括号。如果Lambda代码块只有一条return语句,甚至可以省略关键字return。

29. 客户端和服务端创建连接对象(Socket)

Socket: 套接字

(1)客户端:Socket提供的实例 Socket client = new Socket(IP地址,端口号) ,以此来创建通信的Socket对象。

(2)服务器端:ServerSocket提供的实例 SocketServer server = new SocketServer(端口号),以此来创建TCP连接对象。

(3)监听服务器连接:client = server.accept()。 即服务器通过TCP连接对象server,调用accept()方法,来创建通信的Socket对象。

其中,IP地址用字符串形式,端口用数值形式。

30. System.out.println()各个部分的含义

(1)System是java.lang中的一个类

(2)out是System内的一个成员变量,这个变量是一个java.io.PrintStream类的对象

(3)println()是一个方法

31. 动态类型语言 VS 静态类型语言

(1)动态类型语言

是指在运行期间才去做数据类型检查的语言。

也就是,在动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一个赋值给变量的时候,在内部将数据类型记录下来。比如JS中,var a = 123 (没指定数据类型)。

(2)静态类型语言

与动态类型语言相反。

它的数据类型是在编译期间检查的,也就是说在写程序时就要声明所有变量的数据类型。典型代表:C, C++, JAVA, C#。

32. Switch语句的控制表达式类型有哪些

(1)允许: char, short, int, long, 枚举类型,String(Java7开始)。

(2)不允许:float, double, boolean

33. Collection和Collections的区别

(1)java.util.Collection

是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。

Collection接口在Java类库中有很多具体实现。为各种具体的集合提供了最大化统一操作方式。

(2)java.util.Collections

是一个包装类。它包含有各种有关集合操作的静态多态方法。

此类不能实例化,就像一个工具类,服务于Java的Collection框架。

34. HttpServletRequest对象常用方法

(1)Cookies[] getCookies():返回一个数组,包含客户端发送该请求的所有Cookie对象。

(2)Object getAttribute(String name):以对象形式返回已命名属性的值,如果没有给定名称的属性存在,则返回null。

(3)String getHeader(String name):以字符串形式返回指定的请求头的值。Cookie也是头的一种。

(4)String getParamater(String name):以字符串的形式返回请求参数值,或者如果参数不存在,则返回null。注意:参数的编码,由客户端浏览器和Web容器配置共同决定。即,编码格式由浏览器决定,浏览器根据html中指定的编码格式进行编码,tomcat容器根据指定的格式进行解码,另外get请求和post请求对编码格式的处理也不同。

35. JDK用于并发编程的同步器有哪些

(1)什么是同步器:一些使线程能够等待另一个线程的对象,允许它们协调动作。

(2)最常用的同步器有:CountDownLatch, Semaphore,

(3)不常用的同步器有:Barrier, Exchanger

36. Java创建对象的几种方式

(1)new 语句:最常用, 调用了构造方法。

(2)使用反射的Class类的newInstance()方法:调用了构造方法。

(3)使用反射的Constructor类的newInstance()方法:调用了构造方法。

(4)调用对象克隆 clone()方法:没有调用构造方法。

(5)运用反序列化手段,调用java.io.ObjectInputStream反序列化对象的 readObject() 方法:没有调用构造方法。

37. Java 类加载器ClassLoader

(1)Java默认提供三个ClassLoader:

BootStrap ClassLoader, Extension ClassLoader, App ClassLoader

(2)ClassLoader使用双亲委托模型来搜索类。

(3)JVM在判定两个class是否相同时,不仅要判断类名是否相同,还要判断是否由同一个类加载器实例加载的。

(3)ClassLoader就是用来动态加载class文件到JVM内存当中的

38. 自动类型转换的规则

39. 字符串的拼接 +

(1)字面量的"+"拼接:是在编译期间进行的,拼接后的字符串存放在字符串池中。

(2)字符串引用的"+"拼接:是在运行时进行的,新创建的字符串存放在堆中。

40. Java的体系结构包含4个独立但相关的技术

(1)Java程序设计语言

(2)Java.class文件格式

(3)Java应用编程接口 API

(4)Java虚拟机

四者的关系:

当我们编写并运行一个Java程序时,就同时运用了这四种技术。用Java程序设计语言编写源代码,把它编译成Java.class文件格式,然后在Java虚拟机中运行class文件。当程序运行的时候,它通过调用class文件实现了Java API的方法来满足程序的Java API调用。

猜你喜欢

转载自blog.csdn.net/sulia1234567890/article/details/120816640