---------------------- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------
毕向东 Java基础视频教程11天01多线程(概述)
1. 进程:进行中的程序,每一个进程都有一个执行顺序,执行路径,也叫做控制单元。
2. 线程:进程中一个独立的控制单元,他控制着进程的执行。
3. 一个进程至少有一个线程。
4. Java虚拟机启动不止一个线程,还有负责垃圾回收机制的线程。
毕向东 Java基础视频教程11天02多线程(创建线程——继承thread类)
1. 创建线程第一种方法:
定义类继承thread
复写run()
Start()作用:启动线程+调用run()方法
2. 虚拟机一启动就开启了一条主线程,从main()开始执行。
3. 多线程的运行可以理解为互相抢夺cpu资源,谁抢到谁执行,这时多线程的一个性质:随机性,执行多长时间,cpu说了算。
毕向东 Java基础视频教程11天03创建线程(run,start特点)
1. thread中的run方法用于存储运线程要运行的代码。
2. 仅仅调用run方法没用start(),线程虽然创建了,但是没有运行,还是单线程。
毕向东 Java基础视频教程11天04创建线程(线程练习)
毕向东 Java基础视频教程11天05创建线程(线程运行状态)
1. 临时状态阻塞:具备运行资格,但没执行权力
毕向东 Java基础视频教程11天06创建线程(获取线程对象及其名称)
1. this.getName()获取线程默认名称
2. 线程默认名称 Thread-0…
3. 自定义线程名称,在线程中创建构造函数,然后借用父类构造函数给线程命名
Test(String name)
{
Super(name);
}
4. static Thread currentThread() 获取当前正在运行的线程的引用
Thread.currentThread().getName()==this.getName() 就可以得到当前正在运行的线程的默认名称
毕向东 Java基础视频教程11天07多线程(售票的例子)
1.买票时静态的重要性
private static int ticket=100;但是一般不定义静态,生命周期太长。
毕向东 Java基础视频教程11天08多线程(创建线程—实现runnable接口)
1. 创建线程对象时就要明确要运行的代码。
2. 创建线程第二种方式:
定义类实现runnable接口
覆盖runnable接口run方法
通过Thread类建立线程,
将runnable接口的子类对象作为参数传给Thread类的构造函数
调用Thread线程的start方法开启线程并运行runnable接口的子类对象的run方法。
3. 建立线程的实现方式好处:可以避免继承方式的局限性。在建立线程时建议使用实现方式。还有一个好处,多个线程共用同一个对象,也就公用同一个方法和属性,适合统一计票。
4. 继承的局限性:由于单继承的关系,一个类继承了其他类,就无法在继承Thread,就不能成为线程,就无法建立线程调用run方法运行我们相运行的代码。
毕向东 Java基础视频教程11天09多线程(多线程的安全问题)
1.
问题:为什么不是100按顺序到1,只是由于双核的原因造成的吗。
2. 调用一个申明抛出异常的方法,不管他实际有没有抛出异常,都要把它当做抛出异常来处理,等他抛出来再处理就晚了。所以调用一个抛出异常的方法就要处理。
3. 多线程出现安全问题的原因:多条语句在操作同一个线程共享数据时,一个线程只执行了多条语句的一部分,另一个线程就切进来了,导致问题出现。
4. 解决方法:多条语句在操作同一个线程共享数据时,只能让一个线程都执行完,执行过程中,其他线程不可以参与执行。
5.
问题:为什么每个线程里都有一份x
上面的问题类似于这个问题
x为什么是每个线程都有,也即为什么共享的对象的方法不是共享的造成了方法里的局部变量也不是共享的。
6. 同步代码块
Synchronized(对象)
{
需要被同步的代码块
}
共享数据在哪儿就对那些代码进行同步。这样一个线程在执行这些代码的时候,其他线程就不能进来了。
毕向东 Java基础视频教程11天10多线程(同步代码块)
1. 同步代码块中的对象就像锁。
2. 同步的前提:必须有两个和两个以上的线程 只有一把锁
3. 弊端:多个线程需要判断锁,比较消耗资源。
4. 当有多个线程时,某一段含有共享数据的代码需要一个线程执行时其他线程都不许参与执行时,就对这部分代码synchronized,以避免出现安全隐患。
毕向东 Java基础视频教程11天11多线程(同步函数)
1. 多线程时解决问题三部曲:
A. 明确哪些代码是多线程要运行的代码
B. 明确共享数据
C. 多线程运行的代码中那些多条语句操作共享数据
2.问题:那些数据是共享数据(对象是共享的,对象的属性就是共享的)
3.当同步的代码块刚好就是一个函数的代码块时,直接给函数加上synchronized修饰符,写代码更简单。
毕向东 Java基础视频教程11天12多线程(同步函数的锁是this)
1. 把不需要同步的同步了,就可能把多线程变成单线程。
2. 问题:为什么同步使用的一个前提是同一个锁,
obj |
一个锁是obj,一个是this,都共享tick,为什么会出现ticket==0的情况
3. 同步函数的锁是this
毕向东 Java基础视频教程11天13多线程(同步函数的锁是this)
1. 静态进内存时,内存中没有本类对象,但是有该类的字节码文件对象,类名.class 该对象类型为Class
2. 静态同步方法使用的锁是对象,该对象是该方法所在类的字节码文件对象,也即类名。Class
毕向东 Java基础视频教程11天14多线程(同步函数的锁是this)
1. 单例设计模式里共享数据就是对象。
2. 静态方法里使用同步代码块时,对象用的是类名。Class,因为这个时候还不存在类的对象。
3. 懒汉式:用双重判断方式减少判断锁的次数(就前两次)但是代码麻烦
该类的字节码文件对象 |
毕向东 Java基础视频教程11天15多线程(多线程-死锁)
1. 类里面一上来就新建了对象(不一定是本类对象),这样对象就具有了双重属性,既是对象,也是成员变量。
2. 多线程都运行的代码中多句代码含有共享数据时容易出现安全隐患所以用同步去解决隐患。
3. 面试时:写一个思锁:考察同步和多线程
毕向东 Java基础视频教程12天01多线程(线程间通信-示例代码)
1. 线程间通讯:多个线程在操作同一资源,只是操作的动作不同。
2. 典型例子:输入姓名和输出姓名同时进行。
毕向东 Java基础视频教程12天02多线程(线程间通信-解决安全问题)
1. 多线程出现安全问题时就考虑使用同步方法,但是要安全使用同步方法,要注意两点
a. 有多个线程运行同一段代码或运行相互关联的两段代码,若是后者,两段代码都要synchronized
b. 建立synchronized时要确保是同一把锁,也即同一对象,或叫指向同一对象
(对对个线程运行相互关联的两段代码建立synchronized代码块经验方法:
找到这两段代码,然后找到共享数据,一般共享对象——共享属性,或者就是共享对象,这时含有共享数据的单句和多句都是,因为两段时,单句也会造成安全隐患。
)
毕向东 Java基础视频教程12天03多线程(线程间通信-等待唤醒机制)
1. 冻结:sleep和wait,既没有执行资格也没有执行权,notify之后有了执行资格但是没有执行权,也就是回到临时状态,能不能立即实行不一定,可能会可能不会,要看cpu把执行权给谁。
2. 在两个类中创建共享数据的方法:创建一个类,然后把该共享数据作为对享属性。
然后在主函数中创建一个该类对象,然后把该对象作为初始化参数传给这两个类的构造函数,同时在这两个类中分别申明两个对象,用来接收以参数方式传递过来的对象。接着就可以随便使用该对象的属性,这是属性就是多个线程的共享数据了。
3. wait notify notifyAll都必须用在(对象监视器)锁中,也即用在同步中,而且还要在前标明wait()操作的线程所属的锁。r.wait()就是持有r这个锁的线程等待。
4. 只有同一个锁上的被等待线程,可以被同一个锁上的notify唤醒。
5. 为什么wait这些方法要放在object类中因为这些方法要被锁,也就是任意对象调用。
问题:为什么wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而且是被锁调用。
毕向东 Java基础视频教程12天04多线程(线程间通信-代码优化)
1. 属性private后要提供对外访问方法。
2. 问题
class Ticket extends Thread
{
private staticint tick=100;
Object obj=newObject();
public voidrun()
{
while(true)
{
Synchronized(obj)
{
If(tick>0)
{
System.out.println(Thread.currentThread().getName()+”…sale:”+tick--)
}
}
}
}
}
class TicketDemo
{
public static void main(String[ ] args)
Ticket t1=new Ticket();
Ticket t2=new Ticket();
Ticket t3=new Ticket();
Ticket t4=new Ticket();
t1.start();
t2.start();
t3.start();
t4.start();
}
毕向东 Java基础视频教程12天05多线程(线程间通信—生产者消费)
1. 问题:当前线程notify()其他线程之后,执行权是一定还在当前线程,还是可能还在当前线程。
2. 当生产者有多个,消费者也有多个时,判断标记不能用if(flag) try{wait();} catch(Exception e){ } 因为会出现生产一个后该线程唤醒另一个生产线程然后等待,另一个线程醒来因为本类就停在wait(),醒来之后没有经过if判断就直接又生产了一个,要想然它醒来后还要在判断一次就要用while(flag),但是当生产和消费都用了while()循环后会出现两个生产线程和两个消费线程全部放弃执行资格,这样就没有线程执行,程序就挂起。所以把notify全改成notifyAll();
3. Notify()去唤醒时是先唤醒线程池中最先被放入的放弃执行资格的线程。
4. 问题:Lock lock=new ReenTrantLock() 问什么用Lock lock,有必要吗,后面也没用到多态。
毕向东 Java基础视频教程12天06多线程(线程间通信—生产者消费)
1. 问题:线程等待时,抛出异常,检测异常,在抛出异常,处理异常属于哪个线程啊?
2. 问题:使用condition时importjava.util.concurrent.locks.*;java自己定义的它不认识吗
3. condition_A调用await(),那么经过这里的线程就等住了,condition_A调用signal,那么被condition_A等的线程就唤醒了。为了方便编写代码和阅读,一般谁等谁被唤醒,我们就把condition的名字命名为什么。
4. JDK1,5以后提供显示的锁机制,已经显示的锁对象上的等待唤醒机制。一个锁可以对应好几个wait notify
5. 释放锁的动作一定要执行,放在finally里。
毕向东 Java基础视频教程12天07多线程(停止线程)
1. 循环结束——run方法结束——线程结束
2. Wait和sleep 不一样,wait是object的方法,sleep是Thread的方法,wait放弃执行资格并释放锁,而sleep只放弃执行资格,锁还拿着。
3. 当线程处于冻结状态,就不回去读取标记,这时线程就不会结束。
4. Interrupt是清除线程的冻结状态,它不是中断线程。用interrupt清除线程冻结状态时,wait()sleep()都会抛出InterruptedException,这个interrupt方法就是由Thread类提供的。
毕向东 Java基础视频教程12天08多线程(守护线程)
1. Thread的setDaemon(true)可以把一个线程设为后台线程或守护线程,只要前台线程一结束,后台线程自动结束,后台线程以来与前台线程而生。
2. 在前程启动前调用setDaemon()。
毕向东 Java基础视频教程12天09多线程(join方法)
1. 问题:调用一个抛出异常的方法如join() 可不可以try然后不catch,而在函数上声明抛出吗,一般情况下不都是要么trycatch要么throw,trythrow也可以一起使用吗?
2. 问题:Main函数内部调用抛出异常的方法join,然后在函数上申明throw,虚拟机怎么处理呢?dos命令行的运行结果是什么呢
3. b.join() 当a线程执行到b线程。join,b线程被剥夺执行资格,至于执行资格给谁不管,不一定给b,但是等到b执行完之后,a线程恢复执行资格。
4. 用interrupt方法解除冻结之后,在哪儿冻结的就在哪儿抛出interruptedExcep
5. Join用于临时加入线程执行。
毕向东 Java基础视频教程12天10多线程(优先级yield方法)
1. 线程名。toString() 线程名,线程优先级,线程组(谁开启的)
2. 线程名。setPriority(Thread.MAX_PRIORITY); 也就是10
3. Thread.yield() 让运行到这的线程释放执行权,让线程达到平均运行效果,避免一个线程执行时间过长。
4. 巧用匿名内部类方法在一个类中建立三个线程,并且三个线程都在同一个类中运行
new Thread() …………………..(Thread 子类对象)
{
Public void run()
{
一个for循环;
}
}。Start();
主线程运行for循环
Runnable r=newRunnable()……………………..(Runnable子类对象)
{
Public void run()
{
一个for循环;
}
}
New Thread(r).start();
毕向东 Java基础视频教程13天01 string(概述)
1. 只要用双引号引起来的,那全都是对象
2. 字符串本身就是对象,字符串最大特点:一旦被初始化就不可以被改变。
如对象 “abc”一旦被初始化为“abc”就不可以被改变
3. equals()比较的是对象的地址值
4. String类复写了object里面的equals方法,用于判断两个字符创是否相同。
5. 字符串在内存中有一个常量池,常量池中有一个数组,数组中存放的是组成这些字符串的字符。
a |
b |
c |
d |
e |
h |
n |
毕向东 Java基础视频教程13天02string(常见功能—获取和判断)
1. 方法区:方法数据+静态数据+常量池、
2. 数组也有length,此时length是属性,没有(),String的length()是方法。
3. Object类型参数可以接受基本数据类型
4. 寻找一个在字符串中不存在的字符的脚标返回值为-1
5. Char charAt(int index):获取某个位置上的某个字符
6. Int indexOf(int ch):获取某个字符的角标
7. Int lastIndexOf(int ch):获取某个字符最后一个角标
8. Boolean startsWith(str) Boolean endsWith(str) Boolean contains(str)
9. Boolean equalsIgnoreCase()忽略大小写判断两个字符串是否相等
10. Boolean isEmpty(); 判断字符创是否为空
毕向东 Java基础视频教程13天03string(常见功能—转换)
1. 把字符数组转成字符串
通过构造函数的方式,在创建字符串的时候把字符数组作为参数传递过去
静态方法:String下的 static String copyValueOf(char[],int offset,int count)也可以将字符数组转成字符串
2. 注意字符串打印引用的时候出来的就是字符串。
3. 只要把参数类型定位object就不用判断只管传吧
4. (arr,1,3)arr是字符数组,从字符数组的第1位开始,也即第二位,将三个字符转化成字符串。
5. 将基本数据类型转化成字符串:
A.3+””——“3”
B.调用String 的staic String valueOf(int/double)
String.valueOf(3)
6. 将字节数组转成字符串,构造函数方法string(byte[])
String(byte[],offset,count)
7. 将字符串转成字符数组,调用String里的toCharArray()
8. 将字符串转成字节数组,调用String里的getBytes()
9. 问题:字符串和字节数组在转化过程中是可以制定编码表的
毕向东 Java基础视频教程13天04string(常见功能—转换)
1. String s=”hello java”
s.replace(‘a’,’n’); 这是一个新的字符串,但是字符串s没有变化,因为字符串s一旦被初始化就不能被改变
2.如果replace时要替换的字符不存在返回的还是原字符串。
3.replace()方法同样可以用于替换字符串
4.把字符串分割成字符串数组,字符串。Split(“,”)
5.获取字符串子串,字符串。substring()(2,4)从index为2开始,到4-1,要头不要尾,在获取子串时如果你的角标越界会发生角标越界异常。
毕向东 Java基础视频教程13天05string(常见功能—比较和去除空格)
1. 字符串大小写转换,去两端空格
toUpperCase() toLowerCase() trim();
2. compareTo()比较ASCII吗 a------97
毕向东 Java基础视频教程13天06string(字符串练习)
1. 字符串一旦被初始化就不能被改变指的不是字符串引用,而是实际的字符串对象“abc”,
比如 String s=”abcdef”;
Strings1=s.repalce(‘a’,’g’),这时候等号右边是产生了一个新的字符串,而不是改变了原来的“abcdef”,这个时候输出s还是“abcdef”,但是如果付给引用s一个新的字符串,在输出s就是新的字符串了。注意区别字符串初始化和引用变量初始化。
毕向东 Java基础视频教程13天07string(字符串练习2)
1. 数组反转即头尾互换,然后把头尾互换转化成我们熟悉的数组中两个元素交换位置。
2. reverse(谁),reverse(数组a)就是对数组a进行reverse, 这个时候因为是把实参传给了形参,而对形参的操作,就是对实参的操作,reverse之后之前的数组a就被改变了。你把你的东西传给我的参数,我对你进行操作之后你就改变了。
3. java但凡取从头到尾的时候都习惯包含头不包含尾,所以自己定义类似函数时也要这样。你明明要取6——9,你就写取6——10,处理的时候再10-1,这样更专业。再比如对数组反转时,传递区间(0,arr.length)这时length就不要建—1了,但要注意后期对其-1
4. 不要混淆:数组的length就是length,字符串的length是。length()
毕向东 Java基础视频教程13天08string(字符串练习3)
1. indexOf()既可以用来获得字符串中某一个字符的角标,也可以用来获得字符串中某一子串的首角标。
2. 既想知道字符串中存不存在某个子串或字符,又想知道该子串或字符的位置时,就要使用indexOf(),如果有则返回角标,如果没有则返回-1。
3. 只要index=str.indexOf(key)!=0,也就是我们要找的子串在字符串中还有,那么就要继续砍字符串,同时count++,从哪儿砍,从str.substring(index+key.length()),然后在砍完后的字符串中再去判断子串的角标,如果为-1,说明没有了,就跳出循环不需要计数了。
4. 使用indexOf(key)没有indexOf(key, count)方法优化,因为前者需要砍字符串这样内存中就会产生多个字符串占用资源,并且由于所得到的key的index都是在砍完的字符串中的角标,所以不能直接知道这些key在原始字符串中的角标。所以建议使用后者
5. 用split()以某子串对字符串进行切的时候,如用“kk”对”kkabckkewekk”切的时候,因为切可以切出空字符串所以会切除两个空字符串出来,而kk的个数只有三个,不适合用来获得某字符串中某子串的个数。
毕向东 Java基础视频教程13天09string(字符串练习4)
1. 求字符串A和字符串B(假设B是A,B中较小的字符串)的最大相同子串,分析外循环: 首先需要把B的各种长度的子串都造出来,比如长度为最大长度的子串——最大子串,长度为次长度的所有子串——次大子串,长度为次次大长度的所有子串——次次大子串。。。。。。,而这每次造出一个特定长度的所有子串就是一次循环,循环的次数就是由B有多少种长度的子串决定的。假如说B的长度为10,也就是下标从0——9,那就从x=0开始,x++,因为x不能取到10(循环条件习惯考虑不能取到什么),把循环条件设置成x<10,这样x就可以取遍从0——9的10个值,也就包含了10中可能的长度。总结:每一次外循环都是一种长度的所有子串。
2. 分析内循环:内循环是用来得出某种特定的长度下所有的子串。当外循环的x=0时,内循环用来得出长度为10的所有字串,这时内循环的初始化条件是用来确定在某一特定长度下,该种长度的子串中,左下标以0开始的子串的两个角标,注意右角标永远比实际情况+1,当左角标y=0时,右角标z=B.length(),而当长度为9时,y=0,z=B.length()-1,当长度为8时,y=0,z=B.length()-2,而所减的值刚好就是外循环的x值(像内循环这种变化的值一般都一个用外循环的值表示出来),所以for(y=0,z=B.length()-x;)但是循环初始化仅仅是得出了,特定长度下左脚标为0的一种子串,还有可能存在其他同长度的子串,这时y++,z++,也就是长度区间整体右移,假设长度为9,那么y++,z++一次,子串角标就从0——8移到1——9,也只能移到此为止,不能再向右移,这样右角标就<B.length(),根据右角标比实际情况+1法则,就是<B.length+1; 所以for(y=0,z=B.length()-x;z<B.length+1;y++,z++),因为内循环每取一次y,z的值就是该特定长度下的一个子串,所以在循环体中造出该子串,String temp=B。substring(y,z),然后出来一个就判断一个A中是否contain temp,if(A.contain(temp)),就return temp,或者if(A.indexOf(temp)!=-1) return temp.
3. 总结:每一次外循环得出特定长度下的所有子串,一共有多少种长度子串由字符串长度决定,所以就对短字符串进行遍历,每一个值就对应一种长度。编写内循环时,以长度为10和长度为9两种情况去编写。(用实例知道代码编写更快捷)注意:因为我们假设的是B为短字符串,如果B不是会造成效率低下,所以if(A.length()<B.length()) 用一个中间两对他们进行互换。
毕向东 Java基础视频教程13天10 、11 StringBuffer(常见功能-添加,删除,修改)
1. 问题:equals没被复写前比较的是对象的内存地址还是内容。
2. 问题:静态只能访问静态,这里的静态指什么是因为对象还没有建立,那么静态方法中可以有对象吗
3. 问题:单例设计模式中Private static Single s=newSingle();的static自己被自己共享,神马意思
4. 问题:单例设计模式中类中new出来的对象会在构造函数中初始化吗。
5. StringBuffer是一个容器,可以增删改查,所以StringBuffer相当于一个可以增删改查的字符串。
6. CURD:Create Update Read Delete
7. 当类名不直观时,就要看该类描述的是什么东西,它描述的是什么,那么(声明对象时)申明的就是什么。
8. class Class 该Class类描述的就是所有的。class文件,。class文件也是一种事物,也可以用类去描述,这个类就叫Class,描述的对象就是。class文件。
9. object类的getClass()方法,可以用任何对象去调用该方法,得到的是该类的。class文件,因为任何一个类都有属于自己的。class文件。如Demo d=newDemo() d.getClass() 返回的就是Demo.class文件。 Class ic 申明的就是一个。class文件
10. 所以得到对象的类名是一个间接的方法,先得到的是该对象所属类的。class文件,然后调用。class文件所属类的getName()方法得到类名。
11. object的toString()方法=任意对象.getClass().getName()+’@’+Integer.toHexString(hashCode()) 也即类名@地址值的十六进制表现形式。但是这个返回的结果没什么太大意义,所以一般被复写。
12. StringBuffer输出的内容不一定是字符串,它只是一个容器,可以装多种数据类型的数据,如果想输出字符串就要调用toString()
13. StringBuffer和string的区别:StringBuffer的对象可以修改,
14. delete(a,b)含头不含尾 清空缓冲区 sb.delete(0,sb.length()) sb.delete(2.2)看最终结果等于没删 删除一个最快用deleteCharAt();
15. substring()返回的不是StringBuffer,返回的是String
16. setCharAt(2,‘k’) 返回值类型为void
17. StringBuffer的getChars(intsrcBegin,int srcEnd, char[] dst, int dstBegin)把缓冲区的的指定字符串从指定的角标数开始放入到指定字符数组中。
毕向东 Java基础视频教程13天12StringBuilder
1. StringBuffer线程同步,是安全的,StringBuilder线程不同步,容易出现安全隐患。但是,StringBuffer效率低,因为每次都要判断锁。所以多线程使用StringBuffer,单线程使用StringBuild效率高。开发多使用StringBuilder
2. JDK升级无外乎三个目的:提高效率,提高安全性,简化书写。
3. StringBuffer和StringBulider的方法一模一样。
毕向东 Java基础视频教程13天 13-基本数据类型对象包装类
1. Integer的静态成员变量MAX_VALUE=2的31次方-1
2. 基本数据类型对象包装类的最常见作用:用于基本数据类型和字符串类型的转换。
3. Integer的静态方法toString(int),可用类名直接调用,Integer.toString(被转换的整数)
4. 基本数据类型转换成字符串简单方法:基本数据类型+””
5. 文本框里的东西全部都是字符串
6. 把字符串转换成int型数据,用的也是Interger里面的静态方法,Interger.parseInt(“被转换的字符串”),也就是把字符串转换成基本数据类型,想转成神马类型,就用对应的类去调用parseXXX(“被转换的字符串”)。如想把字符串转换成long型,Long.parseLong(“12.23”)
7. 十进制转化成其他进制,其它进制转化成十进制:int输入输出的都是十进制的整数,Integer.parseInt(“110”,2) ()中右边是当前这个“”里的数的进制单位,左边就是该进制的数,也就是一个2进制的数110,结果是6. 或者intx=Integer.parseInt(“3c”,16) 得到x=60
8. 将字符串转化成整数的非静态方法,创建Integer对象,在Integeri=new Integer(“123”)
然后i.intValue();初始化时就已经把字符串变成了Integer对象,然后对象调用非静态方法。
9
毕向东 Java基础视频教程13天-14基本数据类型对象包装类新特性
1.intValue()有意义吗,非静态方法用对象调用,该对象就是int型的整数啊,再掉用该方法有意义吗 因为假如不用该方法直接输出该对象,那么输出的肯定是引用变量的值,也就是该对象的地址值,而不是该整数。所以要想输出该整数值就要调用
2.只要一new就是一新对象,地址值就是一个新的地址值,管你内容一不一样。而equals方法长被复写,在Integer里比较的是两个Integer对象的数值是否相等。也就是说存在两个不同的对象,这两个对象是相同的数值。
3.Integer新特性:Integer x=12; 自动装箱 将12装入new Integer()中,x=x+2,自动拆箱,x.intValue()之后做加法后自动装箱,把对象赋给左边对象。
4.问题:StringBuffer的对象直接输出时,也就是不调用toString()时输出的是字符串吗?
5.Integer的新特性中,当数值范围在Byte范围内(-128—127)时,若该数值已经存在时,不会再开辟新的对象空间,直接指向已存在对象。如Integer a=127; Integer b=127;这时只默认创建了一个对象,开辟一个内存空间,运行到b时,直接指向a对象。这样可以节省内存。
6.a和b指向同一对象则a,b的之就相等。
---------------------- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------
详细请查看:<a href="http://edu.csdn.net/heima" target="blank">http://edu.csdn.net/heima</a>