Java集合数组分析

  • 数组:连续的空间存储数据
  • 好处:便于数据的修改和查看
  • 坏处:不便数据的增加和删除,数组扩容

集合框架

  • 出现的原因:满足不同的需求
  • 好处:自动扩容

(一)Iterable(可迭代的)

1.Iterator(迭代器)
  • foreach(增强for循环):用来遍历数组
  • 语法:for(类型 变量:集合)
2.Collection
  • list:添加和访问一致
  • set:添加和访问不一致(由于去重,元素唯一)

1.List:添加顺序和打印顺序一致。掌握方法:增删改查

package com.sxt.collection;

import java.util.ArrayList;
import java.util.List;

public class TextList {
public static void main(String[] args) {
	List list=new ArrayList();
	//添加
	list.add("asd");
	list.add("azx");
	list.add("shfuwie");
	print(list);
	System.out.println("----------------");
	//修改
	list.set(0, "syp");
	print(list);
	System.out.println("----------------------");
	//查询
	list.get(1);
	list.subList(0, 2);
	print(list);
	System.out.println("----------------------");
	//删除
	list.remove(0);
//	list.remove("asd");//删除一个对象,需重写equals方法
	print(list);
}

private static void print(List list) {
	System.out.println(list);
	
}
}

(1) ArrayList(线程不安全)
适用范围:频繁的查找

package com.sxt.collection;

public class StudentM {
private String name;
private int age;
public StudentM(String name, int age) {
	super();
	this.name = name;
	this.age = age;
}
public String getName() {
	return name;
}
public void setName(String name) {
	this.name = name;
}
public int getAge() {
	return age;
}
public void setAge(int age) {
	this.age = age;
}
@Override
public String toString() {
	return "姓名:" + name + ", 年龄:" + age ;
}
@Override
	public boolean equals(Object obj) {
		if(obj==null) return false;
		if(obj instanceof StudentM){
			StudentM sm=(StudentM)obj;
			return toString().equals(sm.toString());
		}
		return false;
	}
}

package com.sxt.collection;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ArrayListM {
public static void main(String[] args) {
	List list=new ArrayList();//多态,父类引用指向子类对象
//	int i=0;
//	list.add(i);//自动封箱成Interger
	//向list集合中添加元素
	list.add(new StudentM("zhansan",10));
	list.add(new StudentM("lisi",9));
	list.add(new StudentM("zhangsan",12));
	list.add(1, new StudentM("wangwu", 11) );//根据index 添加数据
	print(list);
	System.out.println("以上添加----------------");
	//修改
	list.set(0, new StudentM("zs", 10));
	print(list);
	System.out.println("以上修改----------------------");
	//查询
//	list.get(1);
//	list.subList(0, 2);
	int selectCount=list.indexOf(new StudentM("lisi", 9));//根据字符串查索引
	System.out.println(selectCount);
	boolean b=list.contains(new StudentM("zhangsan", 12));//查询集合中是否包含该对象
	System.out.println(b);
//	list.containsAll(list);
	print(list);
	System.out.println("以上查询----------------------");
	//删除
	list.remove(new StudentM("wangwu", 11));//(remove)集合中一个对象,需重写equals方法
//	list.clear();//清除所有数据
//	list.remove(0);//根据索引删除
	print(list);
	System.out.println("以上删除----------------------");
	/**
	 * 迭代器遍历数组(增强for循环)
	 */
//	Iterator iterator=list.iterator();
//	while(iterator.hasNext()){
//		System.out.println(iterator.next());
//	}
}
/**
 * 数组的遍历
 * @param list
 */
private static void print(List list) {
	for(int i=0;i<list.size();i++){
		StudentM sm=(StudentM)list.get(i);
		System.out.println(sm);
	}
	
}
}

(2) LinkList(线程不安全)

2.Set:添加顺序和访问顺序不一致。增删查

package com.sxt.set_me;

import java.util.HashSet;

public class Student1 {
//	public class Student1 implements Comparable<Student1>{
	private String name;
	private int age;
	private boolean sex;
	public Student1(String name, int age, boolean sex) {
		super();
		this.name = name;
		this.age = age;
		this.sex = sex;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public boolean isSex() {
		return sex;
	}
	public void setSex(boolean sex) {
		this.sex = sex;
	}
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "姓名:"+name+",  年龄:"+age+",  性别:"+sex;
	}
//	@Override
//	public int compareTo(Student1 o) {
//		// TODO Auto-generated method stub
//		return toString().compareTo(o.toString());
//	}
	@Override
	public boolean equals(Object obj) {
		Student1 s=(Student1)obj;
		return s.toString().equals(this.toString());
	}
	@Override
	public int hashCode() {
		// TODO Auto-generated method stub
		return toString().hashCode();
	}
	}

  • 好处:自动去重(需根据具体需求重写hashcode、equals),排序(默认升序)

