Java複合データ型

1. Java文字列

文字列は、Javaでは文字列型のオブジェクトとして扱われます。Stringクラスはjava.langパッケージにあり、デフォルトで自動的にインポートされます。

文字列オブジェクトが作成された後は変更されません文字列オブジェクトを変更するとき、実際には元の参照が新しく作成されたメモリ空間を指すようにします。また、同じ文字列定数Javaは2つのメモリ空間を割り当てませんが、2つの参照が同じ空間を指すようにします。

public class MyString {
    public static void main(String[] args) {
        String s1="字符串";
        String s2="字符串";
        String s3=s1;
        System.out.println(s1==s2);     // s1、s2字符串内容相同,指向相同的内存空间,输出:true
        System.out.println(s1==s3);     // 修改之前s1与s3相同,输出:true
        s1="修改字符串";
        System.out.println(s1==s3);     // 修改之后s1指向新的内存空间,与s3不同,输出:false
    }
}

Stringの一般的なメソッド:

頻繁に変更される文字列を使用する必要がある場合は、StringBuilderクラスを使用して保存できます。変更が同じメモリアドレスを指している場合でも、追加、置換、その他のメソッドを使用して文字列を変更できます。

public class MyString {
    public static void main(String[] args) {
        StringBuilder s4=new StringBuilder("初始字符串");
        StringBuilder s5=s4;
        s4.replace(0,10,"修改后的字符串");
        System.out.println(s4);
        System.out.println(s4==s5);     // 修改后仍然指向同一块内存,因此输出:true
    }
}

2. Javaでのクラスのパッケージ化

intやdoubleなどのJavaの基本データ型にはオブジェクトの特性がありません。他のオブジェクトのように独自のメソッドを持つために、Javaは各基本データ型にラッパークラスを提供し、オブジェクトのように基本データ型を操作します。ラッパークラスの基本的なメソッドは、型間の変換に使用されます。

Javaパッケージクラスは自動的にボックス化/ボックス化解除できます。つまり、基本型とパッケージングクラスの間の型変換は=演算子によって自動的に完了します。

                // 定义int类型变量,值为86
		int score1 = 86;       
		// 使用int创建Integer包装类对象,手动装箱
		Integer score2=new Integer(score1);  
                Integer score2=score1;    //自动装箱      
		// 将Integer包装类转换为double类型
		double score3=score2.doubleValue();        
		// 将Integer包装类转换为float类型
		float score4=score2.floatValue();        
		// 将Integer包装类转换为int类型,手动拆箱
		int score5 =score2.intValue();	
                int score5 = score2        // 自动拆箱	
		// 将字符串转为int
		int score6 = Integer.parseInt("666");

基本タイプと文字列間の変換:

   

java.utilパッケージのDateクラスを使用して時間オブジェクトを作成し、java.textパッケージのSimpleDateFormatクラスを使用して、時間を目的の形式の文字列に変換します。「yyyy-MM-dd HH:mm:ss」は事前に文字列を定義します。yyyyは4桁の年、MMは2か月、ddは2桁の日、HHは時間(24時間時計を使用)、mmは分、ssは秒を意味するため、変換のターゲット形式を指定し、最後にformat()メソッドを呼び出して、時間オブジェクトの日付を指定された形式の文字列に変換します。それ以外の場合、parse()メソッドは通常の文字列を日付オブジェクトに変換できます。

java.util.Calendarクラスを使用すると、時間の処理が簡単になり ます。getInstance()静的メソッドを呼び出すと、Calendarオブジェクトを取得できます。デフォルトでは、現在の時間を表します。c.getTime()を使用して、Dateオブジェクトに変換できます。Calendarオブジェクトのその他のメソッドは次のとおりです

Mathクラスはjava.langパッケージにあり、基本的な数学演算を実行するためのメソッドが含まれています。Mathクラスのすべてのメソッドは静的メソッドであるため、このクラスのメソッドを使用する場合は、クラス名を直接使用できます。 .round();

3. Javaでのデータ収集

