IT`huhui前言录
这是自己对JAVA基础的一个小总结,会不断完善。因为时间仓促的原因。
每学习一段时间,停下来,静心总结一下,甚好。停停走,走走停,一往无前,不摔倒。
一些链接里面是我看到一些人理解后写出来很好的文章然后我转载过来的。
原创博文,大家转载的意欲,请附带上以下信息:
来自:IT`huhui的个人博客
作者:胡伟汇
链接: 原文链接
JAVA内存分配机制
stack (栈) 存放局部变量和方法调用
heap (堆) 存放new出来的对象,实例对象的存在于对象所属的heap空间上
data segment(变量区) 静态变量和字符串变量
code segment (代码区) 存放代码
注意区分好局部变量,实例变量,静态变量存放的不同区域。
变量 | 生命周期 |
静态变量 | 在类被加载时进行初始化,生命周期与类的生命周期相关 |
实例变量 | 存放在对象所属的heap空间上,生命周期和实例的对象相关 |
局部变量 | 局部变量和方法的参数都被生命在方法当中, 生命周期与方法被放在stack上的时间相关, 就是方法调用执行完毕,则生命周期结束 |
例子:
public class Sample
{
private static c = 3;//静态变量
private int a=1; //实例变量
public void b()
{
int a=2; //局部变量
System.out.println("局部变量:a="+a);
System.out.println("实例变量:a="+this.a);//局部变量的作用域内引用实例变量:this.变量名
}
public static void main(String[] args)
{
new Sample().b();
}
}
局部变量:2
实例变量:1
静态变量:3
附图:
JAVA 的继承
- 只支持单继承,不允许多继承。
- 继承中的构造方法:
- 子类的构造过程中 必须 调用到父类的构造方法。
- 子类可以在自己的构造方法中使用super来调用父类的构造方法。
- 如果使用 this(参数)方法 会调用本类的另外的构造方法。
- 如果调用 super方法 必须在子类构造方法的第一行。
JAVA 多态(动态绑定)
多态:在执行期间 (而非编译期间)判断所引用对象的实际类型,根据其实际的类型调用相对应的方法
多态存在的必要条件
- 有继承(或接口实现)
- 要有重写
- 父类引用指向子类对象
Object 类的 equals
必须是同一个对象才返回true 否则返回 false
String,Date 类等某些类对equals进行了重写,举例,在String中equals对比的是值,但是"=="比较的是内存地址。
子类没有明确些调用父类的构造方法。则系统默认调用父类的无参数构造函数
如果父类没有无参构造函数,子类又没明确调用父类构造方法,编译出错
JAVA 权限控制
JAVA方法的重写和重载
- 方法重写
- 对父类继承来的方法进行重写。
- 重写的方法要与被重写的方法具有相同方法名称,参数列表和返回类型
- 重写方法不能比被重写方法更严格的访问权限
- 方法重载
方法重载是指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数
值传递原则
基本类型传递的是该数值本身。引用类型传递的是对对象的引用,不是对象本身
异常分类
附图:
throwable
- error 系统本身错误 由虚拟机生成并且抛出
- exception 可以处理的异常 一般需要用户捕获
- runtimeException 用户可以不处理
Collection 容器
-
List接口(一句话:有顺序,元素可以重复)
List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。和下面要提到的Set不同,List允许有相同的元素。LinkedList类
LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。注意LinkedList没有同步方法。
ArrayList类
ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList没有同步。和LinkedList一样,ArrayList也是非同步的(unsynchronized)。 Set接口(一句话:没顺序,元素不可以重复。重复判断标准:相互equals)
Set是一种不包含重复的元素的Collection,即任意的两个元素e1和e2都有e1.equals(e2)=false,Set最多有一个null元素。很明显,Set的构造函数有一个约束条件,传入的Collection参数不能包含重复的元素。Map接口(一句话,key唯一,value可以重复)
请注意,Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个 value。Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。总结:
1. 如果涉及到堆栈,队列等操作,应该考虑用List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList。
2. 如果程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率较高,如果多个线程可能同时操作一个类,应该使用同步的类。
3. 尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变。这就是针对抽象编程。
4. equals 的时候hashcode应该相等
5. 容器类对象在调用remove、contains等方法时需要比较对象是否相等。这会涉及到对象类型的equals方法和hashcode方法;对于自定义的类型;需要重写equals和hashcode方法以实现自定义对象的相等规则。
注意,相等的对象应该具有相等的hashcodes。-
在这里记录下Set和List 用迭代器遍历方法
``` java
//LIST
for(Iterator iter =list.iterator(); iter.hasNext();){
String str=(String )iter.next();System.out.println(str); }
//Set
Set keyset = mapmysql.keySet();
for (Iterator iterator = keyset.iterator();iterator.hasNext();){
int key = (int) iterator.next();
int values = (int) mapmysql.get(key);
}
```
比较器——Comparable
- 实现Comparable,编写compareTo()方法
public Song implements Comparable<Song>{
String title;
String artist;
String rating;
String bpm;
public int compareTo(Song s) {
return title.compareTo(s.getTitle());
}
}
- 另一种sort()方法,取用Comparator参数
- 创建并实现Comparator的内部类。用compare()方法替代了compareTo()方法。
- 调用重载的sort(),传入list和CompareTo的实例。
//这里举个在《Head First Java》里面看到的例子。
public class Jukebox5{
ArrayList<Song> songList = new ArrayList<Song>();
public static void main(String [] args){
new Jukebox5().go();
}
class ArtisCompare implements Comparator<Song>{
public int compare(Song one ,Song two ){
return one.getArtist().compareTo(two.getArtist());
}
}
public void go(){
System.out.println(songList);//排序前
ArtistCompare artistCompare = new ArtistCompare ();
Collection.sort(songList , artistCompare);
System.out.println(songList);//排序后
}
}
数组
区分:
- 数组对象的内存图:
- 数组元素为引用数据类型的内存图