(1)HashSet(底层hash表)

  • hash表=数组+链表()。如果将数据存储到hash表中,必须要重写equals和hashcode方法
package com.sxt.set_me;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class TextHash1 {
public static void main(String[] args) {
	Set set=new HashSet<>();
	set.add(new Student1("张三",10,true));//true 男
	set.add(new Student1("张三",11,true));
	set.add(new Student1("李四",10,false));
	set.add(new Student1("李四",15,true));
	set.add(new Student1("张三",10,true));
	set.add(new Student1("李四",10,true));
	print(set);
}

private static void print(Set set) {
	Iterator iterator=set.iterator();
	while(iterator.hasNext()){
		System.out.println(iterator.next());
	}
}
}

(2)TreeSet(底层二叉树)

  • compareTo(去重),还可以排序
package com.sxt.set_me;

import java.util.Comparator;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;

public class TextTree1 {
public static void main(String[] args) {
	Set set =new TreeSet<>(new Comparator<Student1>() {

		@Override
		public int compare(Student1 o1, Student1 o2) {
			// TODO Auto-generated method stub
//			//默认排序
//			return o1.toString().compareTo(o2.toString());
			//根据年龄排序
			int c= o1.getAge()-o2.getAge();
			if(c!=0){
				return c;
			}
			c=o1.getName().compareTo(o2.getName());
			if(c!=0){
				return c;
			}
			return new Boolean(o1.isSex()).compareTo(o2.isSex());
		}
	});
//	set.add("abc");
//	set.add("bac");
//	set.add("acd");
//	set.add("abc");
//	print(set);
	set.add(new Student1("张三",10,true));//true 男
	set.add(new Student1("张三",11,true));
	set.add(new Student1("李四",10,false));
	set.add(new Student1("李四",15,true));
	set.add(new Student1("张三",10,true));
	set.add(new Student1("李四",10,true));
//	set.clear();
//	set.remove();
	set.contains(set);	
	print(set);
}

private static void print(Set set) {
	Iterator iterater=set.iterator();
	while(iterater.hasNext()){
		System.out.println(iterater.next());
	}
	
}
}

(二)MAP(Key,Value)

  • 代码中的使用
package com.sxt.lianxi.map;

import java.util.List;

public class GoodList {
private String name;
private int age;
private List<Goods> data;

static class Goods{
	
}
}

package com.sxt.lianxi.map;

public class User {
private String name;
private int age ;
public String getName() {
	return name;
}
public void setName(String name) {
	this.name = name;
}
public int getAge() {
	return age;
}
public void setAge(int age) {
	this.age = age;
}
public User(String name, int age) {
	super();
	this.name = name;
	this.age = age;
}
@Override
public String toString() {
	return "姓名:" + name + ", 年龄:" + age ;
}

}
public class MapLianXi<K,V> {
		public void add(V key){
			
		}
		public K get(K k){
			return null;
		}
	}
1.HashMap(可以有null值null键)
  • TableMap:不可以有null值null键
  • HashMap:可以有null值null键
2.TreeMap
package com.sxt.lianxi.map;

import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

public class MapLianXi{
public static void main(String[] args) {
//	MapLianXi<User, Goods> map=new MapLianXi<>();
//	System.out.println(map);
	Map map=new TreeMap<>();
	map.put("a", "aaa");//添加key,value
	map.put("b", "bbb");
	print(map);
	System.out.println("--------------");
	Object V= map.get("a");//获取Value值
	System.out.println(V);
//	System.out.println(map.size());//获取集合长度
//	map.clear();//清除
//	map.values();
//	System.out.println(s);
//	map.forEach(null);
	boolean V1=map.replace("a", "aaa", null);
	System.out.println(V1);
//	 boolean b=map.containsValue("xx");
//	 System.out.println(b);//是否包含该Value
	boolean k=map.containsKey("a");
	System.out.println(k);
	map.remove("a");//删除
	print(map);
//	print(map);
}
private static void print(Map map) {
	Set keySet =map.keySet();
	for(Object o:keySet){
		System.out.println(o);
	}
	Set entrySet=map.entrySet();
//	for(Object key:entrySet){
//		System.out.println(key);
//		System.out.println(key+"-------->"+map.get(key));
//	}
//	for(int i=0;i<map.size();i++){
//		System.out.println(map);
//	}
}

}