さまざまな基本データ型に基づいて、Javaはコレクションクラスをコンテナとして使用し、同じ属性を持つオブジェクトを格納します。コレクションクラスを介してデータを編成すると、特定のデータの迅速な挿入、削除、およびクエリを実現できます。配列と比較すると、コレクションの長さは柔軟で可変であり、検索方法は添字だけではありません。Javaの一般的なコレクションクラスは、コレクションとマップという2つのインターフェイスに分かれています。コレクションには、リスト、キュー、キュー、リストの3つのサブインターフェイスがリンクされています。リストの一般的な実装クラスは配列シーケンスArrayListで、キューの実装クラスはLinkedListです。クラスはハッシュセットです。データは1つずつコレクションに格納され、データはキーと値のペア<key、value>に従ってマップに格納されます。

Collectionインターフェースは、ArrayListやSetなどの特定の実装クラスのインターフェースメソッドを規定します。たとえば、それらはすべてadd()メソッドを使用して要素を追加するため、一部のメソッド名は各クラスの実装で共通です。

配列リスト

ArrayListは配列に似たコンテナで、オブジェクトをArrayListに格納して、整理と管理を容易にします。add()メソッドを使用してリストに単一のオブジェクトを挿入できます。addAll()は複数のオブジェクトで構成されるサブリストを親リストに挿入できます。挿入時に挿入位置を指定できます。Arrays.asList()を使用してオブジェクト配列をオブジェクトに変換できます次に、リストが挿入されます。たとえば、CourseオブジェクトをリストcourseListに挿入します。

public void addCourse(){
    Course c1=new Course(1,"数据结构");
    Course c2=new Course(2,"操作系统");
    Course[] cArr={new Course(3,"组成原理"),new Course(4,"计算机网络")};

    courseList.add(c1);                         // 向数组列表中添加对象
    courseList.add(0,c2);                 // 向指定位置添加对象
    courseList.addAll(Arrays.asList(cArr));     // 向列表中添加子列表,前加数字表示插入位置
    Course tmp=(Course)courseList.get(0);       // 从列表中取出对象
}

size()メソッドを使用してリストの長さを取得し、get()メソッドを使用して指定された位置にあるオブジェクトを取得し、forループを介して各オブジェクトをトラバースするか、for eachメソッドを使用して各要素をトラバースできます。イテレータを介して各オブジェクトにアクセスすることもできます。各オブジェクトはリストにObjectオブジェクトとして保存されているため、取り出した後、(Course)などの強制的なタイプによって元のオブジェクトタイプに変換する必要があります。たとえば、Courseクラスのオブジェクトに変換されます。

    public void showCourse(){
        int listLength=courseList.size();           // 获取列表长度
        for (int i=0;i<listLength;i++) {
            Course c=(Course)courseList.get(i);     // 获取列表第i个元素
            System.out.println(c.name);
        }
    }

    public void iteratorCourse(){
        Iterator it=courseList.iterator();          // 获取迭代器
        while (it.hasNext()){                       // 如果仍有下一个元素
            Course c=(Course)it.next();             // 取出下一个元素
            System.out.println(c.name);
        }
    }

set()メソッドを使用して、リストの指定された位置にある要素を変更します。remove()メソッドを使用して、指定された場所または指定されたオブジェクトを削除します。removeAll()を使用して、親リストに含まれる子リストのすべての要素を削除します

    public void modifyCourse(){
        courseList.set(2,new Course(5,"离散数学"));     // 修改2位置上的对象
    }

    public void removeCourse(){
        courseList.remove(3);               // 删除3位置上的对象
        Course c1= (Course) courseList.get(1);
        Course c2=(Course) courseList.get(2);
        courseList.remove(c1);                      // 删除指定对象
        Course[] cArr={c1,c2};
        courseList.removeAll(Arrays.asList(cArr));  // 删除courseList中所包含的cArr的元素
    }

