0 0

Java写的一个双向链表模板,出了点问题,应用不了自己写的内部类,却能应用String类10

package com.read.List;

public class DbLinkedList<T>  {
	//定义内部类,用作链表的节点  
    private class Node<T>  
    {  
        Node<T> pre; //指向前一个节点  
        Node<T> next; //指向后一个节点  
        T value;  //当前节点的值  
          
        public Node(T value, Node<T> next, Node<T> pre)  
        {  
            this.value = value;  
            this.next = next;  
            this.pre = pre;  
        }  
          
        public String toString()  
        {  
            return this.value + "";  
        }  
    }  
      
    public Node<T> header;  //定义头节点  
    public int size;  //定义链表的长度 
    public int flag;  //指针所在位置
      
    public DbLinkedList()  
    {  
        this.header = new Node<T>(null, null, null);//空的头节点,用来区分双向循环链表的首尾
        this.flag = 0;
        this.size = 0;
    }  
      
    public void add(T value)//在链表的尾巴上面加一个节点
    {
    	Node<T> temp=entry(size);
    	temp.value=value;
    	Node<T> next=new Node<T>(null, null, null);
    	next.pre=temp;
    	temp.next=next;
    	this.flag++;
    	this.size=this.flag;
    	       
    }
    
    public T get(int index)  
    {  
        return entry(index-1).value;  
    }  
      
    private Node<T> entry(int index) //迭代至index处的节点  
    {            
        Node<T> node = this.header;  
        for(int i=1; i<=index; i++)  
        {       	
            node = node.next;  
        }  
        
        return node;  
    }  
    
    public void clear()  
    {  
    	this.header = new Node<T>(null, null, null);
        this.size = 0;
        this.flag = 0;
    }
    
    //标志从当前位置前移一位,表示此时后进了一步
    public boolean flagpre()
    {
    	if(flag==0) //标志在第一步,不能再后退了
    	{
    		return false;
    	}    		
    	flag--;
    	return true;
    }
    
    //标志从当前位置前后一位,表示此时前进了一步
    public boolean flagnext()
    {
    	if(flag==size) //标志在最后一步,不能再后退了
    	{
    		return false;
    	}    		
    	flag++;
    	return true;
    }
    
    //在第一步时返回true
    public boolean firststep()
    {
    	if(flag==0)
    	{
    		return true;
    	}
    	return false;
    }
    
     //在最后一步时返回true
    public boolean endstep()
    {
    	if(flag==size)
    	{
    		return true;
    	}
    	return false;
    }
      
    public boolean isEmpty()  
    {  
        return this.size == 0;  
    }  
      
    public int size()  
    {  
        return this.size;  
    }  
}


package com.read.List;

public class god {
	public static class select{
		String name;
		String x;
		String y;
		select(){
			
		}
		public void clear(){
			name=null;
			x=null;
			y=null;
		}
		
	}
	public static void main(String[] args){
		DbLinkedList<select> List=new DbLinkedList<select>();
		select temp=new select();
		for(int i=0;i<5;i++)
		{
			temp.clear();
			temp.name="No."+i;
			temp.x="x="+i;
			temp.y="y="+i;
			List.add(temp);
		}
		temp=List.get(List.flag);
		System.out.println(temp.name);
		System.out.println(temp.x);
		System.out.println(temp.y);
		temp.clear();
		System.out.println(List.flag);
		List.flagpre();
		System.out.println(List.flag);
		temp=List.get(List.flag);
		System.out.println(temp.name);
		System.out.println(temp.x);
		System.out.println(temp.y);
		
		DbLinkedList<String> it=new DbLinkedList<String>();
		it.add("0");
		it.add("1");
		it.add("2");
		it.add("3");
		it.add("4");
		System.out.println(it.get(it.flag));
		it.flagpre();
		System.out.println(it.get(it.flag));
		
		
		
	}
}


控制台结果:
No.4
x=4
y=4
5
4
null
null
null
4
3
其中,temp第二次赋值失败了(3个null),it成功了(3)
ps:本人是新来的,积分少,见谅!
2014年8月09日 22:03

1个答案 按时间排序 按投票排序

0 0

采纳的答案

select temp=new select(); 
        for(int i=0;i<5;i++) 
        { 
            temp.clear(); 
            temp.name="No."+i; 
            temp.x="x="+i; 
            temp.y="y="+i; 
            List.add(temp); 
        } 
只创建了一个select对象,然后又
temp.clear(); 
输出当然是null了。
不是第二次赋值失败,而是所有的引用都指向了一个对象。Java里面的对象=赋值类似与C++中的引用,不会创建新的对象的。所有select尽管循环了五次,只有一个而已。

2014年8月09日 23:13

