欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java基础(整理)

程序员文章站 2022-07-10 11:15:11
java基础: 1、==和equals的区别: 基本类型和引用类型 ==用来比较值,equals是比较对象的引用,即是否指向同一个对象? String str1 = new String("hello");String str2 = new String("hello"); System.out.p ......

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或者它们的限定边界来替换。(类型擦除) ③ 在继承泛型类型的时候,桥方法的合成是为了避免类型变量擦除所带来的多态灾难。 无论我们如何定义一个泛型类型,相应的都会有一个原始类型被自动提供。原始类型的名字就是擦除类型参数的泛型类型的名字。