??xml version="1.0" encoding="utf-8" standalone="yes"?> 1.l承Threadcd义线E?/p> 定义一个线E可以通过l承ThreadcL实现Q这是一U相对简单的定义U程的方法。在ThreadcM有一个runҎ(gu)Q在定义的线E中需要重写这个方法。在重写runҎ(gu)中可以定义该U程要执行的语句。当U程启动ӞrunҎ(gu)中的E序成Z条独立的执行U程。示例代码如下: public class XianCheng extends Thread { public void run() { System.out.println("runҎ(gu)执行"); } } 改程序是无法执行的,因ؓ没有mainҎ(gu)Q也是没有启动U程的方法。下面先介绍如何创徏U程对象。代码如? XianCheng xc = new XianCheng(); 从上面的代码可以看出Q创建线E对象的Ҏ(gu)和创建普通对象的Ҏ(gu)是一L(fng)。但是这只是对于使用l承Threadcd建线E的Ҏ(gu)来说的。我们也可以通过ThreadcL定义U程对象Q如 Thread th = new ThreadQ)Q?/p> 2.实现Runnable接口定义U程 在Runnable接口中具有一个抽象的runҎ(gu)Q在实现Runnable接口Ӟ需要实现runҎ(gu)。示例代码如下: public class test2 implements Runnable{ public void runQ){ System.out.println("runҎ(gu)执行"); } } 在用实现Runnable接口定义的线E中Q要比上面复杂些Q因为直接创建类的对象创建的q不是一个线E对象,要想创徏U程对象必须要借助ThreadcR只有ThreadcL能定义线E对象?/p> 代码如下Qtest2 t2 = new test2Q)Q?/p> Thread tt2 = new ThreadQt2Q; tt2才是U程对象QThreadcd?个构造器Q最常用的就是具有一个参数的Q我们可以先创徏一个实现Runnable接口的类对象Q然后作为Threadcȝ参数来创建多个线E对象?/p> 当我们徏立了一个线E类的时候,p启动U程Q初学者会认ؓ启动U程是调用U程cM的方法。但q点是错误的Q虽然可以用对象?runQ)来调用runҎ(gu)Q但qƈ不是U程的启动。要惛_动线E还要调用线E的starҎ(gu)Q如Qtt2.startQ)Q但要注意,一个线E只能调用一ơstarҎ(gu)Q第二次启动U程会发生IllegalThreadException异常。有关线E的启动Q应用问题以后再做介l?/p> 好了Q有关线E的基础知识先介l到q里。有不的地方请大家批评指正?/p>
一、有关super跟this的区别?/p>
区别 | Super | This |
范围 | 由子c访问父cȝ内容 | 直接讉K本类中的内容 |
讉K属?/p> | super.父类属性,如果属性没有被覆写Q则也可以不写super?/p> | This.本类属性?/p> |
讉KҎ(gu) | super.父类Ҏ(gu)(),如果Ҏ(gu)没有被覆写,则可以不用加super也表C用父cM的方法?/p> | this.本类Ҏ(gu)(),可以不写this,也表C用本cȝҎ(gu)?/p> |
讉K构造方?/p> | super是访问父cM的构造方法,必须攑֜首行?/p> | this 是访问本cM的其他构造方法,必须攑֜首行?/p> |
二、重载和重写的区别?/p>
区别 | 重蝲 | 重写/覆写 |
单词 | Overloading | Override |
概念 | Ҏ(gu)名称相同Q参数列表不同?/p> | Ҏ(gu)名称相同Q参数列表相同,Ҏ(gu)的访问权限不能更严格?/p> |
范围 | 发生在一个类中?/p> | 发生在承关pMQ由子类q行覆写?/p> |
三、Vector和ArrayList
1.vector是线E同步的Q所以它也是U程安全的,而arraylist是线E异步的Q是不安全的。如果不考虑到线E的安全因素Q一般用
arraylist效率比较高?br> 2.如果集合中的元素的数目大于目前集合数l的长度Ӟvector增长率ؓ目前数组长度?00%,而arraylist增长率ؓ目前数组长度
?0%.如过在集合中使用数据量比较大的数据,用vector有一定的优势?br> ArrayList 和Vector是采用数l方式存储数据,此数l元素数大于实际存储的数据以便增加和插入元素Q都允许直接序号索引元素Q?br> 但是插入数据要设计到数组元素Ud{内存操作,所以烦引数据快插入数据慢,Vector׃使用了synchronizedҎ(gu)Q线E安全)所以性能上比ArrayList要差Q?br> LinkedList使用双向链表实现存储Q按序号索引数据需要进行向前或向后遍历Q但是插入数据时只需要记录本的前后即可,所以插入数度较快!
四、arraylist和linkedlist
1.ArrayList是实CZ动态数l的数据l构QLinkedListZ链表的数据结构?br> 2.对于随机讉Kget和setQArrayList觉对优于LinkedListQ因为LinkedList要移动指针?br> 3.对于新增和删除操作add和removeQLinedList比较占优势,因ؓArrayList要移动数据?br> q一点要看实际情늚。若只对单条数据插入或删除,ArrayList的速度反而优于LinkedList?br> 但若是批量随机的插入删除数据QLinkedList的速度大大优于ArrayList. 因ؓArrayList每插入一条数据,要移动插入点及之后的所有数据?
五、HashMap与TreeMap
1、HashMap通过hashcode对其内容q行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得C个有序的l果你就应该使用TreeMapQHashMap中元素的排列序是不固定的)?
HashMap中元素的排列序是不固定的)?
2、HashMap通过hashcode对其内容q行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得C个有序的l果你就应该使用TreeMapQHashMap中元素的排列序是不固定的)。集合框架”提供两U常规的Map实现QHashMap和TreeMap (TreeMap实现SortedMap接口)?
3、在Map 中插入、删除和定位元素QHashMap 是最好的选择。但如果(zhn)要按自焉序或自定义顺序遍历键Q那么TreeMap会更好。用HashMap要求d的键cL定义了hashCode()?equals()的实现。 q个TreeMap没有调优选项Q因树d于^衡状态?
六、hashtable与hashmap
1.历史原因:Hashtable是基于陈旧的DictionarycȝQHashMap是Java 1.2引进的Map接口的一个实?
2.同步?Hashtable是线E安全的Q也是说是同步的,而HashMap是线E序不安全的Q不是同步的
3.|只有HashMap可以让你空gZ个表的条目的key或value
七、Set中的数据对象没有序且不可以重复?br> List中的数据对象有顺序且可以重复?
在这个程序中Q首先定义一个学校类Q再定义一个班U类Q最后定义一个学生类。在ȝ序中通过讄不同cd对象间的关系Q达到类与类之间包含的关pR?/p>
代码如下Q?/p>
//学校c?/p>
package com.TinySK;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
class School{
private String name;
//一个学校有多个班 Q通过集合cList 实现?
private List<Cls> allClss;
public School(String name){
this.setName(name);
this.setAllClss(new ArrayList<Cls>());
}
//向学校中加入班
public void add(Cls cls){
this.allClss.add(cls);
}
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
public void setAllClss(List<Cls> allClss){
this.allClss = allClss;
}
public List<Cls> getAllClss(){
return this.allClss;
}
}
//班c?/p>
class Cls{
private String name;
private School school; //此处定义了一个学校类的对象?nbsp;
private List<Student> allStudents;//一个班U有多个学生 Q通过集合cList 实现?/p>
public Cls(String name){
this.setName(name);
this.setAllStudents(new ArrayList<Student>());
}
//向班U中加入学生
public void add(Student stu){
this.allStudents.add(stu);
}
public List<Student> getAllStudents(){
return this.allStudents;
}
public void setAllStudents(List<Student> allStudents){
this.allStudents = allStudents;
}
public void setSchool(School school){
this.school = school;
}
public School getSchool(){
return this.school;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
}
//学生c?/p>
class Student{
private String name;
private int age;
//一个学生属于一个班U?nbsp;
private Cls cls;
public Student(String name,int age){
this.setName(name);
this.setAge(age);
}
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return this.age;
}
public void setCls(Cls cls){
this.cls = cls;
}
public Cls getCls(){
return this.cls;
}
}
//d?
public class Test{
public static void main(String[] args){
School sch = new School("Java blog");
Cls c1 = new Cls("Java一?);
Cls c2 = new Cls("Java二班");
Cls c3 = new Cls("Java三班");
Student stu1 = new Student("Tiny",20);
Student stu2 = new Student("SK",25);
Student stu3 = new Student("sevn",23);
Student stu4 = new Student("puck",28);
Student stu5 = new Student("lion",35);
//讄关系
sch.add(c1);
c1.setSchool(sch);
sch.add(c2);
c2.setSchool(sch);
sch.add(c3);
c3.setSchool(sch);
c1.add(stu1);
stu1.setCls(c1);
c2.add(stu2);
stu2.setCls(c2);
c2.add(stu3);
stu3.setCls(c2);
c3.add(stu4);
stu4.setCls(c3);
c3.add(stu5);
stu5.setCls(c3);
//如果要输出全部的内容Q则要进行双重@?nbsp;
System.out.println("学校名称Q?+sch.getName());
Iterator<Cls> iter1 = sch.getAllClss().iterator();
while(iter1.hasNext()){
Cls c = iter1.next();
System.out.println("\t|- 班名称Q?+c.getName());
//输出一个班U中的全部学?nbsp;
Iterator<Student> iter2 = c.getAllStudents().iterator();
while(iter2.hasNext()){
Student s = iter2.next();
System.out.println("\t\t|- 学生姓名Q?+s.getName()+"Q学生年龄:"+s.getAge()+" --> "+s.getCls().getSchool().getName());
}
}
}
}
q行l果如图Q?a href="http://www.aygfsteel.com/images/blogjava_net/TinySK/WindowsLiveWriter/f842ac4a449b_9B6C/_OM38%5B@O$QC@2%7BVTXN%60E9A1_2.jpg">
本例q没有什么太多的隄Q只是想H出一下类与类之间的关pR本文到此结束,有很多不之处望大家批评指正?/p>
public class Obj {
public static void main(String [] args)
{
Obj t1=new Obj();
Obj t2=new Obj();
if(t1.equals(t2))
{System.out.println("true");
}
else
{
System.out.println("false");
}
}
}
q行l果为: false
equalsҎ(gu)在这里比较的是对象的引用Q用new关键字创建的对象地址是重新分配的Q它们进行比较地址当然是不同的?
下面对上面的E序q行扩展Q?
public class Obj {
public String name;
public int age;
public void say(){
System.out.println("姓名Q?+name+" q龄Q?+age);
}
public static void main(String [] args)
{
Obj t1=new Obj();
Obj t2=new Obj();
Obj t3=new Obj();
t3=t1;
if(t1.equals(t2))
{System.out.println("true");
}
else
{
System.out.println("false");
}
t1.name="Tiny";
t1.age=20;
t1.say();
t2.name="SK";
t2.age=10;
t1.say();
t2.say();
t1=t2;
if(t1.equals(t3))
{System.out.println("true");
}
else
{
System.out.println("false");
}
t1.say();
t2.say();
t3.say();
if(t3.equals(t2))
{System.out.println("true");
}
else
{
System.out.println("false");
}
}
}
q行l果如图Q?a href="http://www.aygfsteel.com/images/blogjava_net/TinySK/WindowsLiveWriter/1bdef11c5df1_C4C4/%7DU%5D9%60G%60)M%7D7N%7B)IFQ%7B%7DXL00_2.jpg">
有关E序的具体执行,通过图例演示Q如下:
Obj t1=new Obj();
Obj t2=new Obj();
Obj t3=new Obj();
创徏Objcȝ实例Q在内存中开辟存储空间?a href="http://www.aygfsteel.com/images/blogjava_net/TinySK/WindowsLiveWriter/1bdef11c5df1_C4C4/clip_image001_2.gif">
当执行t3=t1;Ӟ内存中存储Ş式变为:
原来t3所指向的那块堆内存变为“垃䏀。由java垃圾回收机制自动回收?/p>
if(t1.equals(t2))
{···· }
else
{···· }输出l果当然?false了?/p> t1.name="Tiny";
t1.age=20;
t1.say();
t2.name="SK";
t2.age=10;
t1.say();
t2.say();
至于t1.say();和t2.say();q两条语句的l果我就不用多说了吧Q下面是关键部分Q当执行t1=t2;后内存中存储l果为:
最后执行的那几步应该就很清CQ整个程序的程到此l束?nbsp; | |
|
|