相关推荐

    JAVA知识点复习模板.doc

    JAVA知识点复习模板.doc 本文档提供了 JAVA 知识点复习模板,涵盖了 JAVA 的基础知识点,包括数据类型、字符串操作、异常处理、 Servlet 生命周期、集合框架、逻辑运算符、Map 接口实现等。 一、数据类型 JAVA ...

    超级有影响力霸气的Java面试题大全文档

     java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类 6、int 和 Integer 有什么区别  Java 提供两种不同的类型:引用类型和原始类型(或...

    Java入门学习笔记

    - 单继承:Java不支持多继承,即一个类只能继承自一个父类。 - 多层继承:类可以间接继承多个基类。 - 继承性:所有类都是Object类的子类。 - **7.2.2 父类(SuperClass)和子类(SubClass)的关系** - 子类继承...

    JAVA核心技术

    - **静态类**:在JAVA中,类不能直接标记为静态,但可以通过内部类的方式实现类似功能。 ##### 7.5 Singleton模式 - 实现一种设计模式,确保一个类只有一个实例,并提供一个全局访问点。 ##### 7.6 final关键字 - ...

    Java企业面试题整理及答案

    - `final` 类中的所有字段也是不可变的,这意味着一旦创建了一个 `final` 类的对象,其状态就不能被修改。 **11. 继承时候类的执行顺序问题** 继承时类的执行顺序遵循从父类到子类的原则,先执行父类构造器再执行...

    很容易弄错的java面试题

    Java编程语言以其强大的功能和广泛的应用在IT行业中占据了重要的地位,而面试时的Java问题往往能揭示应聘者对语言理解的深度和广度。"很容易弄错的Java面试题"通常涉及那些看似简单实则暗藏陷阱的问题,这些问题能够...

    Java面试题及答案(基础题122道)

    - `String`类在Java中是一个不可变类,这意味着一旦一个`String`对象被创建,其内容就不能被更改。为了提高内存效率,当需要频繁修改字符串时,建议使用`StringBuilder`或`StringBuffer`。 - `String`类提供了丰富的...

    java面试100题集

    Java面试100题集是Java开发者在求职过程中可能会遇到的常见问题的集合,这些问题涵盖了Java编程的基础到高级概念,旨在测试候选人的技术水平和实际应用能力。以下是一些关键知识点的详细解释: 1. **抽象**:在面向...

    java私塾学习笔记整理

    抽象类是不能被实例化的类,通常包含抽象方法,用于提供一个类族的共同行为的模板。 **二.接口** 接口定义了一组行为规范,通过关键字`interface`声明。 1. **接口特性**:只能包含常量和抽象方法。 2. **接口的...

    java基础笔试面试题目 Word版 经典

    String 类不能被继承,因为它的所有方法都是 final 的,确保了字符串的安全性。 3. **String 和 StringBuffer**:String 对象一旦创建就不能修改;而 StringBuffer 是可变的,适合在多线程环境中进行字符串的拼接,...

    2_中软卓越企业技术指导手册-Java方向详解版-3.6.pdf

    Java中的String类是一个不可变的类,提供了多种字符串操作方法。StringBuffer类和StringBuilder类是可变的字符串类,提供了高效的字符串操作方法。Java中的IO流分为输入流和输出流两种,输入流用于读取数据,输出流...

    java常见面试题集

    根据给定的文件标题“java常见面试题集”、描述“主要介绍java基础知识,知识面较广,适合面试时使用”以及部分内容,我们将深入解析其中提及的几个关键知识点,包括:数组、字符串、数据类型、类与对象、String与...

    学习笔记 java\CoreJava笔记\CoreJava_day15

    在Java编程语言中,Core Java是基础且至关重要的部分,涵盖了面向对象编程的基本概念、类、对象、包、异常处理、输入输出、集合框架、多线程、网络编程等多个核心主题。以下是对"CoreJava_day15"学习笔记中可能涉及...

    Java基础(韩顺平版)笔记详

    - String不是一个基本数据类型,而是一个类。 - 整型常量默认为int类型,声明long型常量需加上L或l后缀。 - 浮点型常量默认为double类型,声明float型常量需加上F或f后缀。 - 字符型(char)本质上是一个整数,...

    Java基础教程.md.pdf

    - 保证一个类只有一个实例,并提供一个全局访问点。 ##### 8.13 final修饰符 - 用于定义常量或不可变的对象。 ##### 8.14 Java抽象类 - 抽象类包含抽象方法,不能被实例化。 ##### 8.15 Java接口 - 接口是一组...

    java面试笔试题大汇总(很全面)

    - `String` 是不可变的字符串类,一旦创建后其内容不能改变。 - `StringBuffer` 是可变的字符串类,可以在原有基础上进行修改。 - 当需要频繁修改字符串时,应使用 `StringBuffer` 或者 `StringBuilder` 来提高...

    JAVA-SSH面试题

    ### JAVA-SSH面试题知识点详解 #### Java基础知识 1. **面向对象的特征** - **抽象** 抽象是面向对象编程的核心概念之一,指的是在设计阶段仅关注对象的关键属性和行为,忽略不必要的细节。它可以帮助我们构建...

    java笔试面试题汇总 基础版 最新 最全

    - **不可变性**:`String`类的对象一旦创建后,其内容不能更改。这种特性使得`String`在多线程环境下表现得更为安全。 - **可变字符串**:`StringBuilder`和`StringBuffer`提供了可修改的字符串解决方案。其中,`...

    java-code Java语言程序.zip

    在Java编程中,我们通常会将相关代码组织成一个个的类(class),并保存为.java文件。一旦编写完成,这些源代码文件会被编译成字节码(bytecode),以.class文件的形式存在,然后由Java虚拟机(JVM)执行。 1. **...

Global site tag (gtag.js) - Google Analytics