java参数是如何传递的

java参数是如何传递的
java参数是如何传递的

java参数是如何传递的

总的来说,计算机语言给子程序传递参数的方法有两种。第一种方法是按值传递(call-by-value )。这种方法将一个参数值(value )复制成为子程序的正式参数。这样,对子程序的参数的改变不影响调用它的参数。第二种传递参数的方法是引用调用(call-by-reference )。在这种方法中,参数的引用(而不是参数值)被传递给子程序参数。在子程序中,该引用用来访问调用中指定的实际参数。这样,对子程序参数的改变将会影响调用子程序的参数。你将看到,根据传递的对象不同,Java 将使用这两种不同的方法。

在Java 中,当你给方法传递一个简单类型时,它是按值传递的。因此,接收参数的子程序参数的改变不会影响到该方法之外。例如,看下面的程序:

// Simple types are passed by value.

class Test {

void meth(int i,int j) { i *= 2;j /= 2;

}

}

class CallByValue {

public static void main(String args[]) {

Test ob = new Test();

int a = 15,b = 20;

System.out.println("a and b before call: " +a + " " + b);

ob.meth(a,b);

System.out.println("a and b after call: " +a + " " + b);

}

}

该程序的输出如下所示:

a and

b before call: 15 20

a and

b after call: 15 20

可以看出,在meth( ) 内部发生的操作不影响调用中a和b的值。它们的值没在本例中没有变为30和10。

当你给方法传递一个对象时,这种情形就会发生戏剧性的变化,因为对象是通过引用传递的。记住,当你创建一个类类型的变量时,你仅仅创建了一个类的引用。因此,当你将这个引用传递给一个方法时,接收它的参数将会指向该参数指向的同一个对象。这有力地证明了对象是通过引用调用传递给方法的。该方法中对象的改变确实影响了作为参数的对象。例如,考虑下面的程序:

// Objects are passed by reference.

class Test { int a,b;

Test(int i,int j) {a = i;b = j;

}

// pass an object

void meth(Test o) {

o.a *= 2;

o.b /= 2;

}

}

class CallByRef {public static void main(String args[]) { Test ob = new Test(15,20);

System.out.println("ob.a and ob.b before call: " +

ob.a + " " + ob.b);

ob.meth(ob);

System.out.println("ob.a and ob.b after call: " +

ob.a + " " + ob.b);

}

}

该程序产生下面的输出:

ob.a and ob.b before call: 15 20

ob.a and ob.b after call: 30 10

正如你所看到的,在这个例子中,在meth ( ) 中的操作影响了作为参数的对象。

有趣的一点是,当一个对象引用被传递给方法时,引用本身使用按值调用被传递。但是,因为被传递的值指向一个对象,该值的拷贝仍然指向它相应的参数所指向的同一个对象。

注意:当一个简单类型传递给一个方法时,使用按值传递。对象传递则按引用传递。

企业管理使企业的运作效率大大增强;让企业有明确的发展方向;使每个员工都充分发挥他们的潜能;向顾客提供满意的产品和服务;树立企业形象。管理就是效益。企业管理能增强企业竞争力。企业管理的意义:

1,企业管理可以增强企业的运作效率;

2,可以让企业有明确的发展方向;

3,可以使每个员工都充分发挥他们的潜能;

4,可以使企业财务清晰,资本结构合理,投融资恰当;

5,可以向顾客提供满足的产品和服务;

6,可以更好的树立企业形象,为社会多做实际贡献。

最终目的是提高企业的经济效益。

Java中传值与传引用的三种情况

java传值与传引用的三种情况大家先看一个例子: public class Example{ String str=new String("good"); char[]ch={'a','b','c'}; public static void main(String args[]){ Example ex=new Example(); ex.change(ex.str,ex.ch); System.out.print(ex.str+" and "); System.out.print(ex.ch); } public void change(String str,char ch[]){ str="test ok"; ch[0]='g'; } } 看看输出结果? good and gbc java中没有了c++中这样的引用符号,也没像c#中那样提供了out与ref 那么它是怎么做的呢 做什么事情都要去除例外的东西,String类就是此类问题的一个特殊情况 为什么特殊呢?

因为它是一个引用类型,确执行的是值传递。这样说有些抽象,还是举个例子吧 值传递: class Str { public static void main(String[] args) { int i = 900; System.out.println(i); changeInt(i); System.Out.println(i); } public static void changeInt(int s) { s = 34234; } } 结果: 900 900 这就是所谓的值传递。i把自己的副本给了函数changeInt的形参,而在changeInt中虽然将s赋值34234。但是对原来的i值并没有影响,因为它所修改的只是i的copy品而已。

