精华内容
下载资源
问答
  • Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。字符串是常量,一旦被赋值,就不能被改变。String类的构造方法* public String():空构造* public String(byte[] bytes):把字节数组转成字符串* ...

    String类的概述

    String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。

    字符串是常量,一旦被赋值,就不能被改变。

    String类的构造方法

    * public String():空构造

    * public String(byte[] bytes):把字节数组转成字符串

    * public String(byte[] bytes,int index,int length):把字节数组的一部分转成字符串

    * public String(char[] value):把字符数组转成字符串

    * public String(char[] value,int index,int count):把字符数组的一部分转成字符串

    * public String(String original):把字符串常量值转成字符串

    String类的常见面试题

    1.判断定义为String类型的s1和s2是否相等

    * String s1 = "abc";

    * String s2 = "abc";

    * System.out.println(s1 == s2);

    * System.out.println(s1.equals(s2));

    == 比较的是对象地址,equals对比的是值。都为true。String s1 = "abc" 存储在常量池 中,常量池的特点是如果没有就创建,如果已经有了,则不创建,所以s1和s2是同一个对象。

    2.下面这句话在内存中创建了几个对象?

    * String s1 = new String("abc");

    两个,第一个在常量池中,第二个在堆中。

    3.判断定义为String类型的s1和s2是否相等

    * String s1 = new String("abc");

    * String s2 = "abc";

    * System.out.println(s1 == s2);

    * System.out.println(s1.equals(s2));

    由第二题可知,第一个是false,第二个是true。

    4.判断定义为String类型的s1和s2是否相等

    * String s1 = "a" + "b" + "c";

    * String s2 = "abc";

    * System.out.println(s1 == s2);

    * System.out.println(s1.equals(s2));

    两个都是true。第一个因为Java有常量优化机制,在编译阶段就直接是“abc”了。

    5.判断定义为String类型的s1和s2是否相等

    * String s1 = "ab";

    * String s2 = "abc";

    * String s3 = s1 + "c";

    * System.out.println(s3 == s2);

    * System.out.println(s3.equals(s2));

    第一个是为false,第二个为true。第一句和第二句分别在常量池中创建常量“ab”,“abc”,第三句代码中的+是通过 StringBuffer的append方法将s1和“c”连接起来,再通过toString方法转换成String对象,是在堆中的一个新对象,与常量池中的s2不同。

    String类的判断功能

    * boolean equals(Object obj):比较字符串的内容是否相同,区分大小写

    * boolean equalsIgnoreCase(String str):比较字符串的内容是否相同,忽略大小写

    * boolean contains(String str):判断大字符串中是否包含小字符串

    * boolean startsWith(String str):判断字符串是否以某个指定的字符串开头

    * boolean endsWith(String str):判断字符串是否以某个指定的字符串结尾

    * boolean isEmpty():判断字符串是否为空。

    String类的获取功能

    * int length():获取字符串的长度。

    * char charAt(int index):获取指定索引位置的字符

    * int indexOf(int ch):返回指定字符在此字符串中第一次出现处的索引。

    * int indexOf(String str):返回指定字符串在此字符串中第一次出现处的索引。

    * int indexOf(int ch,int fromIndex):返回指定字符在此字符串中从指定位置后第一次出现处的索引。

    * int indexOf(String str,int fromIndex):返回指定字符串在此字符串中从指定位置后第一次出现处的索引。

    * lastIndexOf

    * String substring(int start):从指定位置开始截取字符串,默认到末尾。

    * String substring(int start,int end):从指定位置开始到指定位置结束截取字符串。

    案例演示1:遍历字符串

    public static voidmain(String[] args) {

    String s= "heima";for(int i = 0; i < s.length(); i++) {

    System.out.println(s.charAt(i));

    }

    }

    案例演示2:统计不同类型字符个数

    * 需求:统计一个字符串中大写字母字符,小写字母字符,数字字符出现的次数,其他字符出现的次数。

    * ABCDEabcd123456!@#$%^

    public static voidmain(String[] args) {

    String s= "ABCDEabcd123456!@#$%^";int big = 0;int small = 0;int num = 0;int other = 0;//1,获取每一个字符,通过for循环遍历

    for(int i = 0; i < s.length(); i++) {char c = s.charAt(i); //通过索引获取每一个字符//2,判断字符是否在这个范围内

    if(c >= 'A' && c <= 'Z') {

    big++; //如果满足是大写字母,就让其对应的变量自增

    }else if(c >= 'a' && c <= 'z') {

    small++;

    }else if(c >= '0' && c <= '9') {

    num++;

    }else{

    other++;

    }

    }//3,打印每一个计数器的结果

    System.out.println(s + "中大写字母有:" + big + "个,小写字母有:" + small + "个,数字字符:"

    + num + "个,其他字符:" + other + "个");

    }

    String的转换功能

    * byte[] getBytes():把字符串转换为字节数组。

    * char[] toCharArray():把字符串转换为字符数组。

    * static String valueOf(char[] chs):把字符数组转成字符串。

    * static String valueOf(int i):把int类型的数据转成字符串。

    * 注意:String类的valueOf方法可以把任意类型的数据转成字符串

    * String toLowerCase():把字符串转成小写。(了解)

    * String toUpperCase():把字符串转成大写。

    * String concat(String str):把字符串拼接。

    案例演示

    * 需求:把一个字符串的首字母转成大写,其余为小写。(只考虑英文大小写字母字符)

    public static voidmain(String[] args) {

    String s= "woaiHEImaniaima";

    String s2= s.substring(0, 1).toUpperCase().concat(s.substring(1).toLowerCase());

    System.out.println(s2);

    }

    String类的其他功能

    * String replace(char old,char new)

    * String replace(String old,String new)

    * String trim()

    字符串反转

    * 需求:把字符串反转

    * 举例:键盘录入"abc"

    * 输出结果:"cba"

    public static voidmain(String[] args) {

    Scanner sc= new Scanner(System.in); //创建键盘录入对象

    System.out.println("请输入一个字符串:");

    String line= sc.nextLine(); //将键盘录入的字符串存储在line中

    char[] arr = line.toCharArray(); //将字符串转换为字符数组

    String s = "";for(int i = arr.length-1; i >= 0; i--) { //倒着遍历字符数组

    s = s + arr[i]; //拼接成字符串

    }

    System.out.println(s);

    }

    在大串中查找小串出现的次数代码实现

    * 统计大串中小串出现的次数

    public static voidmain(String[] args) {//定义大串

    String max = "woaiheima,heimabutongyubaima,wulunheimahaishibaima,zhaodaogongzuojiushihaoma";//定义小串

    String min = "heima";//定义计数器变量

    int count = 0;//定义索引

    int index = 0;//定义循环,判断小串是否在大串中出现

    while((index = max.indexOf(min)) != -1) {

    count++; //计数器自增

    max = max.substring(index +min.length());

    }

    System.out.println(count);

    }

    展开全文
  • 今天看引用传递/值传递相关的东西,说到String的值自初始化后不能修改,我就想,如果调用函数改变了String类对象的引用,那主函数里头的输出结果会不会变化,结果发现不行...同样的,...今天看引用传递/值传递相关的...

    今天看引用传递/值传递相关的东西,说到String的值自初始化后不能修改,我就想,如果调用函数改变了String类对象的引用,那主函数里头的输出结果会不会变化,结果发现不行...同样的,...

    今天看引用传递/值传递相关的东西,说到String的值自初始化后不能修改,我就想,如果调用函数改变了String类对象的引用,那主函数里头的输出结果会不会变化,结果发现不行...同样的,调用函数改变自定义Person类对象的引用后,在主函数中输出该对象的属性值,依旧是原来的值,这是什么道理...

    代码如下:

    public static void main(String[] args) {

    // TODO code application logic here

    String str1="java";

    Person p1=new Person();

    Person p2=new Person();

    p1.age=1;

    p2.age=2;

    Change(str1); //这里不是应该是改变了str指向的内存地址么

    Change(p1,p2); //同理,这里不是应该把对象p2的指向了p1的内存地址么

    System.out.println(str1);

    System.out.println(a);

    System.out.println("p1.age="+p1.age+" p2.age="+p2.age);

    }

    public static void Change(String str){

    str="java2";

    }

    public static void Change(Person a,Person b){

    a=b;

    }

    }

    class Person{

    String name;

    int age;

    }

    输出结果:

    java

    p1.age=1p2.age=2

    为啥啊...

    展开

    展开全文
  • java为什么把一个对象传入方法中把原有对象的值改变 但是地址不会变呢 已经了解是值传递,将对象拷贝一份传入方法,在改变对象的值基础上 原有对象不变,但是为什么值都改变了,但是对象地址确实一模一样? ...
  • //为什么值还是小明,地址还是原来那个经过方法地址没有改变 } //方法类 public class AAA { public void Huan(Student student1,Student student2){ student1=student2; ...
  • 这里的“值”可以简单的理解为“对象或原始类型在内存中的地址”(并不准确)。插播两个概念,‘按值传递’和‘按引用传递’:Pass-by-value:The actual parameter (or argument expression) is ...

    这个问题产生的根源是,对于java中参数传递的误区:

    原始类型按值传递;对象按引用传递。

    其实不然。请记住,

    java中,无论是原始类型还是对象,都是按值传递的。

    这里的“值”可以简单的理解为“对象或原始类型在内存中的地址”(并不准确)。

    插播两个概念,‘按值传递’和‘按引用传递’:

    Pass-by-value:

    The actual parameter (or argument expression) is fully evaluated and

    the resulting value is copied into a location being used to hold the

    formal parameter's value during method/function execution. That

    location is typically a chunk of memory on the runtime stack for the

    application (which is how Java handles it), but other languages could

    choose parameter storage differently.

    Pass-by-reference:

    The formal parameter merely acts as an alias for the actual parameter.

    Anytime the method/function uses the formal parameter (for reading or

    writing), it is actually using the actual parameter.

    不知如何翻译才不会有误解,便不翻了。逃)

    回过头来看题主的问题,当调用

    method(a,b);

    时,是将a和b的地址传入方法method,那么

    public static void method(Circle x,Circle y){

    Circle tmp = x;

    x = y;

    y = tmp;

    }

    进入方法后,x初值为对象a的地址,y初值为对象b的地址;而进行交换后,只是将x指向了对象b的地址,y指向了对象a地址。而:

    a和b的值并未交换。

    好,现在再来看个例子:

    Class User{

    private String name;

    .

    .

    .

    }

    public static void foo(User user){

    user.setName("Max");// AAA

    user = new User("Fifi");// BBB

    user.setName("Rowlf");// CCC

    }

    public static void main(String[] args){

    User basicUser = new User("Rover");

    foo(basicUser );

    }

    请问,‘AAA’、‘BBB’、‘CCC’这3行代码执行完后,对象basicUser的name分别是什么?

    ‘AAA’行:name为‘Max’;

    ‘BBB’行:name为‘Max’;

    ‘CCC’行:name为‘Max’;

    请思考下原因。

    Ps: 若有纰漏有误之处,欢迎批评指正。

    展开全文
  • 传递对象类型参数,可以改变对象变量的实例域值.c.传递对象类型参数,不可以改变引用地址.经典示例:交换两个引用类型变量(失败)package com.webm;public class Test {/*** @param args*/public st...

    面试时碰到过许多关于java方法中传递对象参数的问题,关于java中传递参数,总结如下:

    a.传递值类型参数,如基本数据类型,不可以改变变量的值.

    b.传递对象类型参数,可以改变对象变量的实例域值.

    c.传递对象类型参数,不可以改变引用地址.

    经典示例:交换两个引用类型变量(失败)

    package com.webm;

    public class Test {

    /**

    * @param args

    */

    public static void main(String[] args) {

    Manager m1=new Manager(1,"谢东","人力资源部");

    Manager m2=new Manager(2,"李志","市场部");

    System.out.println("交换前");

    m1.display();

    m2.display();

    System.out.println("交换中");

    Manager.warpManage(m1, m2);

    System.out.println("交换后");

    m1.display();

    m2.display();

    }

    }

    class Manager{

    private int mid;

    private String mname;

    private String depart;

    public Manager(int m,String n,String d){

    this.mid=m;

    this.mname=n;

    this.depart=d;

    }

    public static void warpManage(Manager m1,Manager m2){

    Manager temp=null;

    temp=m1;

    m1=m2;

    m2=temp;

    System.out.println("name1="+m1.mname+" depart1="+m1.depart);

    System.out.println("name2="+m2.mname+" depart2="+m2.depart);

    }

    public void display(){

    System.out.println("name="+this.mname+" depart="+this.depart);

    }

    }

    实质解释:

    java方法中传递参数时,无论是传递基本数据类型还是引用类型,都是传递参数(显示参数)的一个

    拷贝,所以在调用方法结素之后,访问的仍是原来的值.

    展开全文
  • 前台对象传输,试过很多方法,对象地址不变,使用下面方法可以创建新的对象使用,避免同一个对象校验完成后数据改变库存扣除错误(2次) private PurchaseManagerDto getNewPurchaseManagerDto(PurchaseManagerDto...
  • 浅拷贝只是拷贝了源对象地址,所以源对象的值发生变化时,拷贝对象的值也会发生变化。而深拷贝则是拷贝了源对象的所有值,所以即使源对象的值发生变化时,拷贝对象的值也不会改变。如下图描述:了解了浅拷贝和深...
  • java对象地址引用及值引用

    千次阅读 2015-07-31 15:32:01
    当将一个list的元素分别保存到另外五个list中后,对5个list中的对象做值修改,其实这5个list的值会同时改变,所以当需要将一个list中的元素放到另外的list或其他集合中时,不能直接使用list 的get方法以及put方法,...
  • java面向对象

    2017-12-23 19:05:29
    面向对象编程有三大特性:封装、继承、多态。  封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据。对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法。  ...
  • 每个 java 对象包含 12B 或 16B 的头部信息,用于支持对象锁、多态、反射等特性头部之后的内存区域,存储对象成员变量的值内存对齐机制改变变量地址起点,提高内存使用效率,但形成内存浪费hotspot 通过变量重排等...
  • 问:当一个对象被当做参数传递到一个方法后,此方法可改变这个对象的属性,并返回变化后的结果,... Java参数:不管是原始类型还是引用类型,传递的都是副本(有另外一种说法是传值,传值一般相对于传地址而言) 若...
  • Java 面向对象之final

    2020-07-15 19:40:02
    Java 面向对象之finalfinal:不可改变。可以⽤于修饰类、⽅法和变量。局部变量 -- 引⽤类型成员变量 final:不可改变。可以⽤于修饰类、⽅法和变量。 类:被修饰的类,不能被继承。 ⽅法:被修饰的⽅法,不能被重写...
  • java对象访问方式

    2016-09-01 19:05:08
    java堆中将会划分出一块内存来作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息,使用句柄最大的好处就是reference存储的是稳定的句柄地址,在对象被移动...
  • Java 对象克隆

    2019-10-04 00:48:33
    对象克隆是当程序运行时,可能需要一个新对象,用来保存当前对象的状态,并且新的对象与当前对象没有任何关联,即我改变了新对象属性的值,而当前对象没有发生改变。而这新的对象,就是对当前对象的克隆,或者说拷贝...
  • 引用传递: 也称为传地址。有点类似与指针传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对...package java面向对象; /** ...
  • 这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、...
  • Java里面对象的引用问题

    千次阅读 2017-05-25 19:52:25
    Java初学者,因为之前学过C,所以对于学Java的时候老是能想起来地址、指针问题,...并且同一类的两个不同对象之间的赋值,实际上是改变栈中对象名的指向,而不是改变堆中的对象数据,当堆中的对象数据没有对象名指向...
  • java对象引用测试

    2019-12-05 11:33:00
    代码 java中初始化一个实例,这个实例...如图中代码,java传的只是对象地址,对象赋值引用的是同一个对象,p1引用用p,对p1操作,最终还是会影响最初对象p的值。如果想不影响p,不能直接p1=p,需要对p1重新new或...
  • java对象赋值

    2017-07-22 16:45:42
    java对象bean的赋值方法有很多种,这里说4种。 1.最基本的等号赋值。优点是节省内存,因为这种方法实际是将一个内存地址给了两个容器共用。缺点嘛,因为容器中地址共用,修改一个时,另一个也会同时发生改变 2.在...
  • java对象的引用

    2019-02-12 16:45:18
    引用:一个储存了某个对象地址的变量,它储存的不是对象本身,而是对象的地址。 Point point = new Point();的含义是:首先实例化一个对象(new Point()),然后定义一个引用point指向这个实例。 point=point1 ...
  • Java对象的引用传值

    2016-03-27 11:29:19
    Java中传递参数。...进行输出打印,凡是打印的是地址的 都是传递的对象 在此方法中改变的。 所有引用该对象的都会改变,打印的是 本身的值得话。对象都不会去改变。可能您还有这样的疑惑,为什么 Str
  • Java 对象深拷贝

    2020-05-19 10:25:39
    而深拷贝则是拷贝了源对象的所有值,所以即使源对象的值发生变化时,拷贝对象的值也不会改变。如下图描述: ##拷贝对象 ####拷贝一个简单的对象 package text; public class User { private String name; private ...
  • 1.首先是对Java集合对象得浅复制与深度复制的理解普通的集合复制只是将内存中栈的地址快拷贝一份,使得一个新的集合对象指向这个地址块,但是集合中的对象变量却是指向堆中的同一块区域。所以当拷贝的集合修改了集合...
  • Java中的对象变量 其实就中一个指针,他指向对象的首地址,map中key对应的其实是某个对象的首地址,指向的是某个对象,你往对象中加了数据,对象的内容变了,但是对象的首地址没有变,map中的key仍然指向的是这个...
  • 介绍在 Java 语言里,当我们需要拷贝一个对象时,有两种类型的拷贝:浅拷贝与深拷贝。浅拷贝只是拷贝了源对象地址,所以源对象的值发生变化时,拷贝对象的值也会发生变化。而深拷贝则是拷贝了源对象的所有值,所以...
  • JAVA对象克隆

    2016-12-27 17:13:36
    为什么需要克隆当我们需要两个数据内容相同,但物理存储地址不同的对象时,就会用到对象了。 (简单点说,就是当你的数据操作需要得到新的保存,但又不想改变原数据时,这时,我们就需要创建这么一个新的对象) ...
  • Java对象内存分析

    2019-02-02 16:34:46
    只要出现了关键字new,就开辟了内存,如果将一个对象赋值给另一个对象,那么它们所指的是同一个内存地址,如果其中一个改变另一个也会改变,在Java中,所谓的性能调优,调整的就是内存问题 栈内存(虚拟机局部变量...
  • java对象的访问方式

    2020-05-09 23:56:16
    Java对象的访问方式有两种:句柄和直接指针。 句柄:java堆中会分出一...使用句柄来访问的最大好处是 reference 中存储的是稳定的句柄地址,在对象被移动时只会改变句柄中的实例数据指针,而 reference 本身不需要修改

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,817
精华内容 726
关键字:

java改变对象地址

java 订阅