java面向对象:API(接口)与集合(ArrayList)

目录
  • API:
    • 接口概念:
  • API:String、StringBuilder的学习
    • String、StringBuffer、StringBuilder
    • String:
    • 注意:面试考点
    • StringBuffer
    • StringBuilder
      •  代码例子:
    • StringBuilder 和 String 相互转化:
    • 特殊方法拓展:
  • ArrayList
    • 集合概述:
  • 总结

API:

接口概念:

API(Application Programming Interface),应用程序编程接口,Java API是一本程序员的字典。是JDK中提供给我们使用的类的说明文档。

API是jdk提供的各种功能的java类。

这些类将底层的代码实现封装了起来,我们呢不需要这些类是如何实现的,只需要学习这些类如何使用即可。所以我们可通过查询API的方式,来学习Java提供的类,并得知如果使用它们。

API的使用步骤:

  • 打开帮助文档(jdk帮助文档_汉化版)
  • 点击显示,找到索引,看到输入框
  • 你要找谁?再输入框里输入,然后回车。
  • 看包。java.lang下的类不需要导包,其他需要。
  • 看类的解释说明。
  • 学习构造方法。
  • 使用成员方法。

所谓的API就是好多类好多方法,jdk提供了一些现成的类,可以直接俄拿过来使用,这些类是现成提供给我们,直接拿来使用的类,他们都叫做API。

API文档:告诉我们到底只有哪些类是现成的,到底有哪些方法具有各自怎样的功能,这个样的一份说明说就叫做API文档。
提示: string 关键字都是小写的, String是一个类,这个是jdk的作者写的。

API:String、StringBuilder的学习

String、StringBuffer、StringBuilder

首先,三者的区别:

String 字符串常量

StringBuffer 字符串变量(线程安全)

StringBuilder 字符串变量(非线程安全)

简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。

而如果是使用 StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。而在某些特别情况下, String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比

StringBuffer 对象慢,而特别是以下的字符串对象生成中, String 效率是远要比 StringBuffer 快的:

String S1 = “This is only a” + “ simple” + “ test”;

StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);

你会很惊讶的发现,生成 String S1 对象的速度简直太快了,而这个时候 StringBuffer 居然速度上根本一点都不占优势。其实这是 JVM 的一个把戏,在 JVM 眼里,这个

String S1 = “This is only a” + “ simple” + “test”; 其实就是:

String S1 = “This is only a simple test”; 所以当然不需要太多的时间了。但大家这里要注意的是,如果你的字符串是来自另外的

String 对象的话,速度就没那么快了,譬如:

String S2 = “This is only a”;

String S3 = “ simple”;

String S4 = “ test”;

String S1 = S2 +S3 + S4;

这时候 JVM 会规规矩矩的按照原来的方式去做

在大部分情况下 StringBuffer > String

StringBuffer

Java.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。

可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。

StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。

例如,如果 z 引用一个当前内容是“start”的字符串缓冲区对象,则此方法调用 z.append("le") 会使字符串缓冲区包含“startle”,而 z.insert(4, "le") 将更改字符串缓冲区,使之包含“starlet”。

在大部分情况下 StringBuilder > StringBuffer

java.lang.StringBuilder

java.lang.StringBuilder一个可变的字符序列是5.0新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。

其次,单独介绍:

String:

概念:

String 类代表字符串,Java 程序中的所有字符串文字(例如“abc”)都被实现为此类的实例

也就是说,Java 程序中所有的双引号字符串,都是 String 类的对象。

特殊点:

字符串不可变,它们的值在创建后不能被更改。

虽然 String 的值是不可变的,但是它们可以被共享,字符串效果上相当于字符数组( char[] ),但是底层原理是字节数组( byte[] )。

特点:

1、通过new创建的字符串对象,每一次new都会申请一个内存空间,虽然内容相同,但地址值不同。

