Java基础(整理)
Posted qzjblog520
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java基础(整理)相关的知识,希望对你有一定的参考价值。
java基础:
1、==和equals的区别:
基本类型和引用类型
==用来比较值,equals是比较对象的引用,即是否指向同一个对象?
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1.equals(str2));
这里为true的原因:是因为String中重写了equals方法(原本equals方法中是比较引用地址,重写就比较值了)
2、Java内存机制
虽然Java中没有显然的指针,但是它底层的实现原理还是用到到引用地址(指针)
首先内存分配上有栈、堆、常量池、方法区
无论是普通类型的变量还是引用类型的变量(俗称实例),都可以作为局部变量,他们都可以出现在栈中。只不过普通类型的变量在栈中直接保存它所对应的值,而引用类型的变量保存的是一个指向堆区的指针,通过这个指针,就可以找到这个实例在堆区对应的对象。因此,普通类型变量只在栈区占用一块内存,而引用类型变量要在栈区和堆区各占一块内存。
3、Java内存回收机制
做什么事?
发现无用的对象,回收内存空间,使该空间可被程序再次利用
什么是垃圾?
用自己的话说,就是你创建出的一个对象,与该对象无任何相关联的引用的时候,这个对象就叫做垃圾
垃圾回收机制的意义在哪里?
①增强程序的健壮性,防止内存泄露,有效的利用内存空间
②意义还在于让程序员通过学习回收机制的特性,养成一个良好的编程习惯,防止内存泄露
GC如何触发?
①当应用程序处在空闲状态,无线程运行时,GC会调用,以优先级最低的线程进行着垃圾回收
②当java堆内存不足的时候,GC会被调用,使得占有的内存空间得到释放
垃圾回收机制处理不了的问题:对象之间的相互调用,导致计数不为0,所以垃圾回收器就无法回收了
4、String和StringBuffer的区别:
可变与不可变的字符串,StringBuffer性能上更优于String,还能减少垃圾回收机制的开销,如果字符串改变过多的话,用StringBuffer可以用append方法对字符串进行追加操作,而String则需要在原来基础上进行改变,则需要再new对象,这样会产生多个对象,占内存的同时,也相当于多了一些无意义的操作
Mybatis里面#和$符号的区别:
#{}会把传入的数据当成一个字符串,会对数据自动加一个双引号,可以防止SQL注入
而${}一般用于传递表明,$将传入的数据直接显示生成在sql中,无法防止sql注入
5、Integer和int的区别:
(1)Integer是int的包装类;int是基本数据类型;
(2)Integer变量必须实例化后才能使用;int变量不需要;
(3)Integer实际是对象的引用,指向此new的Integer对象;int是直接存储数据值 ;
(4)Integer的默认值是null;int的默认值是0。
6、单例模式:(如何书写?)
保证每一次调用所用的对象只有一个,应用于一些统一的调用操作。举例:回收站
优点:减少系统资源的浪费,一般用于需要频繁调度的程序中,如果每一次调度都要创建一个新的实例,那么堆内存就会产生空间的浪费。
7、方法的重写(override)两同两小一大原则:
方法名相同,参数类型相同
子类返回类型小于等于父类方法返回类型,
子类抛出异常小于等于父类方法抛出异常,
子类访问权限大于等于父类方法访问权限。
8、加载一个类的时候优先级的高低:(类加载到内存过程)
静态成员变量或静态代码块>main方法>非静态成员变量或非静态代码块>构造方法
类的加载是由类加载器完成的,类加载器包括:
根加载器( BootStrap )、扩展加载器( Extension )、系统加载器( System )和用户自定义类加载器( java.lang.ClassLoader 的子类)。
从 Java 2 ( JDK 1.2 )开始,类加载过程采取了父亲委托机制( PDM )。 PDM 更好的保证了 Java 平台的安全性,在该机制中, JVM 自带的 Bootstrap 是根加载器,其他的加载器都有且仅有一个父类加载器。类的加载首先请求父类加载器加载,父类加载器无能为力时才由其子类加载器自行加载。 JVM 不会向 Java 程序提供对 Bootstrap 的引用。
下面是关于几个类加载器的说明:
Bootstrap :一般用本地代码实现,负责加载 JVM 基础核心类库( rt.jar );
Extension :从 java.ext.dirs 系统属性所指定的目录中加载类库,它的父加载器是 Bootstrap ;
system class loader :又叫应用类加载器,其父类是 Extension 。它是应用最广泛的类加载器。它从环境变量 classpath 或者系统属性 java.class.path 所指定的目录中记载类,是用户自定义加载器的默认父加载器。
用户自定义类加载器: java.lang.ClassLoader 的子类
父类委托机制是可以修改的,有些服务器就是自定义类加载器优先的。
9、九大域对象:
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 输出 ,但是尽量使用表达式输出
10、URL(Uniform Resource Locator) ,统一资源定位符,能够对因特网的资源进行定位。
URL一般有四部分组成: <协议>://<主机>:<端口>/<路径>
现在最常用的<协议>为http协议。
<主机>是指主机在因特网上的域名。
http协议的默认<端口>为80(可以省略)。
<路径>是指要读取的文件的路径。
10、方法区在JVM中也是一个非常重要的区域,它与堆一样,是被 线程共享 的区域。 在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。
11、JDK 常用的 package
java.lang: 这个是系统的基础包,比如 String 等都是这里面的,这个 package 是唯一一个可以不用 import 就可以使用的 Package。
java.io: 这里面是所有输入输出有关的类,比如文件操作等
java.net: 这里面是与网络有关的类,比如 URL,URLConnection 等。
java.util : 这里面是系统辅助类,特别是集合类 Collection,List,Map 等。
java.sql: 这里面是数据库操作的类,Connection, Statememt,ResultSet 等
12、创建泛型对象的时候,一定要指出类型变量T的具体类型。争取让编译器检查出错误,而不是留给JVM运行的时候抛出类不匹配的异常。
JVM如何理解泛型概念 —— 类型擦除。事实上,JVM并不知道泛型,所有的泛型在编译阶段就已经被处理成了普通类和方法。 处理方法很简单,我们叫做类型变量T的擦除(erased) 。
总结:泛型代码与JVM ① 虚拟机中没有泛型,只有普通类和方法。 ② 在编译阶段,所有泛型类的类型参数都会被Object或者它们的限定边界来替换。(类型擦除) ③ 在继承泛型类型的时候,桥方法的合成是为了避免类型变量擦除所带来的多态灾难。 无论我们如何定义一个泛型类型,相应的都会有一个原始类型被自动提供。原始类型的名字就是擦除类型参数的泛型类型的名字。
以上是关于Java基础(整理)的主要内容,如果未能解决你的问题,请参考以下文章