Java学习遇到的问题
一. Java中泛型如何比较大小,继承Comparable类,然后实现其唯一的方法compareTo():
public class GenericClass<E extends Comparable<E>>{
public int com(E e1, E e2){
return e1.compareTo(e2);
}
}
二. Java中参数传值还是传引用的问题:
按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本。因此,如果函数修改了该参数,仅改变副本,而原始值保持不变。
按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址的一个副本,而不是值的副本。因此,如果函数修改了该参数,调用代码中的原始值也随之改变。但是指向原始对象的引用不会改变!
下面从赋值语句和java方法的参数列表两方面分别叙述:
赋值语句:
对象类型的对象赋值时是按引用传递的;八大基本类型(int、long、double、float、byte、boolean、char)的对象赋值时是按值传递的;
StringBuffer s = new StringBuffer("good");
StringBuffer s2 = s; //按引用传递,s和s2指向的是内存中的同一个地址
s2.append(" afternoon!");
System.out.println(s); //good afternoon
int i =5;
int i2 =i; //按值传递
i2 = 6;
System.out.println(i); //
java方法的参数列表:
参数列表中,对象类型的对象是按引用传递的,但无论方法体内进行了何种操作,都不会改变实参对象的引用;
八大基本类型(int、long、double、float、byte、boolean、char)的对象是按值传递的;
public class test {
public static void main(String[] args) {
StringBuilder s = new StringBuilder("good"); //good
StringBuilder s2 = new StringBuilder("bad"); //bad
test(s,s2); //按引用副本传递,但是不管test()方法的内部对s,s2指向的对象的内容作了什么样的修改,s和s2所指向的对象不会改变
//通俗一点说就是:将s和s2看做指针的话,指针指向的对象的内容不管如何变化,s和s2这个指针绝对不会变
System.out.println(s); //goodhah2 ,此处即为s指向的对象内容从good变为了goodhah2
System.out.println(s2); //bad
}
public static void test(StringBuilder s,StringBuilder s2){
System.out.println(s); //good
System.out.println(s2); //bad
s2=s; //按引用副本传递
s = new StringBuilder("new"); //s指向一个新的对象
System.out.println(s); //new
System.out.println(s2); //good
s.append("hah");
s2.append("hah2");
System.out.println(s); //newhah
System.out.println(s2); //goodhah
}
}
【总结】:
1. 不管Java参数的类型是什么,一律传递参数的副本。如果Java是传值,那么传递的是值的副本;如果Java是传引用,那么传递的是引用的副本。
2. 不管是赋值语句,还是java方法的参数列表,基本数据类型是传值(副本),对象类型传引用(副本)。
三. equals()和==的比较
1. equals方法对于字符串来说是比较内容的,而对于非字符串来说是比较其指向的对象(引用地址)是否相同的。
== 比较符是比较指向的对象是否相同的,也就是对象在对内存中的的首地址。
2. equals 方法是 java.lang.Object 类的方法,Object类中的equals方法是用来比较“地址”的,但是String类中重新定义了equals这个方法,而且比较的是值,而不是地址。
3. 如果是基本类型(byte, short, int, long, float, double, char,boolean)比较,那么只能用==来比较,不能用equals();
4. 对于基本类型的包装类型,比如Boolean、Character、Byte、Shot、Integer、Long、Float、Double等的引用变量,==是比较地址的,而equals是比较内容的。
5. 注意一个基本的原则:在定义一个类的时候,如果涉及到对象的比较,应该重写equals()方法。
四. java中的堆、栈、常量池
栈:存放八大基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中
堆:存放用new产生的数据,由垃圾回收来负责的
【栈中的变量指向堆内存中的变量,这就是 Java 中指针的思想】
静态域:存放在对象中用static定义的静态成员
常量池:存放常量。常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。除了包含代码中所定义的各种基本类型(如int、long等等)和对 象型(如String及数组)的常量值(final)还包含一些以文本形式出现的符号引用,比如: 类和接口的全限定名; 字段的名称和描述符; 方法和名称和描述符。 虚拟机必须为每个被装载的类型维护一个常量池。常量池就是该类型所用到常量的一个有序集和,包括直接常量(string,integer和 floating point常量)和对其他类型,字段和方法的符号引用。对于String常量,它的值是在常量池中的。
【总结】:
a.栈中用来存放一些原始数据类型的局部变量数据和对象的引用(String,数组.对象等等),但不存放对象内容
b.堆中存放使用new关键字创建的对象.
c.字符串是一个特殊包装类,其引用是存放在栈里的,而对象内容必须根据创建方式不同定(常量池和堆).有的是编译期就已经创建好,存放在字符串常量池中,而有的是运行时才被创建.使用new关键字,存放在堆中。
Java学习遇到的问题的更多相关文章
- 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁
什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...
- 0035 Java学习笔记-注解
什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...
- 分享篇——我的Java学习路线
虽然之前我是开发出身,但是我学习的语言是Objective-c,这个语言使用起来范围比较窄,对于自动化学习来说也是无用武之地,所以我自己学习了Java,对于一个有开发经验的人来说学习一门新语言相对来说 ...
- Java学习笔记(04)
Java学习笔记(04) 如有不对或不足的地方,请给出建议,谢谢! 一.对象 面向对象的核心:找合适的对象做合适的事情 面向对象的编程思想:尽可能的用计算机语言来描述现实生活中的事物 面向对象:侧重于 ...
- Java学习心得之 HttpClient的GET和POST请求
作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Java学习心得之 HttpClient的GET和POST请求 1. 前言2. GET请求3 ...
- 0032 Java学习笔记-类加载机制-初步
JVM虚拟机 Java虚拟机有自己完善的硬件架构(处理器.堆栈.寄存器等)和指令系统 Java虚拟机是一种能运行Java bytecode的虚拟机 JVM并非专属于Java语言,只要生成的编译文件能匹 ...
- 0030 Java学习笔记-面向对象-垃圾回收、(强、软、弱、虚)引用
垃圾回收特点 垃圾:程序运行过程中,会为对象.数组等分配内存,运行过程中或结束后,这些对象可能就没用了,没有变量再指向它们,这时候,它们就成了垃圾,等着垃圾回收程序的回收再利用 Java的垃圾回收机制 ...
- 0028 Java学习笔记-面向对象-Lambda表达式
匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...
- 0025 Java学习笔记-面向对象-final修饰符、不可变类
final关键字可以用于何处 修饰类:该类不可被继承 修饰变量:该变量一经初始化就不能被重新赋值,即使该值跟初始化的值相同或者指向同一个对象,也不可以 类变量: 实例变量: 形参: 注意可以修饰形参 ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
随机推荐
- IP ,路由
ifconfig 命令 ip信息 enp0s3: flags=4163<UP(已经启用),BROADCAST(支持广播),RUNNING,MULTICAST(支持多播)> ...
- maven 实践 :管理依赖
有人认为Maven是一个依赖管理工具,当然这种想法是错误的(确切的说Maven是一个项目管理工具,贯穿了整个项目生命周期,编译,测试,打包,发布...),但Maven给人造成这种错误的印象也是有原因的 ...
- Sublime Text怎么设置文件在新标签打开?
设置Sublime Text新标签页tab打开文件.Sublime Text Files not opening a new tab?每次打开文件,Sublime Text总是把当前的tab打开的文件 ...
- mysql导出/导入表结构以及表数据
导出: 命令行下具体用法如下: mysqldump -u用戶名 -p密码 -d 数据库名 表名 脚本名; 1.导出数据库为dbname的表结构(其中用戶名为root,密码为dbpasswd,生成的脚 ...
- SQL中的declare用法
平时写SQL查询.存储过程都是凭着感觉来,没有探究过SQL的具体语法,一直都是按c#那一套往SQL上模仿,前几天项目中碰到一个问题引起了我对declare定义变量的作用域的兴趣. 大家都知道c#中的局 ...
- Android四大组件之contentProvider
Activity,Service,broadcast and Contentprovider android 4 大组件. ContentProvider:使用: public class Image ...
- HttpHelper类及调用
首先列出HttpHelper类 /// <summary> /// Http操作类 /// </summary> public class HttpHelper { priva ...
- Find the hotel HDU - 3193(RMQ)
题意: 有n个旅馆,从这n个旅馆中找出若干个旅馆,使得这若干个旅馆满足这样的条件:不能从其它和剩下的旅馆中找到一个价格和距离都小于这个旅馆的旅馆... 解析: 按price 排序,若price相同, ...
- 【BZOJ3242】【NOI2013】快餐店(动态规划)
[BZOJ3242][NOI2013]快餐店(动态规划) 题面 BZOJ 题解 假设我们要做的是一棵树,那么答案显然是树的直径的一半. 证明? 假设树的直径是\(2d\),那么此时最远点的距离是\(d ...
- SCWS中文分词,安装说明(以:Win32环境、utf8字符集为例)
SCWS官方网站:http://www.xunsearch.com/scws/ 1. 根据您当前用的 PHP 版本,下载相应已编译好的 php_scws.dll 扩展库. 目前支持 PHP-5. ...