IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java数组实现简单队列(二) -> 正文阅读

[Java知识库]Java数组实现简单队列(二)

1.数组排序(数字)

1.Arrays类中的sort()方法

在Java中sort()方法是Arrays类的静态方法,用于数组排序,简单好用。
由小到大排序的:

import java.util.Arrays;
public class Example {
	public static void main(String[] args) {
		int []a= {3,16,8,21,15,4,2,7};
		Arrays.sort(a);
		System.out.println(Arrays.toString(a));
	}
}

输出结果:

[2, 3, 4, 7, 8, 15, 16, 21]

public void Sort2(String str){
		char[] chs = str.toCharArray();
		System.out.println("原:");
		System.out.println(chs);
		Arrays.sort(chs);
		System.out.println("排序后:");
		System.out.println(chs);
	}

运行结果:

原:
to good too no string and now
排序后:
addgginnnnooooooorstttw

2.排序算法

排序算法有冒泡排序,选择排序,快排,计数排序,桶排序等。下边是冒泡排序:

public class Example {
	public static void main(String[] args) {
		int []arr= {3,16,8,21,15,4,2,7};
		//冒泡排序
		for(int i=0;i<arr.length;i++) {
			for(int j=i+1;j<arr.length;j++) {
				if(arr[i] > arr[j]) {
					Object tmp = arr[j];
					arr[j]=arr[i];
					arr[i]=(int) tmp;
				}
			}		
		}
		System.out.println(Arrays.toString(arr));
	}
}

输出结果:

[2, 3, 4, 7, 8, 15, 16, 21]

2. 数组排序(字符串/对象)

对数字进行排序较为简单,那如果是对象和字符串怎样排序呢?可以想办法将对象和字符串转变为数字的形式,即采用哈希算法计算对象的哈希值。
hashCode()

1.字符串:

字母的hash值是它的ASCII码;
相同字符串的hash值相同,不同字符串则不同。

		String str = new String("a");
		System.out.println(str.hashCode());
		String str = new String("abc");
		System.out.println(str.hashCode());
		String str2 = new String("bac");
		System.out.println(str2.hashCode());
		String str3 = new String("bac");
		System.out.println(str3.hashCode());

结果:

97
96354
97284
97284

2.对象:

在创建对象的类型一致时,哈希值不相等,但如果对象重写了equal方法,同时重写了hashcode,对象的哈希值相等。

import java.util.Objects;
public class Example {
	public static void main(String[] args) {
		Object o = new Object();
		System.out.println(o.hashCode());
		Object o1 = new Object();
		System.out.println(o1.hashCode());
		User user = new User();
		System.out.println(user.hashCode());
		User user1 = new User();
		System.out.println(user1.hashCode());
	
		}
		}
		class User{
			String name;
			int id;
			String pwd;
			@Override
			public boolean equals(Object o) {
				if (this == o) {
					return true;
				}
				if (o == null || getClass() != o.getClass()) {
					return false;
				}
				User user = (User) o;
				return id == user.id && Objects.equals(name, user.name) &&
				Objects.equals(pwd, user.pwd);
			}
			@Override
			public int hashCode() {
			    return Objects.hash(name, id, pwd);
	}
}

运行结果:

366712642
1829164700
29791
29791

3. 代码实现排序

public void Sort(){
	        for(int i = 0; i<arrvalue.length; i++) {
	             for (int j = i+1; j<arrvalue.length; j++) {
	            	 int x=arrvalue[i].hashCode();
	            	 int y=arrvalue[j].hashCode();
	                if(x>y) {
	                   Object temp = arrvalue[i];
	                   arrvalue[i] = arrvalue[j];
	                   arrvalue[j] = temp;
	                }
	             }
	          }
	        System.out.println("排序后:");
	        System.out.println(Arrays.toString(arrvalue));
		}

3. 数组队列实现

代码:

import java.util.Arrays;
/**
 * 属性:
 * length:长度
 * size:个数:从一开始;下标:从零开始
 * arrvalue:数组;  Object是所有类的父类
 * dflength:默认长度
 */