()が含まれ、さもなければ、判断、のcontainsAll()メソッドのリストは、1つまたは少数のオブジェクトが含まれ、その実装原理は、比較するために、その等号()メソッドとターゲットオブジェクトを呼び出すことにより、リストに各オブジェクトをトラバースすることであるが存在する場合に真を返しますfalseを返します。したがって、Courseクラスのequals()メソッドをオーバーライドし、contains()メソッドを呼び出して、リストに指定されたCourseオブジェクトが含まれているかどうかを判断できます。同様に、indexOf()メソッドは、equals()を呼び出すことによって、リスト内で最初に出現する要素を見つけることができます。

    // 重写Course类的equals()方法
    public boolean equals(Object o) {
        if (this == o) return true;     // 如果两个对象的地址相同,肯定相同
        if (!(o instanceof Course)) return false;
        Course course = (Course) o;
        return id == course.id &&       // 判断两个Course对象的id和name相同
                name.equals(course.name);
    }

    // 在CourseList中调用contains()判读是否包含某个对象
    public void containCourse(){
        Course nc=new Course(5,"数据结构");
        if(courseList.contains(nc)) {                     // 判断List中是否包含Course对象nc
            int index = courseList.indexOf(nc);           // 获取元素在List中的位置
            System.out.println("列表中包含该课程,位置:" + index);
        }
    }

前述のように、コレクションに格納されているすべてのオブジェクトはオブジェクトへの参照です。コレクションが格納されるたびに、特定のタイプのオブジェクトは無視されます。時々、他のタイプのオブジェクトが格納され、実行時にエラーが発生し、それらが取り出されるたびに型変換が復元されます。ジェネリックを使用て、コレクションが特定のタイプまたはそのサブタイプのオブジェクトのみを格納できるように指定できます。これにより、コンパイル中にタイプチェックが実行され、フェッチ時に特定のタイプのオブジェクトを直接返すことができます。ジェネリックは基本的なデータ型には使用できないことに注意してください。たとえば、リスト<int>はエラーを報告し、そのラッパークラスリスト<Integer>を使用する必要があります。

    // 创建元素类型为Course的列表
    public List<Course> courseList=new ArrayList<Course>();

    public void addCourse(){
        Course c=new Course(6,"数据结构");
        courseList.add(c);
//        courseList.add("字符串");    // 尝试向列表中添加非Course类型的对象,报错
        Course c2=courseList.get(0);        // 可以直接取出为Course类型对象
        System.out.println(c2.name);
    }

Listオブジェクトの並べ替えは、コレクションツールクラスのCollections.sort()メソッドを使用し実現できます。その実装の原則は、各要素のcompareTo()メソッドを呼び出してオブジェクトを比較および並べ替えることです。したがって、各オブジェクトは比較可能なタイプ、つまりComparableインターフェースを実装する必要のあるオブジェクトでなければなりません。以下に示すように、最初に比較可能なクラスStudentを定義し、次に生徒リストstudentLisを定義します。生徒オブジェクトを追加した後、Collections.sort()メソッドを呼び出してリストを実行します並べ替え。

public class Student implements Comparable<Student> {   // 定义Student类实现Comparable接口
    public String name;
    public int id;

    public Student(int id, String name) {
        this.name = name;
        this.id = id;
    }

    @Override
    public int compareTo(Student o) {        // 实现接口的方法,根据id大小对学生进行比较
        if (this.id>o.id){          // 如果大于o返回1
            return 1;
        }else if (this.id<o.id){    // 小于返回-1
            return -1;
        }else {                     // 等于返回0
            return 0;
        }
    }
}

public class ListSort {
    public List<Student> studentList=new ArrayList<Student>();    // 学生列表

    public void sortStudent(){
        Student s1=new Student(1011,"小明");
        Student s2=new Student(1005,"小赵");
        Student s3=new Student(1021,"小钱");
        Student[] sArr={s1,s2,s3};
        studentList.addAll(Arrays.asList(sArr));
        Collections.sort(studentList);                // 调用方法对学生列表进行排序
        for (Student s:studentList) {
            System.out.println(s.id+":"+s.name);
        }
    }
}

2つのオブジェクトを比較するためにsort()メソッドを呼び出すときに、カスタムコンパレータオブジェクトComparatorを渡すこともできます。その場合、StudentクラスはComparableインターフェースを実装する必要がありません。

