❶ java語言中,數組的實現原理是什麼
這個涉及到編譯原理的問題,我只能說,這是一個編譯規范。在規范中比如:int[],中的int告訴計算機這是一個整型數據,[]告訴計算機這是一個連續存儲的內存地址空間,簡單點說一個連續數據的存儲空間就是數組,數組只是一個名稱!!當然我只是簡略的這樣說,實際上數組是很復雜的!!
❷ 怎麼用java數組實現約瑟夫環
用java數組實現約瑟夫環
packageJosephround;
publicclassJoseround{
intsit;
intflagjo=0;
Joseround(){};
Joseround(intx){
sit=x;
}
voidsetflag(intx){
flagjo=x;
}
}
packageJosephround;
publicclassInijose{
Joseroundjo[];
staticintlength=0;
Inijose(){};
Inijose(intx){
jo=newJoseround[x];
for(inti=0;i<x;i++){
jo[i]=newJoseround(i+1);//創建對象數組
length++;
}
}
voiddelete(intn){
for(inti=n;i<length-1;i++){
jo[i]=jo[i+1];
}
length--;
}
}
packageJosephround;
importjava.util.Scanner;
publicclassText{
publicstaticvoidmain(String[]args){
intm,n;
System.out.println("inputm");
Scannerm1=newScanner(System.in);
m=m1.nextInt();
System.out.println("inputn");
Scannern1=newScanner(System.in);
n=n1.nextInt();
inttemp=0;
intx=0;
Inijosejoseph=newInijose(n);
while(joseph.length!=0){
for(inti=1;i<=m;i++){
joseph.jo[x].setflag(i);
if(joseph.jo[x].flagjo==m){
System.out.println(joseph.jo[x].sit);
joseph.delete(x);
x--;
}
if(x<joseph.length-1)x++;
elsex=0;
}
}
}
}
❸ JAVA如何實現動態數組
動態數組用ArrayList 它的底層就是動態數組
ArrayList
ArrayList 集合的存取方式和數組操作很類似,可以按照index順序來存取集合中的元素,但是還是建議採用更通用的迭代器來進行ArrayList的遍歷。
ArrayList與數組最大的區別就是它是可變數組,在初始化ArrayList集合的時候,可以指定一個初始化容量(Capacity 集合中可容納元素的數量),不指定的時候,系統會指定一個默認的容量值。當我們向ArrayList集合添加元素的時候,實際上是存放元素數量(size)在不斷的增加,當容量不變,當數量增長到初始容量大小的時候,因為沒有空間導致元素添加阻塞,這時候該集合的容量會按照一定增長策略自動增長,容量增長後,可以繼續向集合中添加元素。可變數組是ArrayList的優點,但從另外一個角度考慮,容量的增長是需要付出額外的代價的,所以在性能上有所損失。性能問題的一種解決思路是我們可以在向集合添加大量元素之前,根據欲添加元素的數量,預先擴充容量,採用的是ensureCapacity方法。
ArrayList是一種線性表,在內存中是連續存儲的,適合於元素的隨機存取。添加和刪除操作是需要依據添加的位置來定,如果在ArrayList最後元素後面添加和刪除元素,在性能方面還算好,但是如果是在ArrayList中間添加和刪除元素的話,代價就會很大。因為,ArrayList需要維護整個集合元素的順序存儲,所以需要處理欲添加和刪除元素位置之後的所有元素。
ArrayList的實現不是線程安全的。也就是說,如果有多個線程同時操作ArrayList集合對象,而且其中至少有一個線程的操作涉及到集合對象中元素的修改(添加和刪除),則該線程內對集合對象操作的方法需要實現同步。這也是ArrayList與Vector的主要區別。在新的集合框架的實現上,基於性能的考慮,大部分的集合設計都是線程不安全的。如果有同步需求,在用戶自己的實現中可以實現同步,實現的方法有2種:
1、在操作集合對象的方法上使用synchronized關鍵字。
2、如果方法不可修改,則可在定義集合的時候,定義同步化的集合對象(採用Collections工具類的方法),類似:
List list = Collection.synchronizedList(new ArrayList(.....));
(此處深入說明下,在採用Iterator遍歷集合的時候,如果有其他線程修改了集合(添加或刪除操作),那麼Iterator的處理會中止並拋出異常,這是集合處理中的Fail-safe特性)
ArrayList提供的方法中,除了Collection和List的公用方法外,又加入了一些新的方法。
ArrayList(int initialCapacity) 構造器方法增加了集合初始化的最小容量
Void ensureCapacity(int minCapacity) 預擴充ArrayList的容量
Void trimToSize() 把集合的Capacity縮小到Size的大小
下面做一個ArrayList小例子:
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
/**
* @功能:ArrayList的應用小例子
* @author JackRui
* @時間:2009.03.31
*/
public class ArrayListDemo {
public static void main(String[] args) {
//利用ArrayList本身的特性
System.out.println("利用ArrayList本身的特性");
ArrayList list = new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.remove("bbb");
list.add("ddd");
for (int i=0,lsize=list.size();i<lsize;i++){
System.out.println(list.get(i));
}
//利用Iterator遍歷
System.out.println("利用Iterator遍歷");
Collection clist = new ArrayList();
clist.addAll(list);//添加元素不能採用Iterator介面
Iterator iter = clist.iterator();
while(iter.hasNext()){
String s = (String)iter.next();
if(s.equals("ddd")){
iter.remove();//可以通過Iterator介面對元素進行刪除
}else{
System.out.println(s);
}
}
//利用ListIterator遍歷
System.out.println("利用ListIterator遍歷");
List list2 = new ArrayList();
ListIterator lit = list2.listIterator();
if(!lit.hasNext()){
lit.add("haha");//可以通過ListIterator介面進行集合元素的添加
lit.previous();
System.out.println(lit.next());
}
}
}
運行結果如下:
利用ArrayList本身的特性
aaa
ccc
ddd
利用Iterator遍歷
aaa
ccc
利用ListIterator遍歷
haha
解析:3種方法中,第一種方法不通用,不建議使用。第2種方法最通用,但僅支持單向遍歷,而且對象的添加需要分開實現。第3種方法可以雙向遍歷,而且可以直接使用ListIterator介面來添加對象。
參考資料:http://fusanjiao.javaeye.com/blog/639963
希望能幫到您,O(∩_∩)O謝謝!
❹ java 用數組的方式接收用戶輸入的數 並輸出數組 求怎麼實現
publicclassUtil{
publicstaticvoidmain(String[] args){
java.util.Scannersc=newjava.util.Scanner(System.in);
String[] arr =newString[5];
for(inti =0; i < arr.length; i++){
arr[i] = sc.next();
}
//這里使用util.Arrays的代碼輸出數組
System.out.println(java.util.Arrays.toString(arr));
}
}
java中接受用戶輸入的其他方法
package 控制台接受輸入;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.Buffer;
import java.util.Scanner;
public class InputCode {
public static void main(String[] args) throws IOException {
/*
* Scanner類中的方法
* 完美
*/
Scanner input =new Scanner(System.in);
System.out.println("please input your name ");
String name=input.nextLine();
System.out.println(name);
/*
* 缺點:只能接受用戶輸入的一個字元
*/
System.out.println("enter your name");
char name1 = 0;
try {
//inputstream中的read()方法放回輸入流中下一個字元
name1 = (char) System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(name1);
/*
* InputStreamReader和BufferedReader方法
* 優點:可以獲取字元串
* 缺點:獲取的是int或者string人需要強轉
*/
//通常,Reader 所作的每個讀取請求都會導致對底層字元或位元組流進行相應的讀取請求。因此,建議用 BufferedReader
//包裝所有其 read() 操作可能開銷很高的 Reader(如 FileReader 和 InputStreamReader)。例如,
//BufferedReader in= new BufferedReader(new FileReader("foo.in"));
System.out.println("enter your name");
InputStreamReader input1=new InputStreamReader(System.in);
BufferedReader in=new BufferedReader(input1);
String name2=in.readLine();
System.out.println(name2);
}
}