public class MyArrayList implements List{
	int size;
	int length;
	Object[] arrvalue;
	final int dflength=20;
	public int getSize() {
		return size;
	}
	public int getLength() {
		return length;
	}
	//初始化
	public MyArrayList() {
		length=dflength;
		arrvalue=new Object[length];
		size=0;
	}
	@Override
	public void initList() {
		length=dflength;
		arrvalue=new Object[length];
		size=0;
	}
	//初始化长度
	public MyArrayList(int l) {
		if(l<0) {
			System.err.println("存在错误:长度参数小于零");
		}
		if(l>=Integer.MAX_VALUE) {
			System.err.println("存在错误:长度参数大于上限");
		}
		if(l<=dflength) {
			initList();
		}
		if(l>dflength) {
			length=l;
			arrvalue=new Object[length];
			size=0;
		}
		System.out.println("初始化长度成功");
	}
	//扩容
	@Override
	public void growl() {
		int oldl=length;
		int newl=(oldl>>1)+oldl;
		length=newl;
		Object[] newArr=new Object[length];		
		//System.out.println("扩容后长度:"+length);
		for(int i=0;i<arrvalue.length;i++) {
			newArr[i]=arrvalue[i];
		}
		arrvalue=newArr;
		newArr=null;
		System.out.println("扩容后长度:"+getLength());
        System.out.println("扩容后元素个数:"+getSize());
	}
	//增(添加元素)
	@Override
	public void add(Object value) {
		//size越界时
		if(size>=length){
            growl();
        }
		arrvalue[size++]=value;
		test();
	}
	//删(下标)
	@Override
	public void sub(int size1) {//删除下标为size1的元素
		if(size1<0||size1>=length) {
			System.err.println("存在错误:下标范围不对");
		}
		int newl=length-1;
		length=newl;
		Object[] newArr=new Object[length];
		int j=0;
		for(int i=0;i<arrvalue.length;i++) {
			if(i!=size1) {
			newArr[j]=arrvalue[i];
			j++;
			}
		}
		size--;
		arrvalue=newArr;
		newArr=null;
		System.out.println("删除元素后:");
		test();
	}
	//删(元素)
	@Override
	public void sub2(Object value) {//删除所有值为value的元素
		for(int i=0;i<length;i++) {
			if(arrvalue[i]==value) {
				sub(i);
			}
		}
	}
	//查(下标)
	@Override
	public Object find(int size1) {//查找size1下标对应的元素值
		if(size1<0||size1>=length) {
			System.err.println("存在错误:下标范围不对");
		}
		return  arrvalue[size1];
	}
	//查(元素)
	@Override
		public void find2(Object value) {//查找值为value的下标
			for(int i=0;i<length;i++) {
				if(arrvalue[i]==value) {
					find(i);
				}
			}
		}
	//改(下标)
	@Override
	public void change(int size1,Object value) {//将size1下标的值改为value
		if(size1<0||size1>=length) {
			System.err.println("存在错误:下标范围不对");
		}
		arrvalue[size1]=value;
		System.out.println("修改元素后:");
		test();
	}
	//改(元素)
	@Override
	public void change2(Object value1,Object value2) {//将value1修改为value2
		for(int i=0;i<length;i++) {
			if(arrvalue[i]==value1) {
				arrvalue[i]=value2;
			}
		}
	}
	
	//排序
	public void Sort(){
	        for(int i = 0; i<arrvalue.length; i++) {//冒泡排序
	             for (int j = i+1; j<arrvalue.length; j++) {
	            	 int x=arrvalue[i].hashCode();//计算哈希值
	            	 int y=arrvalue[j].hashCode();
	                if(x>y) {
	                   Object temp = arrvalue[i];
	                   arrvalue[i] = arrvalue[j];
	                   arrvalue[j] = temp;
	                }
	             }
	          }
	        System.out.println("排序后:");
	        test();
		}
	//输出结果
	public void test() {
		System.out.println(Arrays.toString(arrvalue));
	}
}

4.泛型

类型限制是在创建对象时限制操作的类型。为了要存储的元素/变量可以灵活指定数据类型,引入了泛型。
格式:<英文字母>
如:
泛型方法:类名后添加泛型标识(<T…>),来表示该类持有的一种类型。
泛型理解:当代码相同,输入的数据会用到不同的类型时,可以用泛型(往往是一个英文字母)来替换数据类型,但是在使用时要指定类型,泛型其实可以理解为模板。泛型与通配符的区别是泛型是具体类型,而把通配符<?>是未知类型。所以,如果要对参数做修改的操作就必须要使用泛型,而仅仅查看则使用通配符。
使用泛型后代码:
接口:

