Java学习笔记 —— 基础知识点(一)

文档注释

文档注释以 /** 开始,以 */ 结尾,中间部分全是文档注释,会被提取到API文档中去。

  • 由于只有以public或protected修饰的内容才是希望暴露给别人使用的,因此 Javadoc 工具默认只处理public或protected修饰的类、接口、方法、属性、构造器和内部类之前的文档注释。
  • 常用的javadoc标记含义
    @deprecated :不推荐使用的方法
    @see :“参见”,用于指定参考内容
    @exception :抛出的异常类型
    @author :指定Java程序的作者
  • javadoc命令的使用
    javadoc的常用选项:
    -d < directory > :指定将生成的API文档存放的目录
    -windowtitle < text > :用于设置API文档浏览器窗口标题
    -doctitle < html-code > :指定一个HTML文本,用于指定概述页面标题
javadoc 选项 Java源文件名
如:javadoc -d apidoc -author -version demo // javadoc默认不会提取@author和@version,需命令指定,为demo包生成API文档

Java语言是强类型的语言

其含义是每个变量和每个表达式都有一个在编译时就确定的类型

  • 如果直接将一个较小的整数常量(在byte和short类型的表述范围内)赋给一个byte和short变量,系统会自动把这个整数常量当成byte或short处理。如果使用一个巨大的整数常量(超出了int类型的表述范围)时,Java不会自动把这个整数常量当成long类型处理,而依然看作是int类型,这会出现错误!所以开发者应在这个超大的整数常量后加上 L 以表示这是个long类型。对于处理二进制数超大数时也是这样!
  • 当定义32位的二进制整数时,最高位其实是符号位,当符号位为1时,表明它是一个负数,负数在计算机中以补码的形式存在,因此还需要换算成原码(补码减一,各位取反)。同理,当在二进制数后加 L 时,二进制数默认占64位,最高位符号位。其它数值类型同理可得!
// 注意坑点,补码还需转原码
int binVar3 = 0B1000_0000_0000_0000_0000_0000_0000_0011; 
System.out.println(binVar3); // 输出值为:-2147483645
  • Java语言默认的浮点类型是double,因此想使用float类型,要在数值后加F,只有浮点类型数值才可以用科学计数法,例如51200是一个int型,而512E2是一个浮点型。
  • 三个特殊的浮点类型:正无穷大、负无穷大、非数(NaN),用于表示溢出或出错。正无穷大通过Double或Float的POSITIVE_INFINITY表示,负无穷大NEGATIVE_INFINITY,非数NaN。
// 注意坑点,浮点 0.0 与 整数 0 做除数上的区别
double a = 0.0;
double c = Double.NEGATIVE_INFINITY;
float d = Float.NEGATIVE_INFINITY;
System.out.println(c==d); // 两个(负)正无穷相等,true
System.out.println(a / a); // NaN
System.out.println(6.0 / 0); // 正无穷大
System.out.println(6 / 0); // ArithmeticException: / by zero
System.out.println(a / a == Float.NaN); //两个NaN不相等,false
  • boolean类型的取值只能是true和false,不能用0或者非0来代表,其他基本数据类型也不能转换成boolean类型。
// 注意坑点,不能用0或者非0来代表boolean型
while(1){   // Error:cannot convert from int to boolean
	...
}
  • 隐式类型转换隐式类型转换
  • 表达式类型自动提升
    (1)所有的type类型、short类型和char类型都被提升到int类型
    (2)整个表达式的数据类型自动提升到最高的数据类型
// 注意坑点,表达式类型自动提升
short sValue = 5;
sValue = sValue - 2; // Error:cannot convert from int to boolean
  • 直接量
    直接量是指在程序中通过源代码直接指定的值,例如 int a = 5; 5就是一个直接量。并不是所有数据类型都可以指定直接量,能指定直接量的类型通常只有3中类型:基本类型、字符串类型、null类型(null类型的直接量只有null,并且这个直接量可以赋值给任何引用类型)。
  • 常量池
    常量池(constant pool)指的是在编译期间被确定,并保存在已编译的.class文件的一些数据,它包括关于类、方法、接口中的常量,也包括字符串直接量。当程序第一次使用某一个字符串直接量时,Java会使用常量池来缓存该字符串直接量。后序再使用时,Java会直接使用常量池中的字符串。
//  注意坑点,使用new和使用字符串直接量的区别
String a = "HelloWorld";
String b = "HelloWorld";
String s1 = new String("HelloWorld");
System.out.println(a == b); //true
System.out.println(a == s1); //false
  • 基本类型的变量、值不能和引用类型的变量、值使用 == 进行比较;boolean类型的变量不能和其它任何类型的变量、值使用 == 进行比较。如果两个引用类型之间没有继承关系,那么它们的变量也不能使用 == 进行比较。

