1-1-4-1-1 如何实现链表等数据结构?
发信人: Compiler (编译器), 信区: Java
标题: Re: 如何实现链表等数据结构?
发信站: BBS 水木清华站 (Fri Jan 29 22:19:32 1999)
Java中并非没有指针和引用,事实上,Java中的对象全部是由指针("引用")
在"堆"中进行内存分配的(与C++不同,后者可以在"栈"中直接生成对象,
但是这种对象不适于进行多态操作).
C++中既有指针,又有引用,指针和引用在实现上有共同点,他们的最大区别
在于,指针可以进行运算,而引用不行,所以,引用要比指针安全的多.
在很多Java的书籍中,都会出现"引用"一词.或者说Java有指针,只是
其指针不能参加运算.这两种说法在本质上是一致的.
链表等数据结构是必须由指针来完成的,但是在链表的的操作中,涉及的
是内存的分配和对象的联系,几乎不会,也不提倡使用指针加减法等运算.
所以,用Java的引用是完全可以实现的.
我认为,数据结构中指针的加减法运算主要使用鲁棒性来换取速度,
数据结构是完全可以用引用实现的.至于使用Java天然提供的predefined classes,
自然更好.
一点陋见,欢迎指正.
【 在 lenlon (九天) 的大作中提到: 】
: 在JAVA中由于没有指针和引用,无法实现许多传统的数据结构,
: 如链表、二叉树等,有没有什么变通的办法?
发信人: Winobject (无忌), 信区: Java
标题: Re: 如何实现链表等数据结构?
发信站: BBS 水木清华站 (Sun Jan 31 10:01:32 1999)
【 在 Compiler (编译器) 的大作中提到: 】
: Java中并非没有指针和引用,事实上,Java中的对象全部是由指针("引用")
>>>指针和引用是不一样的,Java 没有指针,但有引用.
>>>可以利用引用来生成链表.
: 在"堆"中进行内存分配的(与C++不同,后者可以在"栈"中直接生成对象,
: 但是这种对象不适于进行多态操作).
: C++中既有指针,又有引用,指针和引用在实现上有共同点,他们的最大区别
: 在于,指针可以进行运算,而引用不行,所以,引用要比指针安全的多.
: 在很多Java的书籍中,都会出现"引用"一词.或者说Java有指针,只是
: 其指针不能参加运算.这两种说法在本质上是一致的.
: 链表等数据结构是必须由指针来完成的,但是在链表的的操作中,涉及的
: 是内存的分配和对象的联系,几乎不会,也不提倡使用指针加减法等运算.
: 所以,用Java的引用是完全可以实现的.
: 我认为,数据结构中指针的加减法运算主要使用鲁棒性来换取速度,
: 数据结构是完全可以用引用实现的.至于使用Java天然提供的predefined classes,
: 自然更好.
: 一点陋见,欢迎指正.
发信人: proger (大飞), 信区: Java
标题: Re: 如何实现链表等数据结构?
发信站: BBS 水木清华站 (Sun Jan 31 11:40:56 1999)
当然,我就做过链表,很简单就可以实现的。用Vector太不爽了。
public class chain
{
chain next;
int content;
....
}
就可以了嘛;不过始终不太爽,因为常常会被引用和对象搞糊涂:(
【 在 Compiler (编译器) 的大作中提到: 】
: Java中并非没有指针和引用,事实上,Java中的对象全部是由指针("引用")
: 在"堆"中进行内存分配的(与C++不同,后者可以在"栈"中直接生成对象,
: 但是这种对象不适于进行多态操作).
: C++中既有指针,又有引用,指针和引用在实现上有共同点,他们的最大区别
: 在于,指针可以进行运算,而引用不行,所以,引用要比指针安全的多.
: 在很多Java的书籍中,都会出现"引用"一词.或者说Java有指针,只是
: 其指针不能参加运算.这两种说法在本质上是一致的.
: 链表等数据结构是必须由指针来完成的,但是在链表的的操作中,涉及的
: 是内存的分配和对象的联系,几乎不会,也不提倡使用指针加减法等运算.
: 所以,用Java的引用是完全可以实现的.
: 我认为,数据结构中指针的加减法运算主要使用鲁棒性来换取速度,
: 数据结构是完全可以用引用实现的.至于使用Java天然提供的predefined classes,
: 自然更好.
: 一点陋见,欢迎指正.
发信人: Compiler (编译器), 信区: Java
标题: Re: 如何实现链表等数据结构?
发信站: BBS 水木清华站 (Sun Jan 31 13:36:52 1999)
在技术实现上,指针和引用并无不同,同是对象的地址
只不过引用比指针有更强的安全性.
在很多书籍中(包括Sun)引用和指针的关系已经说明.
总的来说,引用不是指针,但是引用是不能进行运算的特殊指针.
【 在 Winobject (无忌) 的大作中提到: 】
发信人: Compiler (编译器), 信区: Java
标题: Re: 如何实现链表等数据结构?
发信站: BBS 水木清华站 (Sun Jan 31 13:39:13 1999)
【 在 proger (大飞) 的大作中提到: 】
: 当然,我就做过链表,很简单就可以实现的。用Vector太不爽了。
: public class chain
: {
:chain next;
:int content;
: ....
: }
: 就可以了嘛;不过始终不太爽,因为常常会被引用和对象搞糊涂:(
^^^^^^^^^^^^^^^没有什么,其实这里的next和指针完全一样,只是
不能进行加一,减一等运算而已.
发信人: Winobject (无忌), 信区: Java
标题: Re: 如何实现链表等数据结构?
发信站: BBS 水木清华站 (Sun Jan 31 19:34:15 1999)
【 在 Compiler (编译器) 的大作中提到: 】
: 在技术实现上,指针和引用并无不同,同是对象的地址
>>>>>指针是对象的地址的地址,即它指向对象的地址,
>>>>>引用是对象的地址,即它指向对象本身!
: 只不过引用比指针有更强的安全性.
: 在很多书籍中(包括Sun)引用和指针的关系已经说明.
: 总的来说,引用不是指针,但是引用是不能进行运算的特殊指针.
发信人: Compiler (编译器), 信区: Java
标题: Re: 如何实现链表等数据结构?
发信站: BBS 水木清华站 (Sun Jan 31 20:54:51 1999)
【 在 Winobject (无忌) 的大作中提到: 】
【 在 Compiler (编译器) 的大作中提到: 】
: 在技术实现上,指针和引用并无不同,同是对象的地址
>>>>>指针是对象的地址的地址,即它指向对象的地址,
>>>>>引用是对象的地址,即它指向对象本身!
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^这只是理解问题,在技术上,引用变量
和指针变量中存储的都是对象的首地址.
区别是编译器对他们的保护程度.
: 只不过引用比指针有更强的安全性.
: 在很多书籍中(包括Sun)引用和指针的关系已经说明.
: 总的来说,引用不是指针,但是引用是不能进行运算的特殊指针.
发信人: Winobject (无忌), 信区: Java
标题: Re: 如何实现链表等数据结构?
发信站: BBS 水木清华站 (Mon Feb1 09:51:52 1999)
【 在 Compiler (编译器) 的大作中提到: 】
: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^这只是理解问题,在技术上,引用变量
: 和指针变量中存储的都是对象的首地址.
: 区别是编译器对他们的保护程度.
否,按你的说法,对象的名与指向该对象的指针将没有区别!
举个例子:
对象A,对象的引用A_ref,指向该对象的指针A_point,首先,
它们实际上均是符号地址,假设对象A在内存中的首地址为B243:1000;
则A为B243:1000,A_ref也为B243:1000,而A_point则可以为一
随意地址,假设为B243:1200;只要该地址中的内容为B243:1000.
所以 ,引用是直接的指向对象,相当于对象的别名,指针是间接的
指向对象.
发信人: Compiler (编译器), 信区: Java
标题: Re: 如何实现链表等数据结构?
发信站: BBS 水木清华站 (Mon Feb1 10:17:54 1999)
【 在 Winobject (无忌) 的大作中提到: 】
【 在 Compiler (编译器) 的大作中提到: 】
: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^这只是理解问题,在技术上,引用变量
: 和指针变量中存储的都是对象的首地址.
: 区别是编译器对他们的保护程度.
>否,按你的说法,对象的名与指向该对象的指针将没有区别!
>举个例子:
>对象A,对象的引用A_ref,指向该对象的指针A_point,首先,
>它们实际上均是符号地址,假设对象A在内存中的首地址为B243:1000;
>则A为B243:1000,A_ref也为B243:1000,而A_point则可以为一
>随意地址,假设为B243:1200;只要该地址中的内容为B243:1000.
>所以 ,引用是直接的指向对象,相当于对象的别名,指针是间接的
>指向对象.
在32位系统中,A_ref和A_point同为32位的变量.他们的地址都是任意的.只要其
内容是B234:1000即可.A_point是一个独立的变量,它的地址同A_ref一样是编译
器分配的,并不与其指向的内容相同.
发信人: proger (大飞), 信区: Java
标题: Re: 如何实现链表等数据结构?
发信站: BBS 水木清华站 (Tue Feb2 21:02:06 1999)
如果在java中有:
MyClass mc;
那么mc的内容就是MyClass的地址。
从mc=new MyClass();可以知道它就是一个指针。只是在用mc.MyValue1时,
解释器自动理解为指针指向的内容罢了。初用java时被她这个特性搞糊涂过。
【 在 Compiler (编译器) 的大作中提到: 】
: 在32位系统中,A_ref和A_point同为32位的变量.他们的地址都是任意的.只要其
: 内容是B234:1000即可.A_point是一个独立的变量,它的地址同A_ref一样是编译
: 器分配的,并不与其指向的内容相同.
发信人: qinsj (qinsj), 信区: Java
标题: Re: 如何实现链表等数据结构?
发信站: BBS 水木清华站 (Thu Feb4 20:21:34 1999)
【 在 Compiler (编译器) 的大作中提到:
JAVA 是可以实现链表的,如:
public class Node{
int data;
Node prvNode;
Node nextNode;
public Node(int data){
this.data = data;
prvNode = null;
nextNode = null;
}
}
...
public class NodeList{
protected Node node;
public void list(){
if(node == null)return;
for(Node n = node; n != null; n = n.nextNode){
System.out.println("data = "+n.data);
}
}
public void addNode(Node n){
if(node = null)
node = n;
else{
node.prvNode = n;
node = n;
}
}
public void deleteNode(Node n){
if(Node nod = node,prv = null;nod != null;
prv = nod,nod = nod.nextNOde){
if(node.equals(n)){
if(prv != null){
prv.nextNode = nod.nextNode;
}else{
node = nod.nextNode;
}
break;
}
}
}
}
望适当修改.
发信人: Compiler (编译器), 信区: Java
标题: Re: 如何实现链表等数据结构?
发信站: BBS 水木清华站 (Thu Feb4 21:22:28 1999)
正是,推荐电子工业出版社的<<Java算法>>,Scott Robert Ladd著
页:
[1]