Java基础-6-7Arrays

本文深入探讨了Java中一维数组到二维数组的转换过程,通过具体实例展示了如何利用Arrays类进行数组操作,包括复制、排序、填充等,并解析了Arrays类提供的各种实用方法,如binarySearch和equals,帮助读者掌握Java数组处理技巧。
package j2se;

import java.lang.reflect.Array;
import java.util.Arrays;

public class Shuzu_erweishuzu {
	public static void main(String[] args) {
		int[] a=new int[]{1,2,3,4,5};
		int[] b=new int[10];
		b=Arrays.copyOfRange(a, 3, 5);
		System.out.println("\na:");
		for(int each:a)
			System.out.print(each);
		System.out.println("\nb:");
		for(int each:b)
			System.out.print(each);
		
		String c=Arrays.toString(a);
		System.out.println("\nc:"+c);
		Arrays.sort(a);
		System.out.println("\nc:"+Arrays.toString(a));
		System.out.println("binarySearch\n:"+Arrays.binarySearch(a, 4));
		System.out.println("\nequal:"+Arrays.equals(a, b));
		
		Arrays.fill(b, 10);
		System.out.println("fill:"+Arrays.toString(b));
		
		
	}
}

 

### Java 泛型全面知识点与基础教程 #### 什么是泛型? Java 的泛型(Generics)是一种提供编译时类型检查的机制,允许在类、接口和方法中定义、传递和操作各种类型的对象,而无需明确指定具体类型。这种设计可以增强代码的可读性、可维护性,并减少类型转换错误[^1]。 --- #### 泛型的关键概念 ##### 1. **泛型类** 泛型类是指可以在类声明时使用一个或多个类型参数的类。这些类型参数可以用作字段、方法返回值或方法参数的占位符。 - **基本格式**: ```java public class Box<T> { private T content; public void setContent(T content) { this.content = content; } public T getContent() { return content; } } ``` - **注意事项**: - 泛型类的实际类型是在创建对象时指定的。 - 编译器会在运行时执行类型擦除,因此无法在泛型类中直接使用 `new T()` 创建实例[^3]。 --- ##### 2. **泛型接口** 类似于泛型类,泛型接口也可以接受类型参数。 - **基本格式**: ```java public interface Generator<T> { T next(); } ``` - **注意事项**: - 实现泛型接口的类可以选择固定某个类型或者保留泛型特性。 ```java // 固定类型 public class StringGenerator implements Generator<String> { @Override public String next() { return "Hello"; } } // 保持泛型 public class GenericGenerator<T> implements Generator<T> { @Override public T next() { return null; // 或者其他逻辑 } } ``` --- ##### 3. **泛型方法** 泛型方法是指在其签名中包含自己的类型参数的方法。即使该方法属于非泛型类,它仍然可以独立于类的类型参数工作。 - **基本格式**: ```java public <T> void method(T param) {} ``` - **示例**: ```java public class Util { public static <K, V> boolean compare(Pair<K, V> p1, Pair<K, V> p2) { return p1.getKey().equals(p2.getKey()) && p1.getValue().equals(p2.getValue()); } } class Pair<K, V> { private K key; private V value; public Pair(K key, V value) { this.key = key; this.value = value; } public K getKey() { return key; } public V getValue() { return value; } } ``` --- ##### 4. **通配符** 通配符用于表示未知类型,增强了泛型使用的灵活性。 - **协变 (`<? extends T>`)**:只允许访问子类型的数据。 ```java List<? extends Number> list = new ArrayList<>(); Number num = list.get(0); // 可以获取数据 // list.add(new Integer(1)); 不支持添加任何元素 ``` - **逆变 (`<? super T>`)**:只允许访问父类型的数据。 ```java List<? super Integer> list = new ArrayList<>(); list.add(new Integer(1)); // 支持添加Integer及其子类 Object obj = list.get(0); // 获取到的是Object类型 ``` - **无界通配符 (`<?>`)**:表示任意类型。 ```java List<?> list = new ArrayList<>(); Object obj = list.get(0); ``` --- ##### 5. **类型擦除** 类型擦除是 Java 中的一个重要概念,指的是在编译阶段会移除所有的泛型信息,在字节码层面不再存在具体的类型约束。 - **影响**: - 运行时无法判断泛型的具体类型。 - 静态上下文中不允许使用泛型变量。 - **解决方式**: 使用反射或其他工具(如 TypeToken),可以通过间接手段恢复部分类型信息。 --- ##### 6. **数组与泛型** 由于数组具有运行时类型检查的能力,而泛型依赖于编译期类型检查,这使得两者之间存在冲突。因此,不能创建带有泛型类型的数组。 - 错误示例: ```java List<String>[] stringLists = new List<String>[1]; // 编译报错 ``` - 替代方案: ```java List<String>[] stringLists = (List<String>[]) new List<?>[1]; ``` --- #### 总结 Java 泛型的核心在于提升代码的安全性和复用能力。通过了解其核心概念(如泛型类、泛型接口、泛型方法、通配符和类型擦除),开发者能够更高效地构建灵活且健壮的应用程序。 --- ### 示例代码 以下是综合运用泛型的知识点的简单例子: ```java public class Main { public static void main(String[] args) { Box<Integer> integerBox = new Box<>(); integerBox.setContent(10); System.out.println(integerBox.getContent()); Pair<String, Integer> pair = new Pair<>("Key", 123); System.out.println(pair.getKey() + ": " + pair.getValue()); List<Number> numbers = Arrays.asList(1, 2.5f, 3L); printNumbers(numbers); List<Object> objects = Arrays.asList("String", new Object(), 42); addObject(objects, "New Element"); } public static <T> void printNumbers(List<? extends Number> list) { for (Number number : list) { System.out.print(number.doubleValue() + " "); } System.out.println(); } public static <T> void addObject(List<? super T> list, T element) { list.add(element); } } class Box<T> { private T content; public void setContent(T content) { this.content = content; } public T getContent() { return content; } } class Pair<K, V> { private K key; private V value; public Pair(K key, V value) { this.key = key; this.value = value; } public K getKey() { return key; } public V getValue() { return value; } } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值