牛客网Java基础题的一些知识点总结

牛客网Java基础题的一些知识点总结

java中的byte,short,char进行计算时都会提升为int类型

1.静态内部类才可以声明静态方法
2.静态方法不可以使用非静态变量
3.抽象方法不可以有函数体

栈:临时变量,存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中
堆:存放用new产生的数据
静态域:存放在对象中用static定义的静态成员
常量池:存放常量
非RAM存储:硬盘等永久存储空间

父类静态变量→父类静态代码块→子类静态变量→子类静态代码块→父类非静态变量→父类非静态代码块→父类构造函数→子类非静态变量→子类非静态代码块→子类构造方法

1.每调用一次构造方法,则执行一次构造块
2.静态块只在类加载的时候加载一次
3.有多个静态变量或块时,按声明顺序加载

Java一律采用Unicode编码方式,每个字符无论中文还是英文字符都占用2个字节。
Java的class文件编码为Unicode编码(具体说是UTF-16编码),而虚拟机JVM编码为UTF-16 。
UTF-8编码下,一个中文占3个字节,一个英文占1个字节。
Java中的char默认采用Unicode编码,所以Java中char占2个字节 。

UTF-16比较好理解,就是任何字符对应的数字都用两个字节来保存。
当用UTF-8时表示一个字符是可变的,有可能是用一个字节表示一个字符,也可能是两个,三个.当然最多不能超过3个字节了.反正是根据字符对应的数字大小来确定.

抽象类
特点:
1.抽象类中可以构造方法
2.抽象类中可以存在普通属性,方法,静态属性和方法。
3.抽象类中可以存在抽象方法。
4.如果一个类中有一个抽象方法,那么当前类一定是抽象类;抽象类中不一定有抽象方法。
5.抽象类中的抽象方法,需要有子类实现,如果子类不实现,则子类也需要定义为抽象的。
接口
1.在接口中只有方法的声明,没有方法体。
2.在接口中只有常量,因为定义的变量,在编译的时候都会默认加上
public static final
3.在接口中的方法,永远都被public来修饰。
4.接口中没有构造方法,也不能实例化接口的对象。
5.接口可以实现多继承
6.接口中定义的方法都需要有实现类来实现,如果实现类不能实现接口中的所有方法
7.则实现类定义为抽象类。

基本数据类型之间除了boolean,其他数据类型之间可以任意的相互转换(强制转化或默认转换)

math.ceil和math.floor返回值类型都是double //特殊值为0时 0.0和-0.0
math.round有重载,返回值类型可以是long或int

使用反射可以看出子类是继承了父类的私有方法的(不管是否是final),只是直接调用父类的私有方法是不可以的,但是利用反射的方式可以调用。字段同理。

泛型仅仅是java的语法糖,它不会影响java虚拟机生成的汇编代码,在编译阶段,虚拟机就会把泛型的类型擦除,还原成没有泛型的代码,顶多编译速度稍微慢一些,执行速度是完全没有什么区别的.

main()函数即主函数,是一个前台线程,前台进程是程序中必须执行完成的,而后台线程则是java中所有前台结束后结束,不管有没有完成,后台线程主要用与内存分配等方面。

客户端通过new Socket()方法创建通信的Socket对象,服务器端通过new ServerSocket()创建TCP连接对象,通过accept()方法接受客户端的请求,并返回一个socket对象。

对Integer对象,JVM会自动缓存-128~127范围内的值,所以所有在这个范围内的值是相等的。
基本数据类型与包装类进行==操作时,包装类会自动拆包装(调用intValue()方法),然后进行值比较。

流媒体技术是一种可以使音频,视频和其他多媒体信息在 Internet 及 Intranet 上以实时的,无需下载等待的方式进行播放的技术。
流媒体又叫流式媒体,它是指商家用一个视频传送服务器把节目当成数据包发出,传送到网络上。

构造方法调用有两种情况:1、在本类中,其他构造方法可以通过this调用该构造方法来初始化。2、在子类中的构造方法方法中可以通过super来调用。

application对象是共享的,多个用户共享一个,以此实现数据共享和通信