2、以“”方式给出的字符串,只要字符序列相同(顺序和大小),无论在程序代码中出现几次,JVM都只会创建一个String对象,并在字符串池中进行维护。

注意:面试考点

如何理解String类的值不可变但可以共享?

string说的不可变是其值不可变,比如String str = "abc",不可变值得是abc不可变,当我们str = “abcde”时,abc没有被销毁,仍然存放在常量池中,只不过是让str指向了“abcde”的内存地址。所以就算不停的赋值,改变的也只是str引用的地址问题,右边的值是不改变的。

所以会产生冗余问题,占据大量内存空间,且无用。

而共享,共享是指你在声明一个具体内容的数据类型String时,如果你定义一个string name= "tttt ",它将自己生成一个字符串池,其他的字符串类型,如果内容相同,将直接访问字符串池,而不会再生成新的内存。它将使用串池里原来的那个内存,而不会重新分配内存,也就是说,string saname= "tttt ",将会指向同一块内存,变量名不同毫无关系。

String的常用方法:

1、indexOf(“字符”):查询指定的字符串是否存在,返回的是字符串的位置,不存在返回-1;

2、substring(int begIndex,int endIndex):截取字符串;

3、CharAt(值):拿到指定位置的字符;

4、length():返回字符串的长度;

5、equals():比较两个字符串是否相等;

6、toLowerCase():将字符串转换为小写字母;

7、toUpperCase():将字符串转换为大写字母;

8、equalsIgnoreCase(String):忽略大小写比较两个值是否相等;

9、spilt():将此字符串拆分为给定的 regular expression的匹配。

10、replace():返回从替换所有出现的导致一个字符串 oldChar ,在这个字符串 newChar 。

11、compareTo():按字典顺序比较两个字符串。

12、startsWith():判断当前字符串的前缀是否和指定的字符串一致。

StringBuffer

Java.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。

可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。

StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。

例如,如果 z 引用一个当前内容是“start”的字符串缓冲区对象,则此方法调用 z.append("le") 会使字符串缓冲区包含“startle”,而 z.insert(4, "le") 将更改字符串缓冲区,使之包含“starlet”。

StringBuilder

概念:

StringBuilder 是一个可变的字符串类,我们可以把它看成是一个容器。

这里的可变指的是 StringBuilder 对象中的内容是可变的。

String 和 StringBuilder 的区别:

String :内容是不可变的

StringBuilder:内容是可变的

构造方法:

添加和反转方法:

 代码例子:

添加:

反转:

StringBuilder 和 String 相互转化:

1. StringBuilder 转换为 String

public String toString():通过 toString() 就可以实现把 StringBuilder 转换为 String

2. String 转换为 StringBuilder

public StringBuilder(String s):通过构造方法就可以实现把 String 转换为 StringBuilder

特殊方法拓展:

line=line.toLowerCase();//字符串中的字母都转为小写

**toUpperCase()**:将字符串转换为大写字母;

line.equalsIgnoreCase(code)//忽视大小写比较。

**CharAt(值)**:拿到指定位置的字符;

**equals()**:比较两个字符串是否相等;

查找字符串(indexOf),截取字符串(substring(int begIndex,int endIndex))

例子:

String str = "Java语言是面向对象的,Java语言是健壮的,Java语言是安全的,Java是高性能的,Java语言是跨平台的";
        String tar = "Java";
     int count = 0;
        // 定义索引变量,表示每次找到子串出现的索引
        int index = -1;
        // 定义循环,判断条件为在字符串中找到了目标子串
        while ((index = str.indexOf(tar)) != -1) { // 将找到的索引赋值给变量并判断
            // 次数累加
            count++;
            // 把查找过的部分剪切掉,从找到的索引+子串长度的位置开始截取。
            str = str.substring(index + tar.length());
        }
        return count;

String.intern() 方法可以使得所有含相同内容的字符串都共享同一个内存对象,可以节省内存空间。

spilt方法:public String[] split(String regex); //根据给定正则表达式的匹配拆分此字符串。