// 自定义比较器类来实现两个Student对象的比较
public class StudentComparator implements Comparator<Student> {
    @Override
    public int compare(Student o1, Student o2) {
        if (o1.id>o2.id){          // 如果大于o返回1
            return 1;
        }else if (o1.id<o2.id){    // 小于返回-1
            return -1;
        }else {                     // 等于返回0
            return 0;
        }
    }
}

// 调用修改如下:
Collections.sort(studentList,new StudentComparator());

ハッシュセット

ハッシュセットはセットの実装クラスです。リストとは異なり、セット内の要素は順序付けされておらず、繰り返すことはできません。

リストと同様に、追加、削除、その他の操作は、add()、remove()、およびその他のメソッドによってSetで実装されます。Setは順序付けされていないため、指定された位置に要素を挿入/取得するset()、get()メソッドはなく、for、iterator、および各トラバーサルの結果の順序によって要素を反復処理します。

HashSetのcontains()メソッドは、最初にオブジェクトのhashCode()メソッドを呼び出してハッシュコードを比較し、次にequals()メソッドを呼び出します。両方がtrueの場合、2つのオブジェクトは同じと見なされます。

たとえば、HashSetを使用して、学生が選択したコースを保存します

public class Student {
    public String name;
    public int id;
    public Set<Course> courses;     // 用set保存学生所选课程

    public Student(int id, String name) {
        this.name = name;
        this.id = id;
        this.courses=new HashSet<Course>();     //创建Hash集
    }

    public static void main(String[] args){
        Course c=new Course(1,"数据结构");
        Student s=new Student(101,"小明");     
        s.courses.add(c);               // 向集中添加对象
        for (Course course:s.courses) {         // 遍历集
            System.out.println(course.name);
        }
    }
}

HashMap

Mapは、1対1のキーと値のペア<key、value>の形式でデータを格納します。キーを使用すると、マッピング関係を通じて値をすばやく見つけることができ、キーの値を繰り返すことはできません。Mapは、一般的なMap <K、V>もサポートしています。キーと値のペアをマップに追加(キー、値)、削除(キー)してキーを削除します。Mapのキー、値、およびキーと値のペアは、それぞれkeySet()、values()、およびentrySet()メソッドを介して取得できます。返されたキーと値のペアEntryは、汎用タイプを定義できます。マップのキーと値のペアを変更するには、put()メソッドも使用します。新しいキーと値のペアは元の値を上書きします。containsKey(キー)メソッドは、マップにキー値が含まれているかどうかを返し、containsValue(値)は、マップに特定の値が含まれているかどうかを返し、オブジェクトのequals()メソッドを呼び出すことによって存在するかどうかを返します。

    // 创建存储学生类的哈希Map
    public Map<Integer,String> studentMap=new HashMap<Integer, String>();

    public void addStudent(){
        Scanner input=new Scanner(System.in);
        System.out.print("请输入学生ID:");
        int studentID=input.nextInt();
        String s=studentMap.get(studentID);        // 根据key值获取对应的value
        if (s!=null){                              // 如果s不为空说明该key已经存在
            System.out.println("该学生ID已存在!");
        }else {
            System.out.print("请输入姓名:");
            String name=input.next();
            studentMap.put(studentID,name);     // 将<ID,name>键值对添加到Map中
        }
    }

    public void showStudent(){            //通过foreach遍历HashMap
        // 获取Map的键值对Entry并对其泛型进行定义
        Set<Map.Entry<Integer,String>> entrySet=studentMap.entrySet();
        for(Map.Entry<Integer,String> entry:entrySet){
            int key= entry.getKey();                    // 从Entry中获取key
            String name=entry.getValue();               // 从Entry中获取value
            System.out.println(key+":"+name);
        }
    }

    public void showStudent2(){            //通过迭代器遍历HashMap
      Iterator iter = studentMap.entrySet().iterator();
      while (iter.hasNext()) {
          Map.Entry entry = (Map.Entry) iter.next();
          Int key= entry.getKey();
          String name = entry.getValue();
            System.out.println(key+":"+name);
        }
  }

 

元の記事124件を公開 65のような 130,000 以上を 訪問

おすすめ

転載: blog.csdn.net/theVicTory/article/details/104114219