没有合适的资源?快使用搜索试试~ 我知道了~
java笔记整理(超详细) java笔记整理(超详细)
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 5 下载量 182 浏览量
2022-07-14
00:16:48
上传
评论 11
收藏 5.75MB PDF 举报
温馨提示
试读
79页
Java集合可以分为Collection和Map两种体系: Collection接口: List:元素有序,可重复的集合 ArrayList: 底层数组实现,有利于随机访问get LinkedList:底层是链表,有利于频繁的插入、删除操作(ArrayList删除和插...
资源推荐
资源详情
资源评论
java笔记整理(超详细)
基础
Java 语⾔有哪些特点
1. 简单易学;
2. ⾯向对象(封装,继承,多态);
3. 平台⽆关性( Java 虚拟机实现平台⽆关性);
4. 可靠性;
5. 安全性;
6. ⽀持多线程( C++ 语⾔没有内置的多线程机制,因此必须调⽤操作系 统的多线程功能来进⾏多线程程序设计,⽽ Java 语⾔却提供
了多线程 ⽀持);
7. ⽀持⽹络编程并且很⽅便
8. 编译与解释并存;
⾯向对象和⾯向过程的区别
⾯向过程 :
优点: 性能⽐⾯向对象⾼,因为类调⽤时需要实例化,开销⽐较⼤,⽐较消耗 资源;⽐如单⽚机、嵌⼊式开发、Linux/Unix 等⼀般采
⽤⾯向过程开发,性能是最重要的因素。
缺点: 没有⾯向对象易维护、易复⽤、易扩展
⾯向对象 :
优点: 易维护、易复⽤、易扩展,由于⾯向对象有封装、继承、多态性的特 性,可以设计出低耦合的系统,使系统更加灵活、更加易
于维护
缺点: 性能⽐⾯向过程低
字符型常量和字符串常量的区别
形式上: 字符常量是单引号引起的⼀个字符 字符串常量是双引号引起的 若⼲个字符
含义上: 字符常量相当于⼀个整形值( ASCII 值),可以参加表达式,运算字符串常量代表⼀个地址值(该字符串在内存中存放位置)
占内存⼤⼩:字符常量只占 2 个字节(char 在 Java 中占两个字节), 字符串常量占若⼲个字节
构造器 Constructor 是否可被 override
⽗类的私有属性和构造⽅法并不能被继承,所以 Constructor 也就不能被 override(重写),但是可以 overload(重载)
重载和重写的区别
**重载:** 发⽣在同⼀个类中,⽅法名必须相同,参数类型不同、个数不同、顺序不同,⽅法返回值和访问修饰符可以不同,发⽣在编译时。
**重写:** 发⽣在⽗⼦类中,⽅法名、参数列表必须相同,返回值范围⼩于等于⽗类,抛出的异常范围⼩于等于⽗类,访问修饰符范围⼤于等于⽗类;如
果⽗类⽅法访问修饰符为 private 则⼦类就不能重写该⽅法。
为什么要使⽤封装?
隐藏对象内部的复杂性,确保数据安全 , 防⽌误操作,只对外公开简单的接⼝,便于外界使⽤
java为什么类不⽀持多继承,接⼝可以?
Java中的接⼝⽀持多继承(接⼝与接⼝之间为继承关系),因为接⼝不提供具体实现⽅式,只是⼀种规范,所以⽀持;Java的类不⽀
持多继承的原因是Java是强类型语⾔,多继承会导致调⽤的不确定性,编译器⽆法确定要调⽤哪个类⽅法,甚⾄在调⽤哪个类⽅法时也
⽆法确定优先级。
接⼝和抽象类的区别是什么
1. 接⼝的⽅法默认是 public,所有⽅法在接⼝中不能有实现(Java 8 开始 接⼝⽅法可以有默认实现),抽象类可以有⾮抽象的⽅法
2. 接⼝中不能包含变量,所有的变量都是常量,默认为public static final类型的,⽽抽象类中则不⼀定
3. 接⼝可以多继承,抽象类只能单⼀集成
4. ⼀个类实现接⼝的话要实现接⼝的所有⽅法,⽽抽象类不⼀定
5. 接⼝是没有构造器的,不能⽤ new 实例化,但可以声明,但是必须引⽤⼀个实现该接⼝的对象 从设计层⾯来说,抽象是对类的抽
象,是⼀种模板设计,接⼝是⾏为的抽象,是⼀种⾏为的规范。
成员变量与局部变量的区别有那些
1. 从语法形式上,看成员变量是属于类的,⽽局部变量是在⽅法中定义的变量或是⽅法的参数,成员变量可以被 public,private,static
等修饰符所修饰,⽽局部变量不能被访问控制修饰符及 static 所修饰;但是成员变量和局部变量都能被 final 所修饰;
2. 从变量在内存中的存储⽅式来看,成员变量是对象的⼀部分,⽽对象存在于堆内存,局部变量存在于栈内存
3. 从变量在内存中的⽣存时间上看,成员变量是对象的⼀部分,它随着对象的创建⽽存在,⽽局部变量随着⽅法的调⽤⽽⾃动消失。
4. 成员变量如果没有被赋初值,则会⾃动以类型的默认值⽽赋值(⼀种情况例外被 final 修饰的成员变量也必须显⽰地赋值);⽽局部变
量则不会⾃动赋值。
对象的相等与指向他们的引⽤相等,两者有什么不同?
对象的相等,⽐的是内存中存放的内容是否相等。⽽引⽤相等,⽐较的是他们指向的内存地址是否相等。
Java 中的异常处理
在 Java 中,所有的异常都有⼀个共同的祖先 java.lang 包中的 Throwable 类。
Throwable: 有两个重要的⼦类:Exception(异常) 和 Error(错 误) ,⼆者都是 Java 异常处理的重要⼦类,各⾃都包含⼤量⼦类。
Error(错误):是程序⽆法处理的错误,表⽰运⾏应⽤程序中较严重问题。⼤ 多数错误与代码编写者执⾏的操作⽆关,⽽表⽰代码运⾏时
JVM(Java 虚拟 机)出现的问题。
**Exception(异常)*是程序本⾝可以处理的异常。
注:异常和错误的区别:异常能被程序本⾝可以处理,错误是⽆法处理。
在以下 4 种特殊情况下,finally 块不会被执⾏
1. 在 finally 语句块中发⽣了异常。、
2. 在前⾯的代码中⽤了 System.exit()退出程序。
3. 程序所在的线程死亡。
4. 关闭 CPU。
获取⽤键盘输⼊常⽤的的两种⽅法
⽅法 1:通过 Scanner
Scanner input = new Scanner(System.in);
String s = input.nextLine();
input.close();
⽅法 2:通过 BufferedReader
BufferedReader input = new BufferedReader (new InputStreamReader (System.in));
String s = input.readLine ();
⼀、集合框架
⼤纲:
Java集合可以分为Collection和Map两种体系:
Collection接⼝:
List:元素有序,可重复的集合
ArrayList: 底层数组实现,有利于随机访问get
LinkedList:底层是链表,有利于频繁的插⼊、删除操作(ArrayList删除和插⼊要扩容,浪费性能)
Vector:古⽼的实现类,线程安全的,性能较差,效率低于ArrayList,不建议使⽤
Set:元素⽆序、不可重复的集合
LinkedHashSet:使⽤链表维护了⼀个添加进集合中的顺序。
注:要求添加进Set元素所在的类,⼀定要重写equals()和hashCode()⽅法
List
ArrayList
1. List集合实现类ArrayList底层采⽤数组实现,学习ArrayList源码前先了解数组的扩容机制
数组的两种扩容⽅式
Object [] objects = {1, 2, 3, 4 ,5, 6};
/**
*
数组扩容,⽤
Arrays.copyOf
⽅法
*
底层⽤的也是
System.arraycopy
* System.arraycopy(
原数组
, 0,
需要扩容的新数组
, 0, Math.min(original.length,newLength));
*
参数
Math.min()
:返回最⼩数
,
即需要扩容的内容数量
*/
Object[] newObjects = Arrays.copyOf(objects, 3);
System.out.println(Arrays.toString(newObjects));
/**
* System.arraycopy:
底层数组
copy
技术
,
该⽅法⽤
native
修饰
*
参数:
src
:原数组
* srcPos
:原数组的起始位置;即从原数组的起始位置开始复制
* dest
:⽬标数组
* destPos
:⽬标数组起始位置;即从⽬标组的起始位置往⾥复制
* length
:复制长度;即需要从原数组复制到⽬标数组的个数
*/
int[] fun = {0, 1, 2, 3, 4, 5, 6};
System.arraycopy(fun, 3, fun, 0, 4);
System.out.println(Arrays.toString(fun));
2. JDK1.7以后,ArrayList数组默认初始化⼤⼩放在add⽅法内,⽆参构造⽅法默认为⼀个空数组,有参构造⽅法可以指定其数组长度
//
初始化时默认为空数组
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
//elementData
:
ArrayList
存放数据的数组
transient Object[] elementData ;
//
⽆参构造⽅法默认为⼀个空数组
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
//
指定长度的有参构造
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException ("Illegal Capacity: " + initialCapacity);
}
}
3. ArrayList数组默认初始化⼤⼩为10
private static final int DEFAULT_CAPACITY = 10;
4. ArrayList中可以存放null
//ArrayList
中需要存放的元素为泛型,故可以存放
null
public boolean add(E e) {
ensureCapacityInternal (size + 1);//
扩容⽅法
elementData [size++] = e;
return true;
}
5. size属性
//ArrayList
中元素的具体个数,数组长度不等于元素个数
//
扩容需要⽤到该属性,当
size == elementData.length
时,触发扩容
private int size;
6. ArrayList中elementData为什么被transient修饰?
⼀、transient修饰符基本概念:
transient⽤来表⽰⼀个域不是该对象序⾏化的⼀部分,当⼀个对象被序⾏化的时候,transient修饰的变量的值是不包括在序⾏
化的表⽰中的。
transient⽤于修饰不需要序列化的字段,如果⼀个引⽤类型被transient修饰,则其反序列化的值为null,如果⼀个基本类型被
transient修饰,则其反序列化的值为0,如果字段的引⽤类型是不可序列化的类,则也应该使⽤transient修饰,它在序列化时
会被直接跳过。
⼆、elementData⽤transient修饰:
ArrayList在序列化的时候会调⽤writeObject,直接将size和element写⼊ObjectOutputStream;反序列化时调⽤
readObject,从ObjectInputStream获取size和element,再恢复到elementData。
三、为什么不直接⽤elementData来序列化,⽽采⽤上述的⽅式来实现序列化呢?
原因在于elementData是⼀个缓存数组,它通常会预留⼀些容量,等容量不⾜时再扩充容量,那么有些空间可能就没有实际存储
元素,采⽤上述的⽅式来实现序列化时,就可以保证只序列化实际存储的那些元素,⽽不是整个数组,从⽽节省空间和时间。
7. 序列化性能⽐较
8. ArrayList中modCount的作⽤
9. ArrayList底层每次数组扩容为原数组长度的1.5倍
当扩容时,原长度为1,最⼩扩容量则为2
//
参数为最⼩扩容量
private void ensureCapacityInternal (int minCapacity) {
if(size == elementData.length){
int oldCapacity = elementData .length;
//
当
size
等于数组的长度时,需要扩容
//
新扩容容量为原来⼤⼩的
1.5
倍,此处采⽤位运算符
int newCapacity = oldCapacity + (oldCapacity >> 1);
//
当长度为
1
时,新容量通过位运算的结果还是为
1
,当新容量⼩于最⼩扩容量时,⽤最⼩扩容量
if(newCapacity - minCapacity < 0){
newCapacity = minCapacity;
}
elementData = Arrays.copyOf(elementData, newCapacit);
}
}
LinkedList
剩余78页未读,继续阅读
资源评论
- weixin_424460252023-09-19资源内容总结的很到位,内容详实,很受用,学到了~
- tyism1r3hk2023-01-19资源中能够借鉴的内容很多,值得学习的地方也很多,大家一起进步!
- ED0N_chen2024-01-12资源使用价值高,内容详实,给了我很多新想法,感谢大佬分享~
- xingjun1234562023-06-30感谢大佬,让我及时解决了当下的问题,解燃眉之急,必须支持!
- 2301_764295132023-09-02简直是宝藏资源,实用价值很高,支持!
复杂的程序猿
- 粉丝: 2
- 资源: 271
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功