该方法的作用就像是使用给定的表达式和限制参数 0 来调用两参数 split 方法。因此,所得数组中不包括结尾空字符串。

例如,字符串 “boo:and:foo” 使用这些表达式可生成以下结果:

Regex 结果
{ “boo”, “and”, “foo” }
o { “b”, “”, “:and:f” }

Arrays.sort(变量):冒泡排序的方法。

toCharArray():包含一切字符均转换成相应的字符数组。

ArrayList

集合概述:

概念:提供一种存储空间可变的存储模型,存储的数据容量可以发生改变。

特点:底层是数组实现的,长度可以变化。

ArrayList<E>: 可调整大小的数组实现, <E>:是一种特殊的数据类型,泛型。

怎么用呢?

在出现E的地方我们使用引用数据类型替换即可。

举例:ArrayList<String>,ArrayList<Student>

构造方法:

代码例子:

添加方法:

 代码例子:

public boolean remove(Object o),删除指定元素的方法应用

假如我要删除我在集合中添加的一种水果,请看以下:

Scanner sc=new Scanner(System.in);
        System.out.println("请输入您要删除的水果编号");
        String str=sc.nextLine();

        for (int i = 0; i < list.size(); i++) {
            if(list.get(i).getNum().equalsIgnoreCase(str)){
                System.out.println("你确定要删除该水果吗?(y/n)");
                String atr=sc.nextLine();
                if(atr.equalsIgnoreCase("y")){
                    list.remove(list.get(i));
                }
            }
        }
        System.out.println("水果信息删除完毕!");

public E set(int index,E element);

假如我要修改我在集合中添加的一种水果,请看以下代码:

这是修改集合中一组录入的信息:

Scanner sc=new Scanner(System.in);
        System.out.println("请输入您要修改信息的水果编号:");
        String str=sc.nextLine();
        System.out.println("请输入新的水果编号:");
        String newstr=sc.nextLine();
        System.out.println("请输入新的水果名称:");
        String atr=sc.nextLine();
        System.out.println("请输入新的水果单价:");
        double ner=sc.nextDouble();

        Pro02 p5=new Pro02();
        p5.setNum(newstr);
        p5.setName(atr);
        p5.setPrice(ner);

        for (int i = 0; i < list.size(); i++) {
            if(list.get(i).getNum().equals(str)){
                list.set(i,p5);
            }
        }

        System.out.println("水果信息更新完毕!");

而修改集合中录入一组信息中某一个位置的信息,看以下代码:

Scanner sc = new Scanner(System.in);

        System.out.println("请输入您要修改的商品编号");
        int sid = sc.nextInt();
        System.out.println("请输入您要修改的库存数量");
        int proNum = sc.nextInt();
//        第一种方法:
//        System.out.println(array.get(sid.charAt(0) - 49).getProNum());
//        array.get(sid.charAt(0) - 49).setProNum(proNum);

        //
        Pro pro1 = array.get(sid-1);//找到集合里面的下标sid-1(sid从1开始),就找到了集合里面的元素。
        pro1.setProNum(proNum);//把修改的proNum调用到新对象pro1

        array.set(sid-1,pro1);//array.set(index索引,元素element);修改指定位置的元素

    }

这就是修改单一元素的方法,找到索引位置,然后修改的元素信息覆盖旧的信息。

public E get(int index);

获取或者是说返回具体索引位置的方法:大多数用于获取某一个元素,或者某一个位置上的元素。通过遍历的方式找到。

例如:

ArrayList<Customer_2> cust=new ArrayList<Customer_2>();

        for (int i = 0; i < list.size(); i++) {
            cust.add(list.get(i));
        }
        return cust;

其中,list是集合,list.get(i),就是遍历获取每一个元素。

总结

