1. 为什么要配置环境变量?
答:为了让javac命令(编译命令)和Java命令(运行命令)能在任何文件夹都能运行。
2. JAVA多线程的理解
进程与线程
进程是程序的一次动态执行过程,它需要经历从代码加载,代码执行到执行完毕的一个完整的过程,这个过程也是进程本身从产生,发展到最终消亡的过程。多进程操作系统能同时达运行多个进程(程序),由于 CPU 具备分时机制,所以每个进程都能循环获得自己的CPU 时间片。由于 CPU 执行速度非常快,使得所有程序好像是在同时运行一样。
线程是进程的基础之上进行进一步的划分。所谓多线程是指一个进程在执行过程中可以产生多个更小的程序单元,这些更小的单元称为线程,这些线程可以同时存在,同时运行,一个进程可能包含多个同时执行的线程。
3. File类的构造函数及其方法
File是专门用来管理磁盘文件与目录的,它不负责数据的输入输出。Java.io.File是Java.lang.Object的子类,是文件和目录路径名的抽象表示,简单来说就是File可以代表磁盘下的一个文件,也可以代码磁盘目录下的一个文件集。我们可以使用File拿到这个文件或者文件集的引用,来对这个文件或者文件集进行操作。
3.1 IO流(Input Output)
IO流技术主要的作用是解决设备与设备之间的数据传输问题,比如:硬盘的数据--读取到-->内存中 内存的数据--读取到-->硬盘中 键盘上的数据--读取到-->内存中
3.2 File类的构造函数(方法)
File(String pathname):指定文件或者文件夹的路径来创建一个File文件;
File(File parent, String child):根据parent抽象路径和child路径名字符串,创建一个新的File实例;
package com.dhb.file;
import java.io.File;
import java.io.IOException;
public class Demo1 {
public static void main(String[] args) throws IOException {
File file = new File("F:/a.txt");//指定路径 [构造函数]
file.createNewFile();//创建文件(空文件) [方法]
File files = new File("F:\","b.txt");//第一个参数是路径,第二个参数是要创建文件的文件名 [构造函数]
files.createNewFile();//创建文件(空文件) [方法]
}
}
4. java中带参数的try(){}语法含义是什么?
带资源的try语句(try-with-resource)的最简形式为:
try(Resource res = xxx)//可指定多个资源
{
work with res
}
try块退出时,会自动调用res.close()方法,关闭资源。
5. Java 中json和gson
JSON是javascript对象的一种形态,是一种轻量级的数据交换格式。一般用来在Java EE后台服务和Android或者IoS、H5之间进行通信的一种数据传递的格式。
而Gson是谷歌推出的一个用于生成和解析JSON数据格式的工具;
1.Gson的基本用法
Gson提供了fromJson() 和toJson() 两个直接用于解析和生成的方法,前者实现反序列化,后者实现了序列化;同时每个方法都提供了重载方法
在使用gson之前需要先导入依赖包,在这里我使用的是2.8.0版本的gson jar包.
(
一方包:当前⼯工程中的各模块的相互依赖的包
二方包:公司内部的依赖库,一般指公司内部的其他项目发布的jar包
三方包:公司之外的开源库,比如apache、alibaba、google等发布的包
)
(
常见的JSON库
Gson Google公司开源 地址:https://github.com/google/gson
FastJson(项目选用) 阿⾥里里巴巴开源 地址:https://github.com/alibaba/fastjson
还有 Jackson、Json-lib等很多
)
GSON使用代码
//json字符串串转成对象
Gson gson=new Gson();
Map<String,Object> map = gson.fromJson(str,Map.class);
6.决Java工程URL路径中含有中文的情况
这其实是编码转换的问题。当我们使用ClassLoader的getResource方法获取路径时,获取到的路径被URLEncoder.encode(path,"utf-8")编码了,当路径中存在中文和空格时,他会对这些字符进行转换,这样,得到的往往不是我们想要的真实路径,所以我们可以调用URLDecoder.decode()方法进行解码,以便得到原始的中文及空格路径。
Java代码 :
String packagePath = url.getPath().replaceAll("%20","");//解决路径中含有空格的情况
packagePath = java.net.URLDecoder.decode(packagePath,"utf-8"); //解决路径包含中文的情况
7. java做开发项目时的包的作用(dao,model,service,impl,util,pojo)
app包:
main函数入口
util包:
通常都是工具类,如字符串处理、日期处理等,(建立数据库之间的连接)
model包
存放我们的实体类,与数据库中的属性值基本保持一致
dao包
数据访问层,主要针对于数据表的操作,可以理解为一张数据表,就有一个Dao与之对应,与数据库的操作,增删改查等方法
service包
供外部调用,等于对dao,model等进百行了包装
impl包
定义接口
8. java-包名规则
个人:
indi:多人完成,版权属于发起者
1 | 包名为indi.发起者名.项目名.模块名*.*.*
pers :独自完成,公开,版权主要属于个人。
1 | 包名为pers.个人名.项目名.模块名*.*.*
priv : 独自完成,非公开,版权属于个人。
1 | 包名为priv.个人名.项目名.模块名*.*.*
团队:
team:团队项目指由团队发起,并由该团队开发的项目,版权属于该团队所有。
1 | 包名为team.团队名.项目名.模块名*.*.*
公司:
com:由公司发起,版权由项目发起的公司所有。
1 | 包名为com.公司名.项目名.模块名*.*.*
示例
A、以功能模块来分层定义
com.xxx.user.action com.xxx.menu.action
com.xxx.user.service com.xxx.menu.service
9. JAVA 四种修饰符的修饰范围
修饰符 | 当前类 | 同一包内 | 不同包中的子类 | 子类(不同包) |
---|---|---|---|---|
public | Y | Y | Y | Y |
protected | Y | Y | Y | N |
default | Y | Y | N | N |
private | Y | N | N | N |
10. 数组一定要初始化?
数组变量是一个引用类型的变量,数组变量是指向堆内存当中的数组对象,并不是数组本身。当改变一个数组变量所引用的数组,就可以造成数组长度可变的假象。实际上数组对象本身的长度本没有变化,只是数组变量指向了一个新的数组对象。
所以对于数组变量来说,他并不需要初始化,我们常说的初始化其实是初始化数组对象而非数组变量,有时候我们不进行初始化,而让数组变量指向一个有效的数组对象,数组也可以使用,例如:
引用传递和值传递要区分好!!!
public class ArrayLearn {
public static void main(String [] args)
{
int [] a={0,1,2,3,4};
int[] b;
b=a;
System.out.println(b[1]);
// 输出结果为 1
b[1]=99;
System.out.println(a[1]);
// 输出结果为 99
}
}
理解:Java的数组就是一个对象。初始化数组的最好办法就是new一个。
11. Java的变量类型
- Java中有三种变量类型
- 类变量(静态变量):独立于方法之外的变量,用static修饰
- 实例变量(属性):独立于方法之外的变量,不过没有static修饰
- 类的每个对象特定的变量也是实例对象(顾名思义)
- 需要使用对象.变量名才可以访问
- 生命周期:在对象创建的时候创建,在对象被销毁的时候销毁
- 局部变量:类的方法中的变量
- 执行完成后即被销毁。
public class variable{
static int a = 0; // 类变量
String str = "Java is easy to learn."; // 实例变量 实例变量声明在类内而不是方法中
public void method{
int b = 1; // 局部变量 局部变量是声明在方法中的
// 局部变量在使用前必须初始化
int x;
int z = x + 1; // 这就是错误的代码,无法编译
}
}
注意:
实例变量永远会有默认值。如果没有明确的赋值给实例变量/类变量,或者没有调用setter,实例变量/类变量 仍有默认值。
局部变量没有默认值
Java增强循环语句如下:
for(声明语句:表达式){
// 代码
}
// 冒号可以理解为"in"
public class Test {
public static void main(String args[]){
int [] numbers = {10, 20, 30, 40, 50};
for(int x : numbers ){
System.out.print( x );
System.out.print(",");
}
System.out.print("
");
String [] names ={"James", "Larry", "Tom", "Lacy"};
for( String name : names ) {
System.out.print( name );
System.out.print(",");
}
}
}
12. return 、break和continue的区别和作用
1.return关键字并不是专门用于跳出循环体的,return的功能是结束一个方法。 一旦在循环体内执行到一个return语句,return语句将会结束该方法,循环自然也随之结束。与continue和break不同的是,return直接结束整个方法,不管这个return处于多少层循环之内。
2.continue的功能和break有点类似,区别是continue只是中止本次循环,接着开始下一次循环。而break则是完全中止循环。
3.break用于完全结束一个循环,跳出循环体。不管是哪种循环,一旦在循环体中遇到break,系统将完全结束循环,开始执行循环之后的代码。 break不仅可以结束其所在的循环,还可结束其外层循环。此时需要在break后紧跟一个标签,这个标签用于标识一个外层循环。Java中的标签就是一个紧跟着英文冒号(:)的标识符。且它必须放在循环语句之前才有作用。