中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源。中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。是连接两个独立应用程序或独立系统的软件。相连接的系统,即使它们具有不同的接口,但通过中间件相互之间仍能交换信息。执行中间件的一个关键途径是信息传递。通过中间件,应用程序可以工作于多平台或OS环境。

原子性-事务管理子系统。一致性-完整子系统。隔离性-并发控制子系统。持久性-恢复管理子系统

JVM保证在一个对象所占用的内存被回收之前,如果它实现了finalize方法,则该方法一定会被调用。Object的默认finalize什么都不做,为了效率,GC可以认为一个什么都不做的finalize不存在。
(简单来说,中间件并不能提高内核的效率,一般只是负责网络信息的分发处理)
中间件特点的描述:

  1. 中间件应支持标准的协议和接口
  2. 中间件可运行于多种硬件和操作系统平台上
  3. 跨越网络,硬件,操作系统平台的应用或服务可通过中间件透明交互

JSP内置对象作用:
1、pageContext 表示页容器 EL表达式、 标签 、上传
2、request 服务器端取得客户端的信息:头信息 、Cookie 、请求参数 ,最大用处在MVC设计模式上
3、response 服务器端回应客户端信息:Cookie、重定向
4、session 表示每一个用户,用于登录验证上
5、application 表示整个服务器
6、config 取得初始化参数,初始化参数在web.xml文件中配置
7、exception 表示的是错误页的处理操作
8、page 如同this一样,代表整个jsp页面自身
9、out 输出 ,但是尽量使用表达式输出

java语言的下面几种数组复制方法中,System.arraycopy>clone>Arrays.copyOf>for循环

JMX(Java Management Extensions,即Java管理扩展)是在哪一个JDK版本开始支持 1.3

包的作用
1 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。
2 如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包 中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区 别。因此,包可以避免名字冲突。
3 包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。
package必须放在import的前面

链接:https://www.nowcoder.com/questionTerminal/29c74dd837124f2e895de47fb7c345b6
来源:牛客网

关于抽象类
JDK 1.8以前,抽象类的方法默认访问权限为protected
JDK 1.8时,抽象类的方法默认访问权限变为default

关于接口
JDK 1.8以前,接口中的方法必须是public的
JDK 1.8时,接口中的方法可以是public的,也可以是default的
JDK 1.9时,接口中的方法可以是private的

JSP 四大作用域: page (作用范围最小)、request、session、application(作用范围最大)。

存储在application对象中的属性可以被同一个WEB应用程序中的所有Servlet和JSP页面访问。(属性作用范围最大)
存储在session对象中的属性可以被属于同一个会话(浏览器打开直到关闭称为一次会话,且在此期间会话不失效)的所有Servlet和JSP页面访问。
存储在request对象中的属性可以被属于同一个请求的所有Servlet和JSP页面访问(在有转发的情况下可以跨页面获取属性值),例如使用PageContext.forward和PageContext.include方法连接起来的多个Servlet和JSP页面。
存储在pageContext对象中的属性仅可以被当前JSP页面的当前响应过程中调用的各个组件访问,例如,正在响应当前请求的JSP页面和它调用的各个自定义标签类。 

封装性属性要私有,并不是仅仅有get,set方法,要是属性是public外界就可以随意访问了。
方法可以和类同名,和构造器区别在于必须要有返回值类型 。

public Method[] getDeclaredMethods()返回类或接口声明的所有方法,包括public, protected, default (package) 访问和private方法的Method对象,但不包括继承的方法。当然也包括它所实现接口的方法。
public Method[] getMethods()返回类的所有public方法,包括其继承类的公用方法,当然也包括它所实现接口的方法。

public外部类必须与文件名相同,这样的类有且只有一个,public 内部类 名字不与文件名相同。

super.getClass().getName()
返回:包名+类名

被fianl修饰的变量不会自动改变类型,当2个final修饰相操作时,结果会根据左边变量的类型而转化。

Math的三个取整方法的返回值:floor和ceil返回double类型,round返回long类型
final修饰的方法为终态方法,不能被重写。而继承抽象类,必须重写其方法。
Object的getClass作用是返回的是运行时的类的名字。这个运行时的类就是当前类,所以
super.getClass().getName()
返回的是test.SuperTest