Java

第1章 Java概述 1.1 练习 1、理解Java语言的“完全面向对象”、“解释性”、“可移植性”、“内 存动态管理”的特点。 2、搭建Java运行环境,并写一个Java程序打印出“我一定把Web程序设计学好!”; 3、理解Java程序的运行过程即JVM工作原理; 4、有一个Java源文件A.java,编译源文件和运行class文件的命令是什么? 5、修正Test1.java、Test2.java、Test3.java、Test4.java四个java源 文件中的错误,使其能够编译和运行; ① Test1.j ava源程序。 public class Test1 { public static void main(String[] args) { System.out.println("What's wrong with this program?"); } } public class TestAnother1 { public static void main(String[] args) { System.out.println("What's wrong with this program?"); } } ② Test2.java public class Testing2 { public static void main(String[] args) { System.out.println("What's wrong with this program?"); } } ③ Test3.java public class Test3 { public static void main(String args) { System.out.println("What's wrong with this program?"); } } ④Test4.java public class Test4 { public void main(String[] args) {

java中的值传递和引用传递

转载 原文地址:https://www.360docs.net/doc/6d5461985.html,/clara/archive/2011/09/17/2179493.html Java中的值传递和引用传递 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答:是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本。指向同一个对象,对象的内容可以在被调用的方法中改变,但对象的引用(不是引用的副本)是永远不会改变的。 Java参数,不管是原始类型还是引用类型,传递的都是副本(有另外一种说法是传值,但是说传副本更好理解吧,传值通常是相对传址而言)。 如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的。如果在函数中改变了副本的值不会改变原始的值. 如果参数类型是引用类型,那么传过来的就是这个引用参数的副本,这个副本存放的是参数的地址。如果在函数中没有改变这个副本的地址,而是改变了地址中的值,那么在函数内的改变会影响到传入的参数。如果在函数中改变了副本的地址,如new一个,那么副本就指向了一个新的地址,此时传入的参数还是指向原来的地址,所以不会改变参数的值。 例: 1public class ParamTest { 2public static void main(String[] args){ 3/** 4 * Test 1: Methods can't modify numeric parameters 5 */ 6 System.out.println("Testing tripleValue:"); 7double percent = 10; 8 System.out.println("Before: percent=" + percent); 9 tripleValue(percent); 10 System.out.println("After: percent=" + percent); 11 12/** 13 * Test 2: Methods can change the state of object parameters 14 */ 15 System.out.println("\nTesting tripleSalary:"); 16 Employee harry = new Employee("Harry", 50000);

Java虚拟机工作原理(JVM)

As the Java V irtual Machine is a stack-based machine, almost all of its instructions involve the operand stack in some way. Most instructions push values, pop values, or both as they perform their functions. Java虚拟机是基于栈的(stack-based machine)。几乎所有的java虚拟机的指令,都与操作数栈(operand stack)有关.绝大多数指令都会在执行自己功能的时候进行入栈、出栈操作。 1Java体系结构介绍 Javaís architecture arises out of four distinct but interrelated technologies, each of which is defined by a separate specification from Sun Microsystems: 1.1 Java体系结构包括哪几部分? Java体系结构包括4个独立但相关的技术 the Java programming language →程序设计语言 the Java class file format →字节码文件格式 the Java Application Programming Interface→应用编程接口 the Java V irtual Machine →虚拟机 1.2 什么是JVM java虚拟机和java API组成了java运行时。 1.3 JVM的主要任务。 Java虚拟机的主要任务是装载class文件并执行其中的字节码。 Java虚拟机包含了一个类装载器。 类装载器的体系结构 二种类装载器 启动类装载器 用户定义的类装载器 启动类装载器是JVM实现的一部分 当被装载的类引用另外一个类时,JVM就是使用装载第一个类的类装载器装载被引用的类。 1.4 为什么java容易被反编译? ●因为java程序是动态连接的。从一个类到另一个类的引用是符号化的。在静态连接的 可执行程序中。类之间的引用只是直接的指针或者偏移量。相反在java的class文件中,指向另一个类的引用通过字符串清楚的标明了所指向的这个类的名字。

函数调用参数传递类型(java)的用法介绍.

函数调用参数传递类型(java)的用法介绍. java方法中传值和传引用的问题是个基本问题,但是也有很多人一时弄不清。 (一)基本数据类型:传值,方法不会改变实参的值。 public class TestFun { public static void testInt(int i){ i=5; } public static void main(String[] args) { int a=0 ; TestFun.testInt(a); System.out.println("a="+a); } } 程序执行结果:a=0 。 (二)对象类型参数:传引用,方法体内改变形参引用,不会改变实参的引用,但有可能改变实参对象的属性值。 举两个例子: (1)方法体内改变形参引用,但不会改变实参引用,实参值不变。 public class TestFun2 { public static void testStr(String str){ str="hello";//型参指向字符串“hello” } public static void main(String[] args) { String s="1" ;

TestFun2.testStr(s); System.out.println("s="+s); //实参s引用没变,值也不变 } } 执行结果打印:s=1 (2)方法体内,通过引用改变了实际参数对象的内容,注意是“内容”,引用还是不变的。 import java.util.HashMap; import java.util.Map; public class TestFun3 { public static void testMap(Map map){ map.put("key2","value2");//通过引用,改变了实参的内容 } public static void main(String[] args) { Map map = new HashMap(); map.put("key1", "value1"); new TestFun3().testMap(map); System.out.println("map size:"+map.size()); //map内容变化了 } } 执行结果,打印:map size:2 。可见在方法testMap()内改变了实参的内容。 (3)第二个例子是拿map举例的,还有经常涉及的是 StringBuffer : public class TestFun4 {

Java的数据结构相关的类实现原理

Java的数据结构相关的类实现原理 List接口 List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。 和下面要提到的Set不同,List允许有相同的元素。 除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历。 实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。 LinkedList List 接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括 null)。除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列或双端队列。 此类实现 Deque 接口,为 add、poll 提供先进先出队列操作,以及其他堆栈和双端队列操作。 所有操作都是按照双重链接列表的需要执行的。在列表中编索引的操作将从开头或结尾遍历列表(从靠近指定索引的一端)。 注意,此实现不是同步的。如果多个线程同时访问一个链接列表,而其中至少一个线程从结构上修改了该列表,则它必须保持外部同步。(结构修改指添加或删除一个或多个元素的任何操作;仅设置元素的值不是结构修改。)这一般通过对自然封装该列表的对象进行同步操作来完成。如果不存在这样的对象,则应该使 用 Collections.synchronizedList 方法来“包装”该列表。最好在创建时完成这一操作,以防止对列表进行意外的不同步访问,如下所示: List list = Collections.synchronizedList(new LinkedList(...)); 此类的 iterator 和 listIterator 方法返回的迭代器是快速失败的:在迭代器创建之后,如果从结构上对列表进行修改,除非通过迭代器自身的remove 或 add 方法,其他任何时间任何方式的修改,迭代器都将抛 出 ConcurrentModificationException。因此,面对并发的修改,迭代器很快就会完全失败,而不冒将来不确定的时间任意发生不确定行为的风险。 注意,迭代器的快速失败行为不能得到保证,一般来说,存在不同步的并发修改时,不可能作出任何硬性保证。快速失败迭代器尽最大努力抛出ConcurrentModificationException。因此,编写依赖于此异常的程序的方式是错误的,正确做法是:迭代器的快速失败行为应该仅用于检测程序错误。 ArrayList

java web拦截器配置及原理

java web 过滤器 (2013-03-01 10:04:24)本人转载收藏 ServletFilter,Servlet过滤器: Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术可以对web服务器管理的所有web资源:Jsp, Servlet, 静态图片文件或静态html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL 级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。ServletAPI提供了一个Filter接口,实现这个接口的Servlet就是一个过虑器。过虑器在WEB应用访问流程中如下: 由图可见,只要我们编写了过滤器,可以对一切访问WEB应用的连接进行过滤。比如,用户访问权限、统一WEB编码… Filter是如何实现拦截的? 实现了Filter接口的Servlet是过滤器,因为Filter接口有一个 doFilter(ServletRequest request, ServletResponse response, FilterChain chain)方法,只要用户访问我们在web.xml中配置的映射目录,服务器便会调用过滤器的doFilter方法。我们在这里实现过虑功能代码,当我们调用 chain.doFilter(request, response);方法时,将请求反给服务器服务器再去调用相当的Servlet。如果我们不调用此方法,说明拒绝了用户的请求。 Filter开发入门: 在WEB应用中添加一个过滤器,有两步工作需要完成: 1.编写实现了Filter接口的Servlet——过滤器。 2.在web.xml中配置过滤器: (1). 标签添加器 (2). 注册过滤器的映射目录(过滤目录),与注册Servlet一样。 在实际WEB应用中,我们可能需要编写多个过虑器,比如:1.统一WEB编码的过滤器(过虑所有访问)2.用户访问权限管理。这样,用户的访问需要选经过过滤器1过滤然后再经过过滤器2过滤。doFilter中有一个FilterChain参数,这个参数是服务器根据web.xml中配置的过滤器,按照先后顺序生成的过滤器链。当我们在doFilter方法中调用chain.doFilter(request, response);方法时,服务器会查找过滤链中是否还有过滤器,如果有继续调用下一个过滤器,如果没有将调用相应的Servlet处理用户请求。 Filter接口的其他细节: 1.Filter的Init(FilterConfig filterConfig)方法: 与Servlet的Init方法一样,在创建时被调用,之后被保存在内存中直至服务器重启或关闭时Filter实例才会被销毁。与Servlet不同之处在于,服务器启动时就会实例化所有Filter,而Servlet中有当用户第一次访问它时才会被实例化。我们通过在web.xml使用对Filter配置的初始化参数,可以通过FilterConfig来获得。 FilterConfig的方法有: String getFilterName():得到filter的名称。

java参数传递(经典)

java参数传递(超经典) (2009-02-20 14:47:22)转载 分类:Java 标签:杂 谈 Java中的参数传递机制一直以来大家都争论不休,究竟是“传值”还是“传址(传引用)”,争论的双方各执一词,互不相让。不但“菜鸟”们一头雾水,一些“老鸟”也只知道结果却说不出所以然来。我相信看过下面的内容后,你就会明白一些。 先看基本类型作为参数传递的例子: public class Test1 { public static void main(String[] args) { int n = 3; System.out.println("Before change, n = " + n); changeData(n); System.out.println("After changeData(n), n = " + n); } public static void changeData(int nn) { n = 10; } } 我想这个例子大家都明白,基本类型作为参数传递时,是传递值的拷贝,无论你怎么改变这个拷贝,原值是不会改变的,输出的结果证明了这一点: Before change, n = 3 After changeData(n), n = 3 那么,我们现在来看看对象作为参数传递的例子,这也是大家争论的地方。public class Test2 { public static void main(String[] args) { StringBuffer sb = new StringBuffer("Hello "); System.out.println("Before change, sb = " + sb); changeData(sb); System.out.println("After changeData(n), sb = " + sb); } public static void changeData(StringBuffer strBuf) {

Java基础之映射表

映射表 Java类库为映射表提供了两个通用的实现:HashMap和TreeMap。这两个类都实现了Map接口。 散列映射表对键进行散列,树映射表用键的整体对元素进行排序,并将其组织成搜索树。 每当往映射表中添加对象时,必须同时提供一个键。 要想检索一个对象,必须也提供一个键。 1常见操作: V put(K key,V value)(键可以为null,但值不能为null) V get(K key) V remove(K key) boolean containsKey(Object key) 如果在映射表中应经有这个键,返回true boolean containsValue(Object value) 如果在映射表中应经有这个值,返回true size方法用于返回映射表中的元素数。 2举例: HashMapitems=new HashMap(); items.put(src.charAt(i),1); items.containsKey(src.charAt(i) 3HashMap的底层实现原理 在Java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。 一个线性的数组怎么实现按键值对来存取数据呢?这里HashMap有做一些处理。 首先HashMap里面实现一个静态内部类Entry,基本结构它包含三个类key,value和指向下一个Entity的next,我们上面说到HashMap的基

总结Java方法(函数)传值和传引用的问题

总结Java方法(函数)传值和传引用的问题 java方法中传值和传引用的问题是个基本问题,但是也有很多人一时弄不清。 (一)基本数据类型:传值,方法不会改变实参的值。 public class TestFun { public static void testInt(int i){ i=5; } public static void main(String[] args) { int a=0 ; TestFun.testInt(a); System.out.println("a="+a); } } 程序执行结果:a=0 。 (二)对象类型参数:传引用,方法体内改变形参引用,不会改变实参的引用,但有可能改变实参对象的属性值。 举两个例子: (1)方法体内改变形参引用,但不会改变实参引用,实参值不变。 public class TestFun2 { public static void testStr(String str){ str="hello";//型参指向字符串“hello” } public static void main(String[] args) { String s="1" ;

TestFun2.testStr(s); System.out.println("s="+s); //实参s引用没变,值也不变 } } 执行结果打印:s=1 (2)方法体内,通过引用改变了实际参数对象的内容,注意是“内容”,引用还是不变的。 import java.util.HashMap; import java.util.Map; public class TestFun3 { public static void testMap(Map map){ map.put("key2","value2");//通过引用,改变了实参的内容 } public static void main(String[] args) { Map map = new HashMap(); map.put("key1", "value1"); new TestFun3().testMap(map); System.out.println("map size:"+map.size()); //map内容变化了 } } 执行结果,打印:map size:2 。可见在方法testMap()内改变了实参的内容。 (3)第二个例子是拿map举例的,还有经常涉及的是 StringBuffer : public class TestFun4 {

Java开发中的Memcache原理及实现

Java开发中的Memcache原理及实现 作者:jiaxiaoyuan1204 整理:chaijunkun 来源:https://www.360docs.net/doc/6d5461985.html,/

一、概述 1. Memcache是什么 Memcache(Memcached)是集群环境下的缓存解决方案。 Memcache是https://www.360docs.net/doc/6d5461985.html,的一个项目,最早是为LiveJournal 服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力。它可以应对任意多个连接,使用非阻塞的网络IO。它的工作机制是在内存中开辟一块空间,然后建立一个HashTable,Memcached自管理这些HashTable。 Memcache官方网站:https://www.360docs.net/doc/6d5461985.html,/memcached,更多详细的信息可以来这里了解。 2. 为什么会有Memcache和memcached两种名称 其实Memcache是这个项目的名称,而memcached是它服务器端的主程序文件名,知道我的意思了吧。一个是项目名称,一个是主程序文件名,在网上看到了很多人不明白,于是混用了。 3. 如何在Java开发中使用Memcache 在Java开发中使用Memcache,一般要用到以下几个程序: 1) Memcached 该程序用来在Linux或Windows服务器上建立和管理缓存。 其项目网址为:https://www.360docs.net/doc/6d5461985.html,/memcached/。 2) Magent Magent是一款开源的Memcached代理服务器软件,使用它可以搭建高可用性的集群应用的Memcached服务,其项目网址为:https://www.360docs.net/doc/6d5461985.html,/p/memagent/。 3) Memcached客户端程序 至于Memcached的客户端程序,一般推荐用memcached client for java,为什么推荐用这种客户端,后面会讲到具体的原因,其项目的网址为: https://www.360docs.net/doc/6d5461985.html,/gwhalin/Memcached-Java-Client/。 4)其它程序 i. Libevent 在Linux环境下应用Memcache时,Memcache用到了libevent这个库,用于Socket的处理,所以还需要安装libevent。libevent的最新版本是libevent-1.4.13。(如果你的系统已经安装了libevent,可以不用安装)。 官网:https://www.360docs.net/doc/6d5461985.html,/~provos/libevent/ 下载:https://www.360docs.net/doc/6d5461985.html,/~provos/libevent-1.4.13-stable.tar.gz ii. Windows下的安装程序 Memcache也可以安装在Windows服务器下,安装程序:memcached-1.2.1-win32.zip

UML模型与Java语言之间的代码映射关系分析

龙源期刊网 https://www.360docs.net/doc/6d5461985.html, UML模型与Java语言之间的代码映射关系分析 作者:刘洁 来源:《硅谷》2013年第08期 摘要 UML是在多种面向对象建模方法的基础上发展起来的建模语言,它不是一门程序设计语言。但却可以将UML模型映射为多种程序设计语言代码,也可以使用逆向生成器工具将程序源代码转换为UML模型。本文浅析了类图、状态图、组件图三种模型与Java语言之间的代码映射关系。 关键词 UML;代码映射;建模 中图分类号:TP393 文献标识码:A 文章编号:1671—7597(2013)042-082-02 统一建模语言(Unified Modeling Language,UML)是一种通用的可视化面向对象的建模语言,适用于对任何面向对象的事物的建模。虽然UML不是一门程序设计语言。但可以将UML模型映射为多种程序设计语言代码,也可以使用逆向生成器工具将程序源代码转换为UML模型。 1 类图与Java代码之间的映射 类图是用来显示系统中的类、接口以及它们之间的静态结构和关系的一种静态模型,它用于描述系统的结构。类图的建模贯穿系统的分析和设计阶段的始终,通常从商务伙伴能够理解的用例开始建模,最终成为只有开发小组能够完全理解的类。 面向对象的系统中充满着各种不同的对象,它们相互协作完成各种不同的任务。与之对应的类之间也存在着多种关系。以Java编程语言为例,如图1所示双向关联关系(1..*,*)的 类图与Java代码的映射如下。 2 状态图与Java代码之间的映射 状态图是对单个对象建模,描述某个对象所处的各种可能状态以及这些状态之间的转移。状态图映射成代码的方法如下: 1)将不同状态作为常数枚举,把当前状态存储在适当的数据成员中。 2)依赖于状态的操作可以用开关语句对每个状态分别设一个case实现。每个case表示来自特定状态,用相应的消息表示转换。

java集合详解

集合 版本号:1.0 作者:huangdos 日期:2006年6月06日

摘要 摘要内容 Java里面最重要,最常用也就是集会一部分了。能够用好集合和理解好集合对于做Java程序的开发拥有无比的好处。本文详细解释了关于Java中的集合是如何实现的,以及他们的实现原理。 关键字: Collection , List ,Set , Map , 集合,框架。

目录 1集合框架 (2) 1.1集合框架概述 (2) 1.1.1容器简介 (2) 1.1.2容器的分类 (3) 1.2C OLLECTION (5) 1.2.1常用方法 (5) 1.2.2迭代器 (8) 1.3L IST (10) 1.3.1概述 (10) 1.3.2常用方法 (10) 1.3.3实现原理 (14) 1.4M AP (18) 1.4.1概述 (18) 1.4.2常用方法 (18) 1.4.3Comparable 接口 (23) 1.4.4实现原理 (24) 1.4.5覆写hashCode() (29) 1.5S ET (32) 1.5.1概述 (32) 1.5.2常用方法 (33) 1.5.3实现原理 (36) 1.6总结:集合框架中常用类比较 (38) 2练习 (38) 3附录:排序 (40)

集合 1集合框架 1.1集合框架概述 1.1.1容器简介 到目前为止,我们已经学习了如何创建多个不同的对象,定义了这些对象以后,我们就可以利用它们来做一些有意义的事情。 举例来说,假设要存储许多雇员,不同的雇员的区别仅在于雇员的身份证号。我们可以通过身份证号来顺序存储每个雇员,但是在内存中实现呢?是不是要准备足够的内存来存储1000个雇员,然后再将这些雇员逐一插入?如果已经插入了500条记录,这时需要插入一个身份证号较低的新雇员,该怎么办呢?是在内存中将500条记录全部下移后,再从开头插入新的记录? 还是创建一个映射来记住每个对象的位置?当决定如何存储对象的集合时,必须考虑如下问题。 对于对象集合,必须执行的操作主要以下三种: ◆添加新的对象 ◆删除对象 ◆查找对象 我们必须确定如何将新的对象添加到集合中。可以将对象添加到集合的末尾、开头或者中间的某个逻辑位置。 从集合中删除一个对象后,对象集合中现有对象会有什么影响呢?可能必须将内存移来移去,或者就在现有对象所驻留的内存位置下一个“洞”。 在内存中建立对象集合后,必须确定如何定位特定对象。可建立一种机制,利用该机制可根据某些搜索条件(例如身份证号)直接定位到目标对象;否则,便需要遍历集合中的每个对象,直到找到要查找的对象为止。 前面大家已经学习过了数组。数组的作用是可以存取一组数据。但是它却存在一些缺点,使得无法使用它来比较方便快捷的完成上述应用场景的要求。 1.首先,在很多数情况下面,我们需要能够存储一组数据的容器,这一点虽然数组可以实现,但是如果我们 需要存储的数据的个数多少并不确定。比如说:我们需要在容器里面存储某个应用系统的当前的所有的在线用户信息,而当前的在线用户信息是时刻都可能在变化的。也就是说,我们需要一种存储数据的容器,它能够自动的改变这个容器的所能存放的数据数量的大小。这一点上,如果使用数组来存储的话,就显得十分的笨拙。 2.我们再假设这样一种场景:假定一个购物网站,经过一段时间的运行,我们已经存储了一系列的购物清单 了,购物清单中有商品信息。如果我们想要知道这段时间里面有多少种商品被销售出去了。那么我们就需要一个容器能够自动的过滤掉购物清单中的关于商品的重复信息。如果使用数组,这也是很难实现的。 3.最后再想想,我们经常会遇到这种情况,我知道某个人的帐号名称,希望能够进一步了解这个人的其他的 一些信息。也就是说,我们在一个地方存放一些用户信息,我们希望能够通过用户的帐号来查找到对应的该用户的其他的一些信息。再举个查字典例子:假设我们希望使用一个容器来存放单词以及对于这个单词的解释,而当我们想要查找某个单词的意思的时候,能够根据提供的单词在这个容器中找到对应的单词的解释。如果使用数组来实现的话,就更加的困难了。 为解决这些问题,Java里面就设计了容器集合,不同的容器集合以不同的格式保存对象。

java参数是如何传递的

java参数是如何传递的 总的来说,计算机语言给子程序传递参数的方法有两种。第一种方法是按值传递(call-by-value )。这种方法将一个参数值(value )复制成为子程序的正式参数。这样,对子程序的参数的改变不影响调用它的参数。第二种传递参数的方法是引用调用(call-by-reference )。在这种方法中,参数的引用(而不是参数值)被传递给子程序参数。在子程序中,该引用用来访问调用中指定的实际参数。这样,对子程序参数的改变将会影响调用子程序的参数。你将看到,根据传递的对象不同,Java 将使用这两种不同的方法。 在Java 中,当你给方法传递一个简单类型时,它是按值传递的。因此,接收参数的子程序参数的改变不会影响到该方法之外。例如,看下面的程序: // Simple types are passed by value. class Test { void meth(int i,int j) { i *= 2;j /= 2; } } class CallByValue { public static void main(String args[]) { Test ob = new Test(); int a = 15,b = 20; System.out.println("a and b before call: " +a + " " + b); ob.meth(a,b); System.out.println("a and b after call: " +a + " " + b); } } 该程序的输出如下所示: a and b before call: 15 20 a and b after call: 15 20 可以看出,在meth( ) 内部发生的操作不影响调用中a和b的值。它们的值没在本例中没有变为30和10。 当你给方法传递一个对象时,这种情形就会发生戏剧性的变化,因为对象是通过引用传递的。记住,当你创建一个类类型的变量时,你仅仅创建了一个类的引用。因此,当你将这个引用传递给一个方法时,接收它的参数将会指向该参数指向的同一个对象。这有力地证明了对象是通过引用调用传递给方法的。该方法中对象的改变确实影响了作为参数的对象。例如,考虑下面的程序: // Objects are passed by reference. class Test { int a,b; Test(int i,int j) {a = i;b = j; } // pass an object void meth(Test o) {

JAVA集合之Map映射深刻总结案例附上解释跟总结

Java集合系列之Map映射学习总结一.HashMap实例 案例1:HashMapDemo1 package Map映射; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; /** * 顺序结构 * 基于哈希表的Map 接口的实现。 * 键和值都允许是null,值可以重复。 * 无序的 * 线程不安全的。(不同步) * 遍历无序输出. * 和Set集一样,没有for循环遍历的方法。 * 遍历Map方法有两种: * ①调用keySet方法: * Set keys = map.keySet(); * Iterator it = keys.iterator(); * ②调用entrySet方法: * Set keys = map.entrySet(); * Iterator it = keys.iterator(); * 本例子遍历的是基本类型 * */ public class HashMapDemo1 { public static void main(String[] args) { HashMap map = new HashMap(); map.put(1, 111); map.put("1", "上海"); map.put(5, "广州"); map.put(3, "西安"); map.put(null,"武汉"); //键允许是null map.put(2, null);//值允许是null map.put(null,null);//键和值都允许是null,会替换前面的null:武汉. System.out.println("**********迭代器遍历调用keySet方法*********"); Set keys = map.keySet();//获取所有的键,放入一个集合中 Iterator it = keys.iterator();//取得迭代器才可以遍历 //遍历出来的结果是无序的。

java参数传递时到底是值传递还是引用传递

java参数传递时到底是值传递还是引用传递(baidu搜集) 最近比较长一段时间以来,网上的IT同行里面比较流行“JAVA面试32问”,很多人的BLOG里都引用这些面试题,最近因为工作内容比较枯燥,也来看看这些试题以调节一下口味,其中有一道题让我很费解。 原题是:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 用google查询结果,得到答案基本上是:值传递。当时觉得挺纳闷儿,为什么连参数的内容都被修改了,怎么还能说是“值传递”呢?因为在传统的印象里(尤其是从C++过来以后),值传递都应该是不改变原参数的。 问问周围的同事,也大都这么讲,但是也都讲不清这种理论的根源是什么。我这个人有个毛病,有事情想不通时就会憋得难受,后来在《Thinking in Java》的一段内容(注解[1])里找到了自己的结论,我认为(《Thinking in Java》的作者也这么认为):可以说是值传递,也可以说是引用传递。 一,认为是值传递。得出这种结论的前提必须是“参数的值就是对该对象的引用,而不是对象的内容”,这句话可能有些费解,举个例子加以说明。 public class Paier { public static void main(String[] args) { Paier paier = new Paier(); paier.test();

} public void test() { TestClass para1 = new TestClass(); para1.setTest(new Integer(10)); TestClass result1 = test1(para1); System.out.println("para1 = " + para1.getTest()); System.out.println("result1 = " + result1.getTest()); TestClass para2 = new TestClass(); para2.setTest(new Integer(10)); TestClass result2 = test2(para2); System.out.println("para2 = " + para2.getTest()); System.out.println("result2 = " + result2.getTest()); } public TestClass test1(TestClass t) {

综合案例:数据表与简单Java类映射

1、综合案例:数据表与简单Java类映射 2、知识点 2.1、上次课程的主要知识点 内部类的定义及使用。 2.2、本次预计讲解的知识点 利用实际的数据表实现表与类的操作转换。 3、具体内容(★★★★★) 简单Java类是整个项目开发中的灵魂所在,它有自己严格的开发标准,而最为重要的是它需要与数据表是完全对应的,不过考虑到现在没有接触到过多的程序设计的功能。所以对于此处的访问就有一些限制,要求可以完成如下的两类操作: ·第一步:可以根据数据表定义的结构关系进行数据以及引用的设置; ·第二步:根据数据表的结构可以取出所需要的数据。 本次选用一个最熟悉的数据表结构:dept、emp实现这样的转换操作。现在的开发要求如下:

1、本次开发使用以下的数据表与表中的字段: ·雇员表(emp):empno、ename、job、sal、comm、mgr、deptno; ·部门表(dept):deptno、dname、loc。 2、数据的操作要求: ·根据表结构完整的设置雇员、经理、部门的关系; ·可以完成如下的内容输出: |- 可以输出一个雇员的完整信息,包括雇员的领导、以及所在的部门信息; |- 可以输出一个部门的完整信息,以及这个部门的所有雇员信息,以及这个雇员的领导信息。第一步:写出基本字段的映射转换 ·雇员表(emp):empno、ename、job、sal、comm; ·部门表(dept):deptno、dname、loc。

第二步:设计关系字段 本程序存在有两个关系: ·自身关联:mgr字段,mgr也是一个雇员; ·外键关联:deptno字段。

第三步:执行数据操作 ·设置数据的关系; ·取出雇员的完整数据:

Java值传递和引用

java语言深入(java中是传值还是引用) 关键字: java基础深入 熟悉C的程序员都用过指针,对指针可谓爱之深恨之切。指针是指向一块内存地址的内存数据(有些拗口),也就是说指针本身是一个占用4字节内存的int(32 位系统内),而这个int值恰恰又是另一块内存的地址。比如"hello"这个字串,存放在@0x0000F000这个地址到@0x0000F005这段内存区域内(包括0x00的结束字节)。而在@0x0000FFF0到@0x0000FFF03这四个字节内存放着一个int,这个int的值是@0x0000F000。这样就形成了一个指向"hello"字串的指针。 在Java中,很多人说没有指针,事实上,在Java更深层次里,到处都是大师封装好的精美绝伦的指针。为了更容易的讲解Java 中关于类和类型的调用,Java中出现了值与引用的说法。浅显的来说,我们可以认为Java中的引用与C中的指针等效(其实差别非常非常大,但是为了说明我们今天的问题,把他们理解为等效是没有任何问题的)。 所谓传引用的说法是为了更好的讲解调用方式。基于上面对指针的理解,我们不难看出,指针其实也是一个int值,所谓传引用,我们是复制了复制了指针的int值进行传递。为了便于理解,我们可以姑且把指针看作一种数据类型,透明化指针的int特性,从而提出传引用的概念。 重申一遍:Java中只有传值。 1所谓传值和传引用 传值和传引用的问题一直是Java里争论的话题。与C++不同的,Java里面没有指针的概念,Java的设计者巧妙的对指针的操作进行了管理。事实上,在懂C++的Java程序员眼中,Java到处都是精美绝伦的指针。 下面举个简单的例子,说明什么是传值,什么是传引用。 //例1 void method1(){ int x=0; this.change(x); System.out.println(x); } void int change(int i){ i=1; } 很显然的,在mothod1中执行了change(x)后,x的值并不会因为change方法中将输入参数赋值为1而变成1,也就是说在执行change(x)后,x的值z依然是0。这是因为x传递给change(int i)的是值。这就是最简单的传值。 同样的,进行一点简单的变化。 //例2 void method1(){ StringBuffer x=new StringBuffer("Hello"); this.change(x); System.out.println(x); }

相关文档
最新文档