本片文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • Java Iterator接口遍历单列集合迭代器原理详解

    这篇文章主要介绍了Java Iterator接口遍历单列集合迭代器原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Iterator接口概述 在程序开发中,经常需要遍历集合中的所有元素.针对这种需求,JDK专门提供了一个接口java.util.Iterator . Iterator 接口也是Java集合中的一员,但它与 Collection . Map 接口有所不同,Collection 接口与 Map 接口主要用于存储元素,而 Iter

  • Java集合排序规则接口Comparator用法解析

    1. 前言 最近用到了集合排序(基于 Java 8).现在我能用 Stream 的就用 Stream ,真香!排序可以这么写: List<People> peoples = new ArrayList<>(); // 中间省略 // 按照年龄从小到大排序 peoples.sort(Comparator.comparing(People::getAge)); 这里排序用到了一个关键接口 java.util.Comparator.排序比较作为业务中经常出现的需求,我们有必要研究一下这个

  • Java List接口的集合使用详解

    目录 ArrayList集合 LinkedList类 LinkedList与ArrayList的区别: 总结 List接口继承collection接口,此接口可以对列表中的每个元素精确的控制,可以根据元素的索引来获取列表中的值,下面介绍常用的几种,ArrayList,LinkedList. ArrayList集合 ArrayList是一个动态修改的数组,它没有固定的大小,不需要自己分配空间,java本身已经初始化容量为10的大小,可以直接添加删除等一系列操作. ArrayList构造方法: Ar

  • 浅析Java集合及LIst接口

    一.集合的概念 1.概述: 在学习集合前,先回忆一下数组的一个特征---数组有固定的长度,定义一个数组:int[] array = new int[];而针对数据长度可变的情况,产生了集合,java集合就是为了应对动态增长数据,在编译时无法知道具体的数据量而产生的. 集合类又叫容器类. 2.集合和数组的区别 都是容器,数组时固定的长度,集合时可变的: 数组存放的数据都是基本数据类型(四类八种)集合存放的数据都是引用数据类型(String.Integer.自定义数据类型) 集合中对于基本数据类型会

  • Java动态获取实现某个接口下所有的实现类对象集合

    最近有个需求,我需要获取所有同一类型的定时任务的对象,并自动执行. 我想的方案是:直接获取某个接口下面所有的实现类的对象集合,方便以后只需要 实现这个接口,就能自动被加载执行.话不多说,说说我的实现方案. 开始想着用反射自己写一个工具类,后面懒得去折腾,就直接用第三方工具包了,这里我用的是org.reflections. maven配置: <dependency> <groupId>org.reflections</groupId> <artifactId>

  • java面向对象:API(接口)与集合(ArrayList)

    目录 API: 接口概念: API:String.StringBuilder的学习 String.StringBuffer.StringBuilder String: 注意:面试考点 StringBuffer StringBuilder  代码例子: StringBuilder 和 String 相互转化: 特殊方法拓展: ArrayList 集合概述: 总结 API: 接口概念: API(Application Programming Interface),应用程序编程接口,Java API是

  • 带你轻松搞定Java面向对象的编程--数组,集合框架

    目录 一.数组 1.数组的定义 2.数组的声明 3.数组的初始化 二.集合概述 三.Collection接口 1.Collection接口概述 2.集合框架的三个组件 3.Iterator接口 四.List接口 1.ArrayList类 2.LinkedList类 五.Set接口 1.HashSet类 六.Map接口 1.HashMap类 七.泛型 总结 一.数组 1.数组的定义 数组是为了解决同类数据整合摆放而提出的,可以理解为一组具有相同类型的变量的集合,它的每个元素都具有相同的数据类型.

  • 浅谈java调用Restful API接口的方式

    摘要:最近有一个需求,为客户提供一些RestfulAPI接口,QA使用postman进行测试,但是postman的测试接口与java调用的相似但并不相同,于是想自己写一个程序去测试RestfulAPI接口,由于使用的是HTTPS,所以还要考虑到对于HTTPS的处理.由于我也是首次使用Java调用restful接口,所以还要研究一番,自然也是查阅了一些资料. 分析:这个问题与模块之间的调用不同,比如我有两个模块frontend和backend,frontend提供前台展示,backend提供数据支

  • Java 调用Restful API接口的几种方式(HTTPS)

    摘要:最近有一个需求,为客户提供一些Restful API 接口,QA使用postman进行测试,但是postman的测试接口与java调用的相似但并不相同,于是想自己写一个程序去测试Restful API接口,由于使用的是HTTPS,所以还要考虑到对于HTTPS的处理.由于我也是首次使用Java调用restful接口,所以还要研究一番,自然也是查阅了一些资料. 分析:这个问题与模块之间的调用不同,比如我有两个模块front end 和back end,front end提供前台展示,back

  • Java面向对象基础之多态性,抽象类和接口

    一.多态性 多态是指一个对象可以拥有多种不同的形态,继承是实现多态的基础. 1.1 引用多态和方法多态 引用多态:父类引用可以指向本类的对象,也可以指向子类的对象 方法多态: 1.创建本类对象时,调用的方法为本类方法: 2.创建子类对象时,调用的方法为子类重写或继承的方法. 首先建立父类Animal,包含一个eat()方法,如下代码所示: public class Animal { public void eat(){ System.out.println("动物可以吃东西"); }

  • Java调用腾讯云短信API接口的实现

    前言 有想使用短信API服务的朋友可以如果没有注册腾讯云的话可以注册一下,好像新用户可以免费领取100条短信服务(PS:绝对不是打广告) 一.登录腾讯云操作平台 登陆腾讯云的平台https://cloud.tencent.com/,登陆成功后搜索短信,进入短信产品的控制台,进入短信平台后,需要创建签名和创建正文模板. 1.创建签名模板 2.创建正文模板 这两步都需要审核,按照指引填写即可,一般时间会在2小时左右. 当你的签名审核通过后,在控制台可以看到签名的id和签名的内容,其中签名的内容在后续

  • java面向对象设计原则之接口隔离原则示例详解

    目录 概念 实现 拓展 概念 小接口原则,即每个接口中不存在子类用不到却必须实现的方法,如果不然,就要将接口拆分.如下图所示定义了一个接口,包含了5个方法,实现类A用到了3个方法.实现类B用到了3个方法,类图如下: 类A没有方法4.方法5,却要实现它:类B没有方法2.方法3,但还是要实现这两个方法,不符合接口隔离原则.改造为将其拆分为三个接口,实现方式改为下图所示,符合接口隔离原则: 实现 面向对象机制中一个类可以实现多个接口,通过多重继承分离,通过接口多继承(实现)来实现客户的需求,代码更加清

  • Java面向对象程序设计:抽象类,接口用法实例分析

    本文实例讲述了Java面向对象程序设计:抽象类,接口用法.分享给大家供大家参考,具体如下: 本文内容: 抽象类 接口 抽象类与接口的异同 首发日期:2018-03-24 抽象类: 虽然已经有了父类,但有时候父类也是无法直接描述某些共有属性的,比如哺乳类和人类都会叫,而一般来说哺乳类这个父类并没有准确定义"叫"的属性的,显然应该由子类来决定怎么"叫",但"叫"这个属性是共有的,那么可以把这个属性抽象化(抽象则代表没有具体内容),由子类来实现具体内容

  • Java中Map接口使用以及有关集合的面试知识点汇总

    目录 Map接口 存储特点 常用实现类 创建方法 常用方法 遍历方法 不同实现类的使用 集合面试知识点补充 结语 Map接口 存储特点 以键(key)值(value)对的形式存储 键无序.无下标.元素不可重复 值无序.无下标.元素可以重复 常用实现类 HashMapJDK1.2 底层哈希表实现 线程不安全,效率高 LinkedHashMapJDK1.2 是HashMap的子类,底层哈希表实现 线程不安全,效率高 TreeMapJDK1.2 是SortedMap的实现类,底层红黑树实现 线程不安全

随机推荐