流程控制与数组

  • switch语句后的表达式的数据类型只能是byte、short、char、int、enum 五种
  • foreach语句的循环变量相当于一个临时变量,系统会自动把数组元素一次赋给这个临时变量,而这个临时变量并不是数组元素,它只是保存了数组元素的值,因此,如果希望改变数组元素的值,则不要使用foreach循环。
for(int temp : arrays){ // temp只是个临时的变量
	...
}
  • 为什么会有堆内存和栈内存之分?
    当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法里定义的变量将会逐个放入这块栈内存里,随着方法的执行结束,这个方法的内存栈也将自然销毁。因此,所有在方法中定义的局部变量都是放在栈内存中的;当我们在程序中创建一个对象时,这个对象将被保存到运行时数据区中,以便反复利用(因为创建对象的成本较大),这个运行时数据区就是堆内存。堆内存中的对象不会随方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量引用(在方法的参数传递时很常见),则这个对象依然不会被销毁。只有当一个对象没有任何引用变量引用它时,系统的垃圾回收机制才会在合适的时候回收它。

  • 操作数组的工具类
    (1) import java.util.Arrays

int binarySearch(type[] a, type key); //使用二分查找key在数组a中的索引,要求数组已经升序排列
int binarySearch(type[] a, int fromIndex, int toIndex, type key);
type[] copyOf(type[] original, int newLength); //从original复制length个元素,组成新数组
type[] copyOfRange(type[] original, int from, int to);
boolean equals(type[] a, type[] a2); // a、b数组长度相等,并且元素位置一致,且值相同,则为true
void fill(type[] a, type val); //将数组中的每一个元素都赋值为val
void fill(type[] a, int fromIndex, int toIndex, type val);
void sort(type[] a);
void sort(type[] a, int fromIndex, int toIndex);
String toString(type[] a); 
(2)System类中的数组操作
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
// 注意坑点一,boolean equals(type[] a, type[] a2); 考虑了元素的位置
// 注意坑点二,== 对于比较两个引用类型的变量时,比较的是在堆中的存储地址
// 注意坑点三,不得不再提一下,常量池的存在,上面已经叙述的很清楚了,回顾一下!
int[] a = {1,2,3,4};
int[] b = {1,2,3,4};
int[] c = {1,2,4,3};
System.out.println(Arrays.equals(a, b)); // true
System.out.println(Arrays.equals(a, c)); // false
System.out.println(a == b); //false
System.out.println(a.equals(b)); //false
  • == 操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。
    == 比较的是2个对象的地址,而equals比较的是2个对象的内容。

所谓迷茫,就是你的才华还配不上你的梦想

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
文件上传是Web开发中常见的功能之一,Java中也提供了多种方式来实现文件上传。其中,一种常用的方式是通过Apache的commons-fileupload组件来实现文件上传。 以下是实现文件上传的步骤: 1.在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.3</version> </dependency> ``` 2.在前端页面中添加文件上传表单: ```html <form method="post" enctype="multipart/form-data" action="upload"> <input type="file" name="file"> <input type="submit" value="Upload"> </form> ``` 3.在后台Java代码中处理上传文件: ```java // 创建一个DiskFileItemFactory对象,用于解析上传的文件 DiskFileItemFactory factory = new DiskFileItemFactory(); // 设置缓冲区大小,如果上传的文件大于缓冲区大小,则先将文件保存到临时文件中,再进行处理 factory.setSizeThreshold(1024 * 1024); // 创建一个ServletFileUpload对象,用于解析上传的文件 ServletFileUpload upload = new ServletFileUpload(factory); // 设置上传文件的大小限制,这里设置为10MB upload.setFileSizeMax(10 * 1024 * 1024); // 解析上传的文件,得到一个FileItem的List集合 List<FileItem> items = upload.parseRequest(request); // 遍历FileItem的List集合,处理上传的文件 for (FileItem item : items) { // 判断当前FileItem是否为上传的文件 if (!item.isFormField()) { // 获取上传文件的文件名 String fileName = item.getName(); // 创建一个File对象,用于保存上传的文件 File file = new File("D:/uploads/" + fileName); // 将上传的文件保存到指定的目录中 item.write(file); } } ``` 以上代码中,首先创建了一个DiskFileItemFactory对象,用于解析上传的文件。然后设置了缓冲区大小和上传文件的大小限制。接着创建一个ServletFileUpload对象,用于解析上传的文件。最后遍历FileItem的List集合,判断当前FileItem是否为上传的文件,如果是,则获取文件名,创建一个File对象,将上传的文件保存到指定的目录中。 4.文件上传完成后,可以给用户一个提示信息,例如: ```java response.getWriter().write("File uploaded successfully!"); ``` 以上就是使用Apache的commons-fileupload组件实现文件上传的步骤。需要注意的是,文件上传可能会带来安全隐患,因此在处理上传的文件时,需要进行严格的校验和过滤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值