public interface List<E> {
   public void initList();
   public void growl();
   public void add(E value);
   public void sub(int size1);
   public void sub2(E value);
   public E find(int size1);
   public void find2(E value);
   public void change(int size1,E value);
   public void change2(E value1,E value2);
   public void Sort();
}
import java.util.Arrays;
/**
* 属性:
* length:长度
* size:个数:从一开始;下标:从零开始
* arrvalue:数组;  Object是所有类的父类
* dflength:默认长度
*/
public class Example1<E> implements List<E>{
   int size;
   int length;
   Object[] arrvalue;
   final int dflength=20;
   public int getSize() {
   	return size;
   }
   public int getLength() {
   	return length;
   }
   //初始化
   public Example1() {
   	length=dflength;
   	arrvalue=new Object[length];
   	size=0;
   }
   @Override
   public void initList() {
   	length=dflength;
   	arrvalue=new Object[length];
   	size=0;
   }
   //初始化长度
   public Example1(int l) {
   	if(l<0) {
   		System.err.println("存在错误:长度参数小于零");
   	}
   	if(l>=Integer.MAX_VALUE) {
   		System.err.println("存在错误:长度参数大于上限");
   	}
   	if(l<=dflength) {
   		initList();
   	}
   	if(l>dflength) {
   		length=l;
   		arrvalue=new Object[length];
   		size=0;
   	}
   	System.out.println("初始化长度成功");
   }
   //扩容
   @Override
   public void growl() {
   	int oldl=length;
   	int newl=(oldl>>1)+oldl;
   	length=newl;
   	Object[] newArr=new Object[length];		
   	//System.out.println("扩容后长度:"+length);
   	for(int i=0;i<arrvalue.length;i++) {
   		newArr[i]=arrvalue[i];
   	}
   	arrvalue=newArr;
   	newArr=null;
   	System.out.println("扩容后长度:"+getLength());
       System.out.println("扩容后元素个数:"+getSize());
   }
   //增(添加元素)
   @Override
   public void add(E value) {
   	//size越界时
   	if(size>=length){
           growl();
       }
   	arrvalue[size++]=value;
   	test();
   }
   //删(下标)
   @Override
   public void sub(int size1) {
   	if(size1<0||size1>=length) {
   		System.err.println("存在错误:下标范围不对");
   	}
   	int newl=length-1;
   	length=newl;
   	Object[] newArr=new Object[length];
   	int j=0;
   	for(int i=0;i<arrvalue.length;i++) {
   		if(i!=size1) {
   		newArr[j]=arrvalue[i];
   		j++;
   		}
   	}
   	size--;
   	arrvalue=newArr;
   	newArr=null;
   	System.out.println("删除元素后:");
   	test();
   }
   //删(元素)
   @Override
   public void sub2(E value) {
   	for(int i=0;i<length;i++) {
   		if(arrvalue[i]==value) {
   			sub(i);
   		}
   	}
   }
   //查(下标)
   @Override
   public E find(int size1) {
   	if(size1<0||size1>=length) {
   		System.err.println("存在错误:下标范围不对");
   	}
   	E e = (E)arrvalue[size1];//                                          (1)
   	return e;
   }


   //查(元素)
   @Override
   	public void find2(E value) {
   		for(int i=0;i<length;i++) {
   			if(arrvalue[i]==value) {
   				find(i);
   			}
   		}
   	}
   //改(下标)
   @Override
   public void change(int size1,E value) {
   	if(size1<0||size1>=length) {
   		System.err.println("存在错误:下标范围不对");
   	}
   	arrvalue[size1]=value;
   	System.out.println("修改元素后:");
   	test();
   }
   //改(元素)
   @Override
   public void change2(E value1,E value2) {
   	for(int i=0;i<length;i++) {
   		if(arrvalue[i]==value1) {
   			arrvalue[i]=value2;
   		}
   	}
   }
   
   //排序
   @Override
   public void Sort(){
           for(int i = 0; i<arrvalue.length; i++) {
                for (int j = i+1; j<arrvalue.length; j++) {
               	 int x=arrvalue[i].hashCode();
               	 int y=arrvalue[j].hashCode();
                   if(x>y) {
                      Object temp = arrvalue[i];
                      arrvalue[i] = arrvalue[j];
                      arrvalue[j] = temp;
                   }
                }
             }
           System.out.println("排序后:");
           test();
   	}
   public void test() {
   	System.out.println(Arrays.toString(arrvalue));
   }
}

问题:在代码(1)处,已经强制转换,仍有Type safety: Unchecked cast from Object to E提示,即类型安全:未选中从对象强制转换为E。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-08-20 14:57:12  更:2021-08-20 14:59:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/21 4:14:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码