3.properties(父类是Map)
  • 配置文件:一般在代码中只读,不改,若要修改只需在文件中手动修改
  • 常用方法:load(加载),getProperties(K)(根据传入的key值返回Value),put(读),store(写入,存)

(三)泛型 <类型参数声明>

  • 出现:解决数据不统一
  • 本质:参数化类型,即操作的数据类型被指定为一个参数,我理解为可以作为一个参数来传递
  • 方法的泛型:位于方法返回类型之前,类型参数声明可以有多个类型 参数。
    例:pubic static <String,Student> void T(){}
  • 类的泛型:位于类名之后,可以有多个类型参数。
    例:public class Text<T,M,B>{}
  • 有界的参数类型(类型参数名称 extends 上界)。
    例:public <A extends Number> void Text(){}
    只能传入Number类型的参素,不能是String等其他的
  • 类型参数只能为引用类型,不能为基本类型(int,double等8种)
  • 类型通配符?代替所有的具体参数例:List<?>,可以理解为所有List的父类

(四)Collections(集合工具类)

类比Arrays

  • 常用方法:sort,synchronized,shuffle
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import javax.jws.Oneway;
import com.sxt.gdemo1.User;
public class TestUtils {
	public static void main(String[] args) {
		List<String> list=new ArrayList<>();
		list.add("asdsadsa");
		list.add("asd");
		list.add("sdfdf");
		list.add("asfd");
//		print(list);
//		Collections.sort(list);// 集合中的数据一定是可排序的(Comparable),或者重载传递比较器
//		Collections.sort(list, c);// 重载,需要比较器
//		print(list);
//		Collections.reverse(list);// 倒序。reverse(翻转)
//		Collections.sort(list);
//		print(list);
//		int binarySearch = Collections.binarySearch(list, "asfd", new Comparator<String>() {
//
//			@Override
//			public int compare(String o1, String o2) {
//				// TODO Auto-generated method stub
//				return o1.compareTo(o2);
//			}
//		});
//		System.out.println(binarySearch);
		print(list);
		//synchronized 都是将不同步集合转换成同步的集合(将线程不安全的转换称线程anquande);
//		List<String> synchronizedList = Collections.synchronizedList(list);
//		Collections.shuffle(list);// 随机排放集合中元素的位置,类似洗牌
//		print(list);
		// 将数组转换称集合。
//		String[] array = list.toArray(new String[]{});
	 List<String> asList = Arrays.asList(new String[]{"sdas"});
	}
	private static void print(List<String> list) {
		// TODO Auto-generated method stub
		for(String str:list){
			System.out.println(str);
		}
		System.out.println("---------------");
	}
//class NameCom implements Comparator<User>{

//	@Override
//	public int compare(String o1, String o2) {
//		// TODO Auto-generated method stub
//		return 0;
//	}
//
//	@Override
//	public int compare(User o1, User o2) {
//		// TODO Auto-generated method stub
//		return 0;
//	}
//	
//}
}
<think>首先,用户的问题是关于Java合和数组排序的方法和示例。我需要参考提供的引用来构建回答。引用包括: - [^1]: Java数组与合的介绍。 - [^2]: 使用Comparator接口对List<DomainVisit>排序。 - [^3]: 自定义数组排序,使用Arrays.sort和Comparator。 - [^4]: 数组排序的方法,比如选择排序。 - [^5]: 自定义排序器。 用户的请求是:"我想获取Java合数组排序的相关信息,如方法、示例等 请问Java合数组排序的方法和示例",意思是"我想获取Java合数组排序的相关信息,如方法、示例等。请问Java合数组排序的方法和示例?" 关键点:用户提到"合数组排序",这可能是个小混淆。"合"可能指的是Java合框架,"数组排序"可能指的是数组的排序。但从上下文,"合数组排序"可能意味着排序合(如List)或数组。引用中提到两者都有。 在我的回答中,我需要: 1. 使用中文回答。 2. 结构清晰,逐步解决问题。 3. 保证回答真实可靠。 4. 所有行内数学表达式用$...$格式,但Java代码不需要数学表达式,所以可能不适用。 5. 独立公式用$$...$$格式,同样可能不适用。 6. 生成相关问题。 7. 在引用段落末尾添加引用标识。 引用是提供的,我需要基于这些引用构建回答。引用[1]到[5]提供了相关信息。 核心主题:Java中的排序方法,特别是数组和合的排序。 整理信息: - 数组排序:可以使用Arrays.sort()方法。引用[3]和[4]提到Arrays.sort()和自定义排序。 - 合排序:可以使用Collections.sort()或List.sort()。引用[2]提到使用Comparator接口排序List。 - 自定义排序:通过Comparator接口实现自定义排序逻辑。引用[3]和[5]讨论这个。 - 示例代码:引用中有代码片段,如引用[3]的merge方法,引用[4]的选择排序实现。 回答结构: 1. **引言**:简要介绍Java中的数组和合排序。 2. **数组排序方法**: - 使用Arrays.sort()。 - 自定义排序:使用Comparator。 - 示例代码。 3. **合排序方法**: - 使用Collections.sort()或List.sort()。 - 自定义排序:使用Comparator。 - 示例代码。 4. **总结**:对比数组和合排序的区别或适用场景。 5. **相关问题**:生成相关问题。 引用标识:在提到引用内容时,在段落末尾添加[^n],例如,如果解释Arrays.sort(),引用[3],则添加[^3]。 确保回答真实可靠:基于提供的引用,但也可以添加一般知识,只要准确。引用是有限的,所以主要围绕它们。 具体步骤: - **数组排序**: - Arrays.sort()用于排序基本类型数组或对象数组。 - 对于对象数组,可以使用Comparator自定义排序逻辑。 - 示例:引用[3]中的代码:`Arrays.sort(intervals, Comparator.comparingInt(o -> o[0]));` - 另一个示例:引用[4]中的选择排序实现,但那是一个手动算法,不是内置方法。 - **合排序**: - Collections.sort()用于排序List。 - 同样,可以使用Comparator。 - 示例:引用[2]提到使用Comparator排序List<DomainVisit>,但没有具体代码。引用[5]提到自定义排序器。 引用[2]说:"可以使用 Collections.sort 方法或 List.sort 方法来对合进行排序。" 但没有给出示例代码。所以我需要用其他引用补充。 引用[5]有讨论自定义Comparator。 我可以创建一个简单的合排序示例。 代码格式:使用代码块来展示示例代码,如示例中所示。 在回答中,使用代码块包裹代码。 最终,生成相关问题。 完整回答大纲: 1. **Java数组排序方法**: - 描述Arrays.sort()方法。 - 示例:排序整数数组。 - 自定义排序:使用Comparator排序对象数组。 - 示例代码块。 2. **Java合排序方法**: - 描述Collections.sort()或List.sort()方法。 - 示例:排序ArrayList。 - 自定义排序:使用Comparator。 - 示例代码块。 3. **总结**:简要总结方法和适用场景。 4. **相关问题**:生成3-4个相关问题。 </think>以下是针对您查询的Java合和数组排序方法与示例的详细解答。我将结合提供的引用内容([^1]到[^5])进行结构化说明,确保回答真实可靠。Java中的数组(如`int[]`)和合(如`List`)都可以使用内置排序方法或自定义排序逻辑来实现排序。排序的核心是使用Java标准库中的工具,如`Arrays.sort()`用于数组、`Collections.sort()`或`List.sort()`用于合,并通过`Comparator`接口实现自定义顺序。下面我将分步解释方法和提供具体代码示例。 ### 1. Java数组排序方法 Java数组排序主要通过`java.util.Arrays`类的`sort()`方法实现。这个方法可以对基本类型数组(如`int[]`)进行自然排序(升序),也可以对对象数组(如`Integer[]`或自定义对象数组)使用`Comparator`接口进行自定义排序[^3][^4]。 #### 主要方法: - **自然排序**:使用`Arrays.sort(array)`,适用于基本类型数组或实现了`Comparable`接口的对象。 - **自定义排序**:使用`Arrays.sort(array, comparator)`,其中`comparator`是`Comparator`接口的实现,允许指定排序规则(如按对象的某个字段排序)。 #### 示例代码: ```java import java.util.Arrays; import java.util.Comparator; public class ArraySortExample { public static void main(String[] args) { // 示例1: 自然排序整数数组(升序) int[] intArray = {3, 1, 4, 1, 5, 9, 2, 6}; Arrays.sort(intArray); // 自然排序 System.out.println("自然排序结果: " + Arrays.toString(intArray)); // 输出: [1, 1, 2, 3, 4, 5, 6, 9] // 示例2: 自定义排序对象数组(按字段排序) // 定义一个二维数组,表示区间[start, end] int[][] intervals = {{1, 3}, {8, 10}, {2, 6}, {15, 18}}; // 使用Comparator按第一个元素(intervals[][0])升序排序 Arrays.sort(intervals, Comparator.comparingInt(o -> o[0])); System.out.println("自定义排序结果(按起始位置): " + Arrays.deepToString(intervals)); // 输出: [[1, 3], [2, 6], [8, 10], [15, 18]] // 示例3: 自定义降序排序(使用Lambda表达式) Integer[] integerArray = {5, 2, 9, 1, 5}; Arrays.sort(integerArray, (a, b) -> b - a); // 降序排序 System.out.println("自定义降序排序结果: " + Arrays.toString(integerArray)); // 输出: [9, 5, 5, 2, 1] } } ``` 在上述示例中: - `Arrays.sort(intArray)`直接对基本类型数组进行自然排序。 - `Arrays.sort(intervals, Comparator.comparingInt(o -> o[0]))`使用`Comparator.comparingInt`方法按数组元素的第一个字段排序,这在合并区间等场景很常见[^3]。 - 自定义降序排序通过Lambda表达式`(a, b) -> b - a`实现,展示了`Comparator`的灵活性[^5]。 ### 2. Java合排序方法 Java合(如`List`)排序使用`java.util.Collections`类的`sort()`方法或`List`接口的`sort()`方法。合排序同样支持自然排序(如果元素实现了`Comparable`)或自定义排序通过`Comparator`[^2][^5]。 #### 主要方法: - **自然排序**:使用`Collections.sort(list)`,要求合元素实现`Comparable`接口。 - **自定义排序**:使用`Collections.sort(list, comparator)`或`list.sort(comparator)`,其中`comparator`定义排序规则。 - **优势**:合排序更灵活,适用于动态数据结构如`ArrayList`或`LinkedList`。 #### 示例代码: ```java import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; public class CollectionSortExample { public static void main(String[] args) { // 示例1: 自然排序字符串列表(按字典序) List<String> nameList = new ArrayList<>(); nameList.add("John"); nameList.add("Alice"); nameList.add("Bob"); Collections.sort(nameList); // 自然排序(升序) System.out.println("自然排序结果: " + nameList); // 输出: [Alice, Bob, John] // 示例2: 自定义排序对象合(按字符串长度) // 自定义Comparator按字符串长度升序排序 Comparator<String> lengthComparator = Comparator.comparingInt(String::length); nameList.sort(lengthComparator); // 使用List.sort方法 System.out.println("自定义排序(按长度): " + nameList); // 输出可能: [Bob, John, Alice](依据实际长度) // 示例3: 自定义对象排序(例如DomainVisit对象) // 假设DomainVisit类有visitCount字段 List<DomainVisit> visits = new ArrayList<>(); visits.add(new DomainVisit("site1", 100)); visits.add(new DomainVisit("site2", 50)); visits.add(new DomainVisit("site3", 150)); // 使用Comparator按visitCount降序排序 Collections.sort(visits, (v1, v2) -> v2.getVisitCount() - v1.getVisitCount()); System.out.println("自定义对象排序(降序visitCount): " + visits); } } // 自定义对象类 class DomainVisit { private String site; private int visitCount; public DomainVisit(String site, int visitCount) { this.site = site; this.visitCount = visitCount; } public int getVisitCount() { return visitCount; } @Override public String toString() { return site + ":" + visitCount; } } ``` 在上述示例中: - `Collections.sort(nameList)`对字符串列表进行自然排序。 - `nameList.sort(lengthComparator)`使用`Comparator.comparingInt`按字符串长度排序,展示了自定义规则[^5]。 - `Collections.sort(visits, comparator)`对自定义对象列表按字段降序排序,引用[^2]提到类似方法可用于`List<DomainVisit>`排序。 ### 3. 排序方法的比较和注意事项 - **数组 vs 合排序**: - 数组排序使用`Arrays.sort()`,效率高但固定大小;合排序使用`Collections.sort()`或`List.sort()`,更适合动态数据[^1]。 - 两者都支持`Comparator`接口实现自定义逻辑,如按字段排序或复杂规则[^3][^5]。 - **性能**:基于内置的TimSort算法(混合了归并和插入排序),平均时间复杂度为$O(n \log n)$,适合大多数场景。手动算法如选择排序(引用[^4])效率较低$O(n^2)$,仅用于教学目的。 - **最佳实践**:优先使用内置方法,避免手动实现排序算法;确保对象实现`Comparable`或提供`Comparator`以支持自定义排序[^4][^5]。 ### 相关问题 为了帮助您深入学习Java排序,以下是基于本主题的相关问题: 1. Java中如何实现多字段排序(如先按年龄升序,再按姓名降序)? 2. Arrays.sort()和Collections.sort()在性能上有什么区别? 3. Java 8的Stream API如何用于排序合或数组? 如果您有具体排序需求(如处理大型数据或特定对象类型),欢迎提供更多细节,我可以给出更针对性的建议!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值