方法重写应遵循“两同两小一大”原则:
“两同”:即方法名相同,形参列表相同,返回值类型相同;
“两小”:子类方法声明抛出的异常比父类方法声明抛出的异常更小或者相等;返回值类型可以是父类返回值类型的子类型
“一大”:子类方法的访问修饰符应比父类方法更大或相等。

Float a = new Float(1.0); 这个的东西能存在,是因为Float类中有形参是float和double的两个构造器。
Double d = new Double(1.0F);这个能成立的原因是float向上转型了。
Float a = 1.0;这个东西不成立是因为浮点型的默认类型是double,而double不会自动转成float,然后再装箱。
Double d = 1.0f;不成立的原因是因为Double类中的装箱方法,只有valueOf(String s)和valueOf(double d);装箱本身可不会自动向上转型啊。

switch支持 int及以下(char, short, byte),String, Enum

java8 接口新特性:可以定义:静态方法(有方法体) 和 default方法(有方法体) [protect不可以]
接口是通用的,用来描述方法是干什么用的,方法的默认修饰符为public abstract.

java不允许单独的方法,过程或函数存在,需要隶属于某一类中。——AB错 java语言中的方法属于对象的成员,而不是类的成员。不过,其中静态方法属于类的成员。——C错 D问的是java调用方法和C调用过程,C+ + 的函数一样?肯定不一样。错

A,Thread可以被继承,用于创建新的线程
B,Number类可以被继承,Integer,Float,Double等都继承自Number类
C,Double类的声明为
public final class Doubleextends Numberimplements Comparable
final生明的类不能被继承
D,Math类的声明为
public final class Mathextends Object
不能被继承
E,ClassLoader可以被继承,用户可以自定义类加载器

  1. java.awt:提供了绘图和图像类,主要用于编写GUI程序,包括按钮、标签等常用组件以及相应的事件类
  2. java.lang:java的语言包,是核心包,默认导入到用户程序,包中有object类,数据类型包装类,数学类,字符串类,系统和运行时类,操作类,线程类,错误和异常处理类,过程类。
  3. java.io:包含提供多种输出输入功能的类。
  4. java.net: 包含执行与网络有关的类,如URL,SCOKET,SEVERSOCKET等。
  5. java.applet:包含java小应用程序的类。
  6. java.util:包含集合框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组、日期Date类、堆栈Stack类、向量Vector类等)。集合类、时间处理模式、日期时间工具等各类常用工具包。
  7. java.sql:提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。

使用super()或者this()方法是必须放在构造函数的第一行
由于this函数指向的构造函数默认有super()方法,所以规定this()和super()不能同时出现在一个构造函数中
因为staic方法或者语句块没有实例时可以使用,而此时不需要构造实例,所以不能用this()和super()

System.gc()只是提醒虚拟机,程序员希望你在这回收一下对象,但回不回收还是虚拟机来决定,也就是说程序员对回不回收没有绝对的控制权。

静态内部类可以访问外围类的静态数据,包括私有数据,但不能访问非静态数据;
非静态内部类可以直接访问外围类的数据,包括私有数据

CopyOnWriteArrayList适合使用在读操作远远大于写操作的场景里,比如缓存。
ReadWriteLock 当写操作时,其他线程无法读取或写入数据,而当读操作时,其它线程无法写入数据,但却可以读取数据 。适用于 读取远远大于写入的操作。
ConcurrentHashMap是一个线程安全的Hash Table,它的主要功能是提供了一组和HashTable功能相同但是线程安全的方法。ConcurrentHashMap可以做到读取数据不加锁,并且其内部的结构可以让其在进行写操作的时候能够将锁的粒度保持地尽量地小,不用对整个ConcurrentHashMap加锁。

JAVA的赋值运算是有返回值的,赋了什么值,就返回什么值

静态方法,不存在重写,重写只对可见的实例方法有效。静态方法只有隐藏。

volatile与synchronized的区别:
volatile本质是在告诉jvm当前变量在寄存器中的值是不确定的,需要从主存中读取,synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住.
volatile仅能使用在变量级别,synchronized则可以使用在变量,方法.
volatile仅能实现变量的修改可见性,但不具备原子特性,而synchronized则可以保证变量的修改可见性和原子性.
volatile不会造成线程的阻塞,而synchronized可能会造成线程的阻塞.
volatile标记的变量不会被编译器优化,而synchronized标记的变量可以被编译器优化.

先final声明的方法是不能被覆盖的,但是这里并不错误,因为方法是private的,也就是子类没有继承父类的run方法,因此子类的run方法跟父类的run方法无关,并不是覆盖。new Car().run()也是调用子类的run方法。

局部类没有修饰符

1、子类构造函数调用父类构造函数用super
2、子类重写父类方法后,若想调用父类中被重写的方法,用super
3、未被重写的方法可以直接调用。

根据最左匹配原则可以知道B-Tree建立索引的过程,比如假设有一个3列索引(col1,col2,col3),那么MySQL只会会建立三个索引(col1),(col1,col2),(col1,col2,col3)。

接口只能继承接口,但是可以多继承。类都是单继承,但是继承有传递性。

ServerSocket(int port) 是服务端绑定port端口,调accept()监听等待客户端连接,它返回一个连接队列中的一个socket。
Socket(InetAddress address , int port)是创建客户端连接主机的socket流,其中InetAddress是用来记录主机的类,port指定端口。

如果一个类既继承了某个基类,又实现了接口。那么extends关键字必须在implements之前。

自动转换按从低到高的顺序转换。不同类型数据间的优先关系如下:
低 ---------------------------------------------> 高
byte,short,char-> int -> long -> float -> double

float底层比long还要大

解析:Webservice是跨平台,跨语言的远程调用技术;
它的通信机制实质就是xml数据交换;
它采用了soap协议(简单对象协议)进行通信

java核心卷I中43页有如下表述:两个数值进行二元操作时,会有如下的转换操作:
如果两个操作数其中有一个是double类型,另一个操作就会转换为double类型。
否则,如果其中一个操作数是float类型,另一个将会转换为float类型。
否则,如果其中一个操作数是long类型,另一个会转换为long类型。
否则,两个操作数都转换为int类型。

1、Java 中接口单实现通过 implements 关键字,多实现通过 extends 关键字
2、Java 中类单继承通过 extends 关键字,没有多继承
3、如果同时出现继承和实现,则必须先继承(extends)再实现(implements)

结论:1.值传递不可以改变原变量的内容和地址;
2.引用传递不可以改变原变量的地址,但可以改变原变量的内容;

1、抽象类和方法都不能被实例化
2、抽象类可以实现接口
3、抽象类方法默认访问权限都是default
4、接口就是访问的,默认访问权限都是public
jdk1.8前,抽象类方法默认protected,jdk1.8时默认default

final 定义的变量,可以在不是必须要在定义的同时完成初始化,也可以在构造方法中完成初始化。
final修饰方法,不能被子类重写,但是可以被重载。

普通的java对象是通过new关键字把对应类的字节码文件加载到内存,然后创建该对象的。
反射是通过一个名为Class的特殊类,用Class.forName(“className”);得到类的字节码对象,然后用newInstance()方法在虚拟机内部构造这个对象(针对无参构造函数)。
也就是说反射机制让我们可以先拿到java类对应的字节码对象,然后动态的进行任何可能的操作,
包括

  1. 在运行时判断任意一个对象所属的类
    2.在运行时构造任意一个类的对象
  2. 在运行时判断任意一个类所具有的成员变量和方法
    4.在运行时调用任意一个对象的方法
    这些都是反射的功能。
    使用反射的主要作用是方便程序的扩展。

P.S:Serial New收集器是针对新生代的收集器,采用的是复制算法
Parallel New(并行)收集器,新生代采用复制算法,老年代采用标记整理
Parallel Scavenge(并行)收集器,针对新生代,采用复制收集算法
Serial Old(串行)收集器,新生代采用复制,老年代采用标记整理
Parallel Old(并行)收集器,针对老年代,标记整理
CMS收集器,基于标记清理
G1收集器:整体上是基于标记 整理 ,局部采用复制
新生代基本采用复制算法,老年代采用标记整理算法。cms采用标记清理。

猜你喜欢

转载自blog.csdn.net/lx